Understand integration

Deciding your system of record

Which system owns which field. Get this wrong and every integration you build afterwards fights the last one.

A system of record is the one system that is allowed to change a given field. Everywhere else that field is a copy. This sounds like a technical detail and is in fact the single decision that determines whether your integrations are boring or permanently on fire.

The symptom

You will recognise this before you recognise the cause. Somebody in the product team writes a proper description for article 4711-A: 600 words, application notes, the comparison that helps a buyer choose. Two days later it is back to FITTING 3/4 V4A 10BAR, the 40-character line the ERP uses on an invoice.

Nobody deleted it. The nightly ERP feed overwrote it, because the feed carries a description column and the import was configured to write every column it finds. The product team writes it again. It disappears again. After the third time they stop, and the catalog quietly reverts to what the ERP thinks a description is.

The same fight happens over units of measure, over tax classes, over customer addresses. In every case the cause is identical: two systems believe they own the same field, and the last writer wins.

The rule

For every field, exactly one system may write it. Everything else reads it.

Two consequences follow, and both are uncomfortable in practice:

  • A read-only copy must be visibly read-only. If a field is owned by the ERP, people must not be able to edit it in the Cockpit. Otherwise they will, their work will vanish overnight, and they will lose trust in the platform rather than in the process.
  • Ownership is per field, not per entity. "The ERP owns products" is too coarse and is where most projects go wrong. The ERP owns the SKU, the weight, the tax class and the purchase price of a product. It does not own the marketing description, the accessory relationships or the images.

The field-ownership table

This is the artefact worth producing. Do it on one page, with names on it, before you build anything. A realistic starting point for a B2B wholesaler running an ERP, with the Revenue Cloud as shop and PIM:

FieldOwnerFlowsWhy
SKU / article numberERPERP → CloudIt is the key everything else joins on. One issuer, always
EAN / GTINERPERP → CloudMaster data, and it appears on invoices
Manufacturer part numberERP or supplier feed→ CloudNeeded by procurement systems; must match the source
Base unit of measureERPERP → CloudThe unit orders are placed in. A second opinion here causes wrong quantities
Packaging unit / order quantity stepERPERP → CloudDrives what can actually be shipped
Weight, dimensionsERPERP → CloudShipping and customs need the same number the ERP uses
Tax classERPERP → CloudTax is an accounting fact, not a commerce decision
Purchase price, costERPStays in the ERPNever publish it. It has no business in the shop at all
List priceERPERP → CloudUsually. If the ERP does not carry a sales list price, the Cloud can own it; decide once
Customer-specific and contract priceERPRead liveNegotiated conditions live where the Vertrieb maintains them
Scale pricesERPERP → CloudSame source as the contract price, or they will disagree
Stock and availabilityWarehouse / ERPRead liveNever write stock in the shop
Product name (customer-facing)Cloud (PIM)Cloud → outThe ERP name is written for an invoice line rather than for a buyer
Description, long textCloud (PIM)Cloud → outThe field the ERP overwrites most often. Fence it
Technical attributesCloud (PIM) or supplier feed→ CloudStructured attributes are how buyers filter. The ERP has no place to hold them
Images, datasheets, drawingsCloud (PIM)Cloud → outThe shared drive is not a system of record
Categories, catalog structureCloud (PIM)Cloud → outShop navigation is a merchandising decision rather than an accounting one
Accessories, alternatives, cross-sellsCloud (PIM)Cloud → outSelling logic, owned by the people who sell
Channel assignment, assortmentsCloudCloud → outWhich customer sees what is a contract decision, maintained here
SEO fields, landing pagesCloudCloud → outOnly exists in the shop world
Customer numberERPERP → CloudThe key that ties an order to a debtor
Customer master: name, addresses, payment termsERPERP → CloudAccounting and dunning depend on it
Credit limit, blocked statusERPRead liveMust be current at checkout rather than from last night
Shop logins, roles, approval rulesCloudCloud onlyThe ERP has no concept of a shop login
OrderCloud, then ERPCloud → ERP, status backOwnership transfers at transmission. See below

Copy this into your own project and change it. The value lies in the argument your ERP team and your product team have while filling it in, which is much cheaper now than after go-live.

The test for a disputed field. Ask: if this value is wrong, who gets the call? If a wrong tax class means the Buchhaltung gets the call, the ERP owns it. If a wrong description means the product manager gets the call, the PIM owns it. Ownership follows responsibility, not convenience.

Handover: the order case

Orders are the one entity where ownership deliberately moves.

While a buyer is filling a cart and before transmission, the Revenue Cloud owns the order. Nothing in the ERP knows about it yet. At transmission, ownership passes: from that moment the ERP owns the order (its status, its deliveries, its invoices) and the Cloud shows a copy.

Get this wrong in either direction and it hurts. If both sides keep editing, you get a shop order that says "shipped" and an ERP order that says "in clarification". If neither side owns the post-transmission status, buyers phone to ask where their delivery is, which was one of the things the shop was supposed to stop. See The order lifecycle.

When the ERP is not actually the answer

"The ERP is führend" is the reflex in the German Mittelstand, and for transactional data it is right. But it is worth checking two cases:

You already run a PIM. Akeneo, Contentserv, inRiver. Then the PIM owns product information, the ERP owns commercial fields, and the Revenue Cloud is a consumer of both. The mistake here is enriching in two places; see How product information management works.

The ERP field exists but is not maintained. Plenty of ERPs have a Langtext field that is empty on 80% of articles, or a Warengruppe that was last thought about in 2009. A field that formally exists but is not maintained is not a system of record. Somebody has to be responsible for keeping it current, or ownership belongs elsewhere.

Making the decision stick

A table on a wiki page does not stop a nightly job from writing a column. Make it real:

  • Map only the fields the source owns. The strongest enforcement is mechanical: if description is not in the mapping, no import can overwrite it. See Field mapping.
  • Prefer "create only" over "always update" for fields you are unsure about. Let the ERP seed a name on a new article, and never touch it again.
  • Write the owner into the attribute description. The person editing needs to see "maintained in the ERP; changes here are overwritten" at the moment they are about to type.
  • Review after the first month. The fields people keep re-editing are the fields you assigned to the wrong owner.

Next