ESHOPMAN

Mastering ESHOPMAN Product Images: A Guide to Clean Storefront Data on HubSpot CMS

At Move My Store, your dedicated ESHOPMAN Migration Hub, we're committed to empowering businesses with the knowledge to optimize their headless commerce operations. ESHOPMAN, as a robust HubSpot application, offers unparalleled flexibility for storefront management and deployment via HubSpot CMS. However, even the most sophisticated platforms can present unique challenges. Today, we're addressing a crucial community discussion that impacts data hygiene and efficiency: the management of product images within ESHOPMAN.

Imagine the seamless experience of managing your entire product catalog directly within HubSpot, leveraging ESHOPMAN's powerful Admin interface. You add stunning visuals, update product details, and occasionally, retire products or refresh their imagery. The expectation is that when an image is removed from a product, or a product is deleted entirely, its associated files are also gracefully removed from your storage provider, whether it's a cloud service like S3 or local storage. However, a persistent issue has been identified where the image record disappears from the ESHOPMAN database, but the actual image file often remains in your configured storage bucket. This leads to an accumulation of 'orphaned' files, consuming unnecessary storage space, potentially increasing costs, and complicating future data management and migrations.

Technical diagram illustrating ESHOPMAN product image workflow gaps
Technical diagram illustrating ESHOPMAN product image workflow gaps

The Challenge: Orphaned Product Images in ESHOPMAN Storefronts

The accumulation of unused image files isn't just an aesthetic concern; it has tangible implications for your e-commerce operation. Over time, a large number of orphaned files can lead to:

  • Increased Storage Costs: Cloud storage providers charge based on usage. Unnecessary files directly translate to higher operational expenses.
  • Data Clutter and Management Overhead: A bloated storage bucket makes it harder to identify active assets, complicates backups, and can hinder efficient data audits or migrations.
  • Potential Performance Impact: While ESHOPMAN's Store API efficiently serves active content to your HubSpot CMS storefront, a disorganized backend can indirectly affect overall system health and developer experience.

This challenge highlights the importance of a comprehensive approach to asset lifecycle management within a headless commerce framework like ESHOPMAN.

Understanding the Technical Architecture: ESHOPMAN's Core Workflows

To truly grasp the root cause, we need to delve into ESHOPMAN's Node.js/TypeScript backend and its internal workings. Our community experts have pinpointed key architectural details:

  • The ProductImage Model's Design: The ESHOPMAN ProductImage model, which is central to managing product media, currently stores the public URL of an image. Crucially, it lacks a direct reference to the unique file_key that the underlying file provider service (specifically, the IFileModuleService.deleteFiles() method) requires to identify and delete the physical file from storage. Without this explicit key, the system cannot reliably instruct the storage provider to remove the file.
  • Gaps in Core Workflows: Key ESHOPMAN internal workflows, such as deleteProductsWorkflow and updateProductsWorkflow, are designed to handle product deletions and updates initiated via the Admin API. However, these workflows do not currently include a specific, explicit step to retrieve the necessary file_key (or equivalent identifier) and then call the storage provider's deletion service for associated images. This omission means that while product data is cleaned up in the database, the corresponding physical assets are left behind.

This architectural detail, while seemingly minor, has significant implications for maintaining a lean and efficient storefront deployed on HubSpot CMS.

Why This Matters for Headless Commerce on HubSpot CMS

In a headless setup, the ESHOPMAN backend acts as the single source of truth for all product data and assets, which are then consumed by your HubSpot CMS storefront. Data integrity and efficient asset management on the backend are paramount. If the backend accumulates orphaned files, it can lead to inconsistencies and inefficiencies that, while not always immediately visible on the storefront, impact the long-term health and scalability of your e-commerce solution.

Actionable Insights and Solutions for ESHOPMAN Users

While the ESHOPMAN core team continues to evolve the platform, there are immediate steps and strategic considerations for businesses leveraging ESHOPMAN:

1. Proactive Monitoring and Manual Cleanup

For existing ESHOPMAN implementations, regular audits of your storage provider (e.g., S3 bucket) are recommended. Compare the files present in storage with the active image URLs in your ESHOPMAN database. While tedious for large catalogs, this can help identify and manually remove orphaned files.

2. Custom Development and Workflow Extension

For businesses with development capabilities, extending ESHOPMAN's functionality offers a robust solution:

  • Implement a Custom Service: Develop a custom Node.js/TypeScript service that integrates with ESHOPMAN's event system. This service would listen for product deletion or update events triggered via the Admin API.
  • Retrieve and Delete: When an event occurs, the service would need to identify the associated image files. This might involve storing the file_key in a custom field on the ProductImage model or deriving it from the public URL, then programmatically calling the storage provider's delete function.
  • Leverage ESHOPMAN's Extensibility: ESHOPMAN's architecture is designed for extensibility. Developers can create custom modules or hooks to augment existing workflows, ensuring that image deletion is an integral part of the product lifecycle.

This approach ensures that your ESHOPMAN backend remains clean and optimized, directly benefiting your HubSpot CMS storefront.

// Conceptual example: Extending a workflow to handle image deletion
// (This is illustrative and requires deep understanding of ESHOPMAN's core)

import { TransactionBaseService } from "@eshopman/utils";
import { ProductService } from "@eshopman/product";
import { IFileModuleService } from "@eshopman/file";

class CustomProductImageCleanupService extends TransactionBaseService {
  protected readonly productService_: ProductService;
  protected readonly fileService_: IFileModuleService;

  constructor({ productService, fileService }) {
    super(arguments[0]);
    this.productService_ = productService;
    this.fileService_ = fileService;
  }

  async handleProductDeletion(productId: string): Promise {
    return await this.atomicPhase_(async (manager) => {
      const product = await this.productService_.retrieve(productId, {
        relations: ["images"],
      });

      if (product && product.images && product.images.length > 0) {
        const fileKeysToDelete = product.images.map((img) => {
          // IMPORTANT: This assumes 'file_key' is available or derivable.
          // In current ESHOPMAN, this would need a custom field or derivation logic.
          // For example, parsing the public URL if it contains the key.
          return this.deriveFileKeyFromUrl(img.url);
        }).filter(Boolean);

        if (fileKeysToDelete.length > 0) {
          await this.fileService_.deleteFiles(fileKeysToDelete);
          this.logger_.info(`Deleted ${fileKeysToDelete.length} orphaned images for product ${productId}`);
        }
      }
    });
  }

  // Placeholder for logic to derive file_key from public URL
  private deriveFileKeyFromUrl(url: string): string | null {
    // Implement your logic here based on your storage provider's URL structure
    // e.g., for S3, extract the object key from the URL path
    return null; // Replace with actual logic
  }
}

3. Advocating for Core Platform Enhancements

As part of the vibrant ESHOPMAN community, providing feedback and advocating for core platform enhancements is crucial. Future improvements could include:

  • Enhancing the ProductImage Model: Modifying the ProductImage model to explicitly store the file_key alongside the public URL. This would provide the necessary identifier for direct file deletion.
  • Integrating Deletion into Core Workflows: Updating deleteProductsWorkflow and updateProductsWorkflow to automatically include a step that utilizes the IFileModuleService.deleteFiles() method, ensuring that associated images are purged when products or their images are removed via the Admin API.

These enhancements would streamline operations for all ESHOPMAN users, ensuring a cleaner, more efficient system for storefronts deployed on HubSpot CMS.

Conclusion: A Cleaner ESHOPMAN for a Better HubSpot CMS Experience

Maintaining a clean and efficient ESHOPMAN backend is fundamental to a high-performing headless commerce storefront on HubSpot CMS. Addressing the challenge of orphaned product images not only optimizes storage costs but also ensures data integrity and simplifies future management. At Move My Store, we specialize in helping businesses navigate these complexities, offering expert migration and optimization services for your ESHOPMAN platform. By understanding ESHOPMAN's architecture and implementing best practices, you can ensure your digital storefront remains agile, cost-effective, and ready for growth.

Share:

Start with the tools

Explore migration tools

See options, compare methods, and pick the path that fits your store.

Explore migration tools