A write that succeeds isn't the same as a correct write. An integration can send a valid request, get a clean response, and still leave the wrong value in the record. Nothing errors, because from the integration's point of view, nothing went wrong.
This post separates the three ways that happen. Only one of them needs two systems writing at the same moment. The other two can happen minutes apart, or with a single system doing all the writing. They look alike from the outside, but each has its own root cause and its own fix, so it's worth knowing which one you're dealing with.
What happens
The agent's update is gone. The job's request was valid, Airtable accepted it, and nothing flags that a newer value was replaced.
Root cause
The write carried a value that was correct when it was read and outdated by the time it landed. Nothing compared the two. The same thing happens when a retried request arrives after a newer update has already been applied.
How much gets overwritten depends partly on how the write is made. In Airtable's API, a PATCH request updates only the fields included in the request, while a PUT request performs a destructive update and clears every field it doesn't include. Either way, a job that sends back fields it never changed is overwriting values it has no reason to touch.
The fix
Writes that arrive in the wrong order are a related but separate problem, covered in out-of-order updates.
How to test for it
In a sandbox, start the job, edit one of the fields it reads while it's still running, and confirm the edit survives once the job finishes.
What happens
Every later update now lands on one of the two copies. Reports split across them, and nothing logged an error.
Root cause
The match ran on an unstable key. Names and emails get retyped, reformatted, and changed, and any difference produces a miss. The automatic insert then turned a harmless miss into a new record.
Airtable's API behaves the same way when used for upserts. An upsert matches incoming records on one to three fields named in fieldsToMergeOn. If no existing record matches, a new one is created. If one matches, it's updated. If more than one matches, the request fails. Merging on a name field carries the same duplicate risk as any name-based match. Merging on a stable ID field doesn't. The failure on multiple matches also has a use: if exact duplicates already exist, for example from a create that fired twice, upserts against them fail instead of guessing which copy to update.
The fix
The duplicate case is covered in full in why your integrations create duplicates.
How to test for it
In a sandbox CRM, duplicate a contact, so the copy has the same name and details but its own CRM ID. Send an update for the original, then for the copy. The original's update should change its matching Airtable record. The copy's update should change nothing in Airtable and land in the review step. If the copy's update changes the original's Airtable record, the integration is matching on something other than the CRM's ID, such as the name. If it creates a new record, the update and create flows aren't separate.
What happens
If the two writes had arrived in the opposite order, the result would have been the opposite value. The outcome depends on arrival order, not on which value is correct.
Root cause
Two systems can write the same field, and nothing decides which one should win. Two systems have write access to the same field, and no rule says whose value should stand. Airtable applies each valid write as it arrives, so the field holds whichever came last. Neither system is malfunctioning: each sends a value that's correct from its own point of view, and each gets a success response. Without a rule deciding between them, arrival order decides instead, and neither system is told that its value was replaced.
The fix
Choose one of three approaches, in order of preference:
Between Airtable bases, InAir's guide to Parent and Child Ownership Models applies the single-writer approach. The child base doesn't edit the master record directly. Its change is synced back to the parent base, where an automation writes the new value to the master record.
How to test for it
In a sandbox, send two conflicting writes to the same field a second apart, then repeat with the order reversed. If the final value changes with the order, the field has no rule deciding the outcome.
The three cases often get lumped together as "sync problems," but the symptoms point to different causes.
These are the three ways a successful write still leaves an incorrect record, as set out in the comparison of connectivity and orchestration in InAir's guide to running Airtable inside complex system landscapes. Concurrent collisions trace back to one gap: no written rule for which system owns a field. Ownership is one of the two containment factors in InAir's Integration Load framework. Stale overwrites are partly an ownership problem, when a process sends back fields it doesn't own, and partly an ordering problem, when a write arrives late. Duplicates are a matching problem, which an ownership rule on its own doesn't fix.
Apart from the upsert failure once exact duplicates exist, none of the three shows up in an error log. The tests above are how you find out whether they're already happening.
If you want to know which of the three are already in your data and fix them without interrupting the syncs that are running, Schedule a Discovery Call with InAir, and we'll trace them with you.