Shopify–Odoo Integration · intermediate · 9 min read
Managing Images and Media
Product image sync between Odoo and Shopify: ownership rules, URL vs binary transfer, rate limits, retries, and avoiding catalog job bottlenecks.
Last reviewed 2026-07-30 · Estimated effort: 2–6 weeks typical implementation slice
Table of contents
Image sync is often the slowest catalog job: large binaries, strict API rate limits, and naive full-gallery re-uploads on every product update.
Strong approaches declare media master (usually Shopify for customer-facing galleries or Odoo for SKU-first brands), prefer URL or staged upload patterns over inline base64 loops, sync images in dedicated low-priority queues, and track content hashes to skip unchanged files.
Separate media jobs from core product field sync so a hero image retry does not block inventory or order processing.
Teams underestimate media until the first full catalog push times out overnight. Treat images as a first-class integration domain with its own queues, budgets, and idempotency rules.
This article covers ERP connector media strategy — not Shopify theme image sizing or CDN configuration for storefront performance.
Decide which system owns primary product imagery. Fashion and DTC brands often master in Shopify or a DAM and reference URLs into Odoo for warehouse apps. Manufacturers may master in Odoo and publish outward to Shopify on approve.
Scope which images sync: primary only, full gallery, variant-specific images, and whether PDF spec sheets or safety sheets belong in the same pipeline.
URL references avoid double storage when Odoo can store external URLs and Shopify already hosts CDN assets. Upload jobs are needed when Odoo binary fields are master — use staged uploads or multipart APIs rather than embedding large payloads in product update calls.
Track file hash or etag per image to skip re-upload when product sync fires on unrelated field changes.
- ▸Dedicated media queue with lower priority than orders
- ▸Chunked or batched uploads with backoff on 429 responses
- ▸Variant-level image mapping table when colors have distinct photos
Gallery position matters for merchandising. Preserve sort order explicitly rather than relying on API default ordering. Alt text and accessibility fields may sync when SEO teams master metadata in one system.
Associate variant images correctly — mismatched variant photos drive returns and support tickets more than wrong descriptions.
A product update should succeed even if image three of five fails — record per-asset status and retry failed assets independently. Operators need a dashboard of products with incomplete media sync.
Large backfills run off-hours with rate-limit budgets shared with other catalog jobs — coordinate with inventory reconciliation windows.
- ✓Run media sync in a separate queue from product field updates.
- ✓Hash or fingerprint images to avoid redundant uploads.
- ✓Cap concurrent media workers to respect Shopify API budgets.
- ✓Define primary-image-only mode for initial go-live, gallery later.
- ✓Log per-asset outcomes so support can retry one image without full product replay.
- ✓Read rate limit guidance before scheduling nightly full-gallery sweeps.
- !Re-uploading entire galleries on every minor product title change.
- !Embedding large binaries in synchronous product update RPC calls.
- !Sharing one rate-limit budget between media backfill and order import.
- !Ignoring variant-level image mapping and showing wrong color photos.
- !Failing entire product sync when one broken URL returns 404.
- !Storing duplicate full-resolution copies in Odoo when URL reference suffices.
Media sync needs ownership rules, hash-aware retries, and isolated queues — otherwise it becomes the bottleneck that starves orders and stock updates.
Pair media jobs with API limit strategy before running large catalog backfills.
Master change
SKU / price / media updated.
Map fields
Transform to channel schema.
Push / pull
API call with idempotency.
Reconcile
Detect drift and exceptions.
Enqueue
Job created with payload.
Worker pick
Claim with visibility timeout.
Process
Idempotent handler.
Ack / retry
Success or backoff.
API client
Gateway / auth
Odoo controllers / RPC
Database
- clientgw
- gwodoo
- odoodb
Frequently asked questions
Should Odoo store product images at all?
Often yes for warehouse and internal apps, but not always as master binary. URL fields or lightweight thumbnails may suffice when Shopify hosts customer-facing assets.
How do we handle image updates after go-live?
Trigger targeted media jobs when image fields change, detected by hash diff — not full catalog reprocessing.
Do videos and 3D media belong in the same sync?
Scope separately. Video and model media use different APIs and size limits — treat as optional phase-two unless merchandising requires day-one parity.
Related articles
Product Synchronization Best Practices
How to sync Shopify products and Odoo catalog records: SKU masters, variants, barcodes, attributes, external IDs, and conflict rules without silent duplicates.
View →Handling API Limits and Retries
Shopify and Odoo API rate limits, backoff strategies, idempotent retries, error classification, and priority budgets for integration workers.
View →Queue Management for High-Volume Stores
Durable queues, workers, priority lanes, and observability for Shopify–Odoo sync at scale — beyond synchronous webhook processing.
View →Testing an Ecommerce Integration
Structured UAT for Shopify–Odoo sync: staging stores, idempotency tests, partial fulfillments, failure injection, reconciliation validation, and go-live gates.
View →Related services
Shopify–Odoo Integration
Architecture, connectors, and operational sync for Shopify storefronts and Odoo ERP.
View →Python Backend Development
Middleware workers, queues, and APIs beside Odoo when the connector needs a service layer.
View →Dedicated Odoo Developer
Reserved capacity for connector fixes, mapping changes, and backlog.
View →Catalog sync stalling on images?
We separate media pipelines, tune batch sizes, and add retry visibility so product data keeps moving.
