← Articles · Integrations

PIM Integration Patterns for Shopify at Scale

17 November 2025 · 4 min read

Product Information Management systems exist because spreadsheets stop working at scale. When you have a thousand products, each with descriptions in three languages, fifty attributes, images in multiple formats, and data that needs publishing to Shopify, a marketplace, and a print catalogue, managing that in Shopify's admin or a Google Sheet creates errors and costs time.

I've integrated Akeneo, Pimcore, and Salsify with Shopify. The PIM you choose matters less than how you integrate it. Here's what works.

The fundamental principle

The PIM is the source of truth for product data. Shopify is a consumer of that data. Changes to product titles, descriptions, images, metafields, and variant information should originate in the PIM and flow to Shopify. Not the other way around.

This sounds obvious, but I've seen setups where merchandisers edit product data in both the PIM and Shopify's admin, creating conflicts that the integration layer has to resolve. It doesn't resolve them well. Pick one direction and enforce it. Clear data ownership is one of the principles I outline in what I look for in a good ecommerce tech stack.

If your team needs to make quick changes in Shopify — adjusting a product title for a flash sale, for example — establish a process for syncing that change back to the PIM. Otherwise, the next PIM sync overwrites the change.

Push versus pull

Push model. The PIM detects changes and pushes them to Shopify via the Admin API. Akeneo's event system or Pimcore's workflows can trigger an export whenever a product is updated and marked as "complete" or "approved."

This gives you near-real-time updates and a clear trigger mechanism. The downside is that every PIM change results in an API call, and if someone is doing bulk edits in the PIM, you can hit Shopify's rate limits quickly.

Pull model. A middleware service periodically queries the PIM for changes since the last sync and pushes them to Shopify in batch. This is more resilient to rate limits and gives you a natural place for transformation logic.

I prefer the pull model for most implementations. A scheduled sync every 5 to 15 minutes with batch processing handles the majority of use cases and is significantly easier to monitor and debug than event-driven pushes.

Mapping the data model

This is where the work lives. PIMs and Shopify model product data differently.

Attributes to metafields. PIM attributes that don't map to native Shopify fields (title, description, vendor, product type) need storing as metafields. Define your metafield namespace and key naming conventions before you start building. I use the pattern custom.pim_{attribute_code} to make it clear which metafields are PIM-managed.

Product types and variants. Shopify's variant model is flat — up to three options (size, colour, material) with 100 variant combinations per product. If your PIM uses a more complex model with configurable attributes and child products, you'll need to flatten that structure during mapping.

Images. PIM-managed images should be pushed to Shopify with consistent alt text and position ordering. Shopify's Product Image API handles this, but you need to manage image updates carefully — detecting when an image has changed in the PIM (checksum comparison) rather than re-uploading all images on every sync.

Translations. For multi-market stores, the PIM should be feeding translated content per locale via Shopify's GraphQL Translation API. This is a separate API call from product creation and needs its own sync logic.

Handling deletions and unpublishing

What happens when a product is archived in the PIM? Does it get deleted from Shopify, unpublished, or left as-is?

My recommendation: unpublish rather than delete. Set the product's status to "draft" in Shopify. This preserves order history, URL redirects, and any metafield data. Actual deletion should be a manual, deliberate action.

Build a reconciliation report that shows products in the PIM that aren't in Shopify, and products in Shopify that aren't in the PIM. Run it weekly. It catches sync failures and orphaned products before they become customer-facing problems.

Practical architecture

For a mid-market brand (1,000 to 50,000 products, two to four markets), the architecture I typically recommend is:

  1. PIM manages all product content, attributes, and translations
  2. A middleware service (Node.js, Laravel, or Python) polls the PIM for changes on a schedule
  3. The middleware transforms PIM data to Shopify's format, handles metafield mapping and translation formatting
  4. Shopify's Admin API (GraphQL, preferably) receives the updates in batches
  5. A reconciliation job runs daily to catch drift

If you're also connecting an ERP alongside your PIM, my guide on choosing an ERP integration strategy for Shopify covers the complementary data flows. Keep the middleware stateful enough to know what it last synced. Store the last sync timestamp and the IDs of records processed. This lets you recover from failures by re-running from the last known good state.

The goal is a system where a merchandiser edits a product in the PIM, and within fifteen minutes, the change appears on every Shopify market with correct translations — without anyone touching Shopify's admin.

Need help with this?

If you're working on something related and could use an extra pair of hands, I'm available for project work. No obligation — just a conversation.

Get in touch →