Sebastiano Druda

← Back to writing

Field note / Digital Systems & Commerce

One Product, Five Marketplaces, Fifty Different Rules

Multi-channel commerce is an integration problem: shared product facts meet different schemas, publication states and failure modes that need explicit handling.

A product does not become five identical listings merely because the business wants to sell it in five places.

The shared object might be the same, but its representation is negotiated with each channel. Categories, identifiers, required attributes and publication steps enter the conversation. So do the less visible questions: which update succeeded, which one is still being processed and which destination now shows an outdated price?

The numbers in this title are shorthand for that multiplication of concerns, not an audited count of platform rules. My experience with marketplace operations is the context; the integration design below is a proposal, with illustrative failure scenarios rather than disclosures about a particular employer or supplier.

What interests me is how quickly commerce work starts looking like distributed systems work. There is no single moment when changing the internal catalogue guarantees that every external representation has changed with it.

Share product facts without erasing channel differences

The starting point is an internal catalogue model that represents what the operation knows about a product. That might include identity, variation relationships, dimensions with units, descriptions and the inputs used to derive commercial values.

The model should not simply copy the schema of the first marketplace integrated. Otherwise, the second channel inherits assumptions that were accidental consequences of the first. A field that is convenient for one destination can become an awkward compromise everywhere else.

At the same time, a universal model that anticipates every possible channel can become a project of its own. Start with the shared facts actually needed, then allow explicit channel-specific extensions where the meaning genuinely differs.

The distinction is important: shared facts belong in the catalogue, while a channel’s category mapping or publication policy belongs near its adapter. Duplicating the same product description in every integration makes a routine correction harder to apply consistently.

That work depends on reliable product information upstream. An adapter cannot recover the meaning of an ambiguous supplier value just by changing its field name.

Read the destination’s model before writing the mapping

Two official examples show why I would not assume that every channel accepts a similar product payload. Amazon’s Product Type Definitions API exposes product-type attribute and data requirements using JSON Schema. eBay’s Inventory API distinguishes inventory items from offers; an offer is created and then published, with associations such as marketplace, inventory location and category.

Those are specific documented models, checked for this article. They are not a claim that every marketplace works like Amazon or eBay, or that the same requirements apply to every category and account.

For channels such as ManoMano, Cdiscount or Leroy Merlin, I would verify the current integration contract available to the seller rather than infer requirements from another platform. Naming a marketplace is not enough to establish its schema, commercial rules or access conditions.

A mapping should therefore record the destination, the applicable category or product type, the transformation and any assumptions. If a field cannot be mapped confidently, the mapping should surface the uncertainty instead of silently selecting a plausible value.

Make the adapter a boundary you can test

I want a channel adapter to accept a clear internal representation and produce a destination-specific request or file. Its responsibilities should be narrow enough that a change in one marketplace does not require rewriting the catalogue itself.

For an illustrative product, I would test a normal record, a variation, a missing required attribute and a value that cannot be represented in the destination. Expected failures are part of the contract. Returning an incomplete payload and hoping the remote service rejects it helpfully is a weak substitute for local validation.

The adapter should preserve useful provenance. If a category is wrong, the error report should identify the mapping decision that produced it. If a required value is absent, it should point to the internal field or unresolved enrichment step.

Product facts and publication intent deserve separate treatment. Having a complete record does not necessarily mean the business wants it visible in every channel. An explicit publishing decision prevents a new integration from accidentally becoming an instruction to list the entire catalogue.

This boundary can be implemented modestly. A set of well-tested transformations may be enough before there is any reason to introduce separate services.

A successful request is one observation

Imagine a hypothetical batch updating one product in several channels. One destination confirms the update. Another rejects a required attribute. A third accepts the request but exposes the result only after processing. A fourth connection times out before the client receives a response.

Calling the batch “failed” loses useful detail. Calling it “successful” is worse. A more useful record tracks state per product and channel, with a link to the attempted operation and the last confirmed external state.

A small state model might distinguish pending, submitted, confirmed and rejected work. The exact names are less important than the meaning of each transition. “Submitted” should not quietly become synonymous with “visible to buyers.”

A timeout deserves particular care because it can leave the outcome unknown. The request may never have arrived, or it may have succeeded before the response was lost. The next action should follow the API’s documented behavior, including available lookup or reconciliation mechanisms.

An integration needs to represent uncertainty, not flatten it into a green or red badge.

Retries need a reason

Classify errors before retrying them. A missing required attribute will not repair itself because the same payload is sent again. A temporary connectivity failure may justify another attempt. An authorization problem may require operator action rather than repeated traffic.

HTTP’s definition of idempotent methods concerns the intended effect of repeated identical requests. It is a useful foundation, but I would still inspect the particular API operation before deciding how to retry it. A transport method name alone is not a complete recovery strategy for a multi-step publication workflow.

Where the destination supports an operation identifier or idempotency mechanism, the integration should use it according to that contract. Where it does not, I would consider whether reading the remote state can resolve an uncertain outcome before another write.

Retry queues also need limits and visibility. Otherwise, an invalid record can remain in circulation while newer updates accumulate behind it. Unresolved work needs an owner, a reason and enough context to correct or cancel it safely.

The goal is not to make failure disappear. It is to make the next action understandable.

Reconciliation is how you discover drift

Even a careful event flow can benefit from comparing intended state with observed external state. A manual change, an old failed operation or a delayed update can leave the catalogue and a listing disagreeing.

Reconciliation should focus on fields that matter to the operation, with explicit freshness expectations. Stock and price may need different treatment from descriptive copy. The business should decide how stale each can be before intervention is required.

For stock, the model must identify which system owns availability and how orders, reservations and corrections affect it. Publishing the same raw number everywhere without understanding those relationships can create a misleading impression of consistency.

For price, the rule and input version used to derive the proposed value should remain available. If a later operation is already queued, an older retry should not overwrite it simply because it finally succeeds. Version checks or equivalent ordering controls need to be designed around the destination’s capabilities.

These are proposed safeguards, not claims that every API offers the same concurrency controls. When the provider’s model limits what can be guaranteed, that limitation belongs in the operating procedure.

Give operators a useful explanation

A good error screen would tell me which product and channel are affected, what was attempted, what the destination reported and what action is available. “Synchronization error” tells me almost nothing.

Logs should not expose unnecessary customer or supplier data. The useful diagnostic record is the smallest one that allows the issue to be understood and replayed appropriately. Credentials have no place in it.

There should also be a deliberate response to a channel outage. Perhaps updates queue while other channels continue. Perhaps a critical inconsistency requires pausing a particular listing. That is a business decision supported by engineering, not a default that should emerge from an exception handler.

A product can be shared across channels without pretending its publication is one indivisible action. Once I treat each destination as a system with its own contract, state and failure modes, the integration becomes easier to reason about. The storefronts may look similar. The work that keeps them consistent needs to acknowledge where they differ.

Sources

  1. Amazon: Product Type Definitions API — checked 2026-10-11
  2. eBay: Inventory API Overview — checked 2026-10-11
  3. RFC 9110: Idempotent Methods — checked 2026-10-11

Topics

55 / Essay

Integration Bugs Live Between Systems

Integration failures emerge from timing and conflicting assumptions. Design for retries, duplicate delivery, partial updates and evidence across boundaries.

system integration · 7 min