Sync rules are contracts, not defaults

The software industry has a concept called a data contract. It comes from data engineering, and the idea is simple. When two systems exchange data, the agreement about what gets sent, in what format, with what guarantees, should be explicit and enforced. Not implicit. Not assumed. Not whatever the default in the integration tool happens to be. A contract.

Marketing ops doesn’t use this language, but it should. Because every field that syncs between two systems in your marketing stack is a small data contract, whether you wrote it down or not. The HubSpot-to-Salesforce field map is a contract. The Salesforce-to-data-warehouse pipeline is a contract. The Outreach-to-CRM activity sync is a contract. Each one has terms: who owns the truth, what happens when both sides have a value, how often the sync runs, what gets logged when it fails.

Most marketing teams treat these contracts as defaults. The integration tool offers a dropdown with four options, someone picks one during implementation, and it never gets revisited. That is not contract-writing. That is contract-accepting, which is what people do at the bottom of a software license they didn’t read.

I’ve written elsewhere about what happened to me when an attribution sync rule was set to “prefer Salesforce unless blank” four years ago and never re-examined. The specific failure was that last-touch attribution silently became first-touch. The general failure was that the integration was working exactly as configured, and the configuration was wrong, and nobody noticed because nobody had treated the sync rule as a decision worth documenting.

The shift from defaults to contracts changes how you do this work. Here is what it looks like in practice.

Every synced field needs a written answer to four questions. Which system owns the truth for this field. What the sync rule is and why. What happens when both systems have a conflicting value. Who gets notified if the sync fails. If you can’t answer those four questions for a field, you don’t have a contract. You have a guess that’s been running in production.

The sync rule should be chosen from the field’s purpose, not the integration’s default. A field that captures something that should never change after it’s first set, like a first-touch source or a created date, needs “prefer the source system, never overwrite.” A field that captures the most recent state of something, like a last activity date or a current lifecycle stage, needs the system most likely to have the recent update to win. A field that’s edited by humans in both systems, like a contact’s job title, needs the most-recent-update rule. These are different contracts for different purposes. The default in most integration tools is to apply the same rule to every field, which is how you get bugs that look like attribution problems but are actually contract problems.

Sync failures need to be observable. A contract that nobody can tell when it’s been violated isn’t a contract. It’s a wish. Most marketing teams have no monitoring on their sync layer at all. Failed syncs sit in a log that nobody reads. Silent overwrites don’t even produce a log. The minimum bar is: someone gets a notification when a sync fails repeatedly, and someone reviews the sync error log on a recurring cadence. The higher bar is: spot-check a sample of records every month to confirm the data is what the contract says it should be.

Contracts need owners. Every synced field should have a person whose job it is to decide if the contract is still right. Not “the marketing ops team.” A person. Because contracts drift. The business changes, the data changes, the systems change, and a rule that was correct in 2022 may be wrong in 2026. Without an owner, the rule that was set once stays set forever, and you find out it’s wrong four years later, in the worst possible way.

The reason this language matters is that it changes the conversation you have with your CRM admin or your data engineer. “What’s the sync rule for this field” sounds like a configuration question. “What’s the contract for this field” sounds like a design question. The first one gets answered by someone clicking through a settings panel. The second one gets answered by someone thinking about what the field is for and what should happen to it.

If you treat your sync layer as a set of contracts, you start writing them down, reviewing them, and updating them. If you treat it as a set of defaults, you let an integration tool make decisions about your data that you would never let a colleague make without a meeting.

Look at your sync layer this week. Ask what contracts you have. The ones you can’t articulate are the ones that are about to fail.