Don’t Duplicate the System of Record

Every field in a business has exactly one system that owns it, meaning the place where a change to it is authoritative. When you build something new, the shortcut is to copy that data in so the new system stands on its own. The copy drifts, and you get two answers to one question with no rule for which wins. The discipline is deciding, field by field, whether the new system owns the value, points at it, or freezes it.

The failure that shows up months after launch

Two systems answer the same question and neither is wrong

The accounting package has one billing address for the customer. The new job system has another. Both were right the day they were entered. Nobody changed the wrong one; one was simply never told about the update.

Nobody wrote down which side wins

A sync gets set up because both systems need the customer list. Then somebody edits a name in the new system, and whether that edit travels back has no documented answer. Whatever the connector happens to do becomes policy by accident.

Two-way sync becomes a permanent obligation

Bidirectional syncing looks safe because nobody has to change where they work. It creates conflicts that need rules, and those rules need maintenance whenever either system changes a field. You have not integrated two systems. You have taken on a third.

The copied list quietly stops matching

Cost codes, service items, and account numbers get pulled in once during the build. Months later three have been retired and two added. The dropdown still shows the old set, so entries post against codes accounting no longer recognizes.

A routine update rewrites history

A customer changes their billing address. A sync refreshes every record referencing that customer, including invoices issued two years ago. Those documents now show an address that was not on them when they were sent.

Own it, point at it, or freeze it

Three storage decisions cover nearly everything. Hold the value because you own it. Point at whoever owns it and read the current value on demand. Or freeze a copy, because the value was acted on and must never change again.

Where a shared value should liveThe storage decisions available for a field in a new system, and what each one is for.Each shared fieldOwn itThis system holds the value, because it has the edit screen for it.Point at itStore the owner's identifier and read the current value when it is displayed.Freeze itThe value was acted on, so the copy is kept with the rule version behind it.
Storing a live value as an ordinary copy gets the worst of both.
DataWho owns itWhat the new system should holdWhat it should point atWhat copying it costs you
Customer identity and contact detailsThe accounting package or CRM, whichever has the edit screenThe owner’s customer identifier, nothing elseName, address, and terms, read when displayedTwo spellings of one customer, and mail sent where they no longer are
Chart of accounts and cost codesThe accounting systemThe code identifier chosen on each transactionThe list of codes, read at selection timeRetired codes still on the menu, and entries that post to nothing
Current price of a service or itemThe pricing rules or the item listNothingThe live price when a quote is assembledQuotes issued at last quarter’s prices, with no way to date the drift
The price charged on an issued documentThe new system, once it issues the documentThe number, frozen, with the rule version behind itNothing at allA reissued invoice that no longer matches what the customer agreed to
Employee roster and pay ratesThe payroll or HR systemThe employee identifier and whether they are assignableName, rate, and employment statusA departed employee still schedulable, and two rate tables that disagree
Job or project listWhichever system opens the job firstThe job identifier, plus fields only this system capturesJob name, address, and lifecycle statusOne job under two numbers, with cost landing on neither
Documents this system collected itselfThe new systemThe file, its version, its dates, and who accepted itNothingNothing goes wrong here; this is data the new system genuinely owns
Tax rate applied to a closed transactionA tax service or the accounting systemThe rate applied, frozen with the transactionThe current rate, read when the calculation runsA rate change that silently restates what old transactions were taxed at
Rows four, seven and eight carry the point. Live values must be referenced. Values already acted on must be frozen. Storing a live value as an ordinary copy gets the worst of both: it goes stale, and when it updates it rewrites the past.

Questions that settle ownership before anyone writes code

Ask where the edit screen is

Whichever system has the interface where a human changes the value is the system that owns it. That test beats asking which system is bigger or came first. If two systems both have an edit screen for one field, that is the actual problem, and no integration design fixes it.

Separate a reference from a snapshot

A reference is a pointer. It says go and ask, and shows whatever the owner says today. A snapshot is a frozen record of the value at one moment, stored because a decision was made on it. The two look identical in a database and behave in opposite ways.

Store identifiers, never labels

The identifier survives a rename, a merge, and the correction of somebody’s typo. The label does not. Systems that match on customer name work perfectly until somebody fixes a spelling, at which point the link breaks silently and records go on being created.

Make every sync one-directional and say which way

One writer per field, stated so a non-technical person can check it: the accounting system owns customer contact details and the job system displays them. If somebody wants to edit that field in the job system, move the edit screen rather than adding a return path.

Plan for the copy you cannot avoid

Sometimes you hold a copy because the owner cannot be queried or the network is not always there. That is fine, provided the copy shows when it was last read. Decide as well what happens when the owner is unreachable: block, proceed with a marked last-known value, or queue the work. Stale data that admits it is stale is manageable.

Where this decision usually gets made

Is this a fit for your business?

A good fit when

  • You are adding a system alongside an accounting package, CRM, or field app that already holds customer data
  • Two teams already quote different numbers from different screens for the same record
  • An auditor, insurer, or customer may ask what a record said on a specific date
  • You are being sold a two-way sync and nobody has explained what happens on conflict

Probably not a fit when

  • Everything runs in one system and nothing is being added alongside it
  • The second system is a read-only reporting copy that nothing writes back from
  • You are still choosing a platform, which makes ownership a question for later

What to have ready

  • A list of the systems people log into weekly, including the spreadsheets
  • For each shared field, who changes it and on which screen
  • Any question you have already been asked about what a record looked like in the past

Questions we get asked

Our accounting system has no usable interface for reading data. Does that change the answer?

It changes the mechanism, not the ownership. The accounting system still owns the field, so the new system must not become a second place to edit it. Hold a cached copy, stamp it with the time it was last read, and refresh on a schedule you chose. The copy stays read-only.

Is referencing slower than storing a local copy?

Usually yes, and it matters less often than people expect. It bites on list views with hundreds of rows and on field screens with a weak connection. For those, cache the display value and reference the identifier, so a stale name is cosmetic while the link underneath stays correct.

What if two systems both legitimately need to edit the same field?

Then you have an unresolved process question rather than an integration problem, and software will not settle it. Somebody has to decide which team owns that field. If the honest answer is both, split it into two fields with different owners, which is what the process was doing informally.

We already have the same data in four systems. Where do we start?

Start with fields that appear on a customer-facing document, because that is where disagreement costs you credibility. Name an owner for each, turn every other instance into a read-only display of that owner, and leave historical copies frozen. Do not reconcile the past; stop adding to it.

Does this mean a reporting warehouse or data copy is wrong?

No, and this is the exception worth knowing. A warehouse is a derived copy that nobody edits and nothing writes back from. It cannot become a second source of truth because it has no edit screen. The rule is about authority, not about whether bytes are duplicated.

Related


Tell us what the process looks like now and we will map what a system would need to do. No obligation, and you keep the map either way.

Leave a Comment

Scroll to Top