A few weeks after the builder who set up a company's Airtable landscape, and who was also its workspace Owner, moved to another team, their account was deactivated as part of routine offboarding.
The signs were there, though not all in one place: the synced customer table showed a warning that it couldn’t sync from its source, the automations with Slack steps authenticated through that person’s account started failing because the app was no longer connected, and the CRM records that used to arrive through their personal access token stopped appearing, with the rejected requests visible only in the CRM’s own logs.
But the ops team worked only in interfaces, where the customer table still showed every customer it already held and the dashboards built on it still showed numbers. Hence, it took a sales manager asking why a new customer was missing before anyone noticed the sync had stopped updating on the day the account went.
Nobody on the team knew the sync was created under that person's account because nothing written down said so. That's the job of an integration handoff package: the documentation a team receives when someone hands over an Airtable system connected to other tools, whether that someone is an outside partner finishing a project or an internal builder moving to another role.
InAir has written about why internal builders become the bottleneck at scale. The handoff package is how what that person knows becomes something the team can work from. It isn't a tour of every table and field. It answers the questions a team will face the first time something changes or fails, and points to where the detail lives. This post covers its six sections and ends with a test that shows whether the package is complete.
The first section lists every connection into and out of the base: base-to-base syncs, syncs from external sources, integrations that write through the API, webhooks, automations that send to other systems, and tools someone connected by signing in with Airtable. For each one, it records what it reads, what it writes, and who owns it.
|
Column |
What it records |
|---|---|
|
Connection |
A name the team will recognize, such as "CRM customers into Airtable" |
|
Type |
Base sync, external sync, API integration, webhook, outbound automation, or OAuth-connected tool |
|
Reads |
The tables, views or fields it takes from the base |
|
Writes |
The tables and fields it changes, and whether it creates records |
|
Runs as |
The account it uses: a person, a dedicated integration user, or a service account |
|
Business owner |
The person who decides what it should do |
|
Technical owner |
The person who fixes it when it doesn't |
|
Configured in |
Where its settings live: the base, a Make scenario, a serverless function, the other system |
"Runs as" is the column that's easiest to leave blank, and section 6 depends on it.
Most of this list can come from the system boundary map drawn before the build, checked against what was actually built. If no record was ever kept, InAir's post on unmapped architecture covers how to reconstruct one from tokens, webhooks, syncs, and middleware, since Airtable's Metadata API describes a base's schema but not the bases that sync from it or the tools that read it through the API. A list written at handoff goes out of date with the next connection someone adds, so the package should hand it over as a living record rather than a document. Keeping it current after handoff is the subject of the integration registry.
For every field that more than one system touches, the package names the system whose value is correct. That decision was made field by field in the boundary map, and the package carries it over with one addition the receiving team needs.
|
Field |
Final say |
Other writers |
Rule when they disagree |
How it's enforced |
|---|---|---|---|---|
|
Billing Contact Email |
CRM |
None, since Airtable's copy is locked |
n/a |
By permission: field editing is restricted to the CRM integration's account, which nothing else writes as |
|
Delivery Lead |
Airtable |
None |
n/a |
By configuration: the CRM integration sends it out but never maps it inbound |
|
Account Tier |
ERP |
Account managers editing Airtable's copy |
When the two values differ, the integration doesn’t overwrite Airtable’s copy but flags the record for Finance, who either updates the ERP or corrects Airtable |
By configuration, then agreement: the integration flags differences instead of overwriting them, and finance reviews the flagged records every week |
The rule for fields that still have two writers comes over from the map as it is, so nobody has to rediscover why one value overwrites the other. The addition is the last column. A rule enforced by a field permission or by how an integration is configured keeps holding after the builder leaves, while a rule enforced by agreement holds only as long as everyone remembers it, so the receiving team should know which of their rules are which.
A business rule is a value or condition the system acts on: the discount above which a deal needs review, the status that sends an order to finance, the number of days before a record is archived. The package lists each one and the single place it's set, so a change is made there and nowhere else.
|
Rule |
Where it's set |
Who can change it |
Read by |
|---|---|---|---|
|
Deals above 15% discount need review |
Settings table, Discount Threshold record field |
Sales operations lead |
Needs Review formula, approval automation, CRM integration |
|
Orders go to finance when approved |
Trigger condition on the Send to Finance automation |
Base creators |
Send to Finance automation |
|
Closed projects archive after 90 days |
Archive Due formula field |
Base creators |
Archive automation's trigger view |
Rules that live in a settings table, read by formulas through a linked record and by integrations through the API, are the easiest to hand over, and centralizing business rules in Airtable covers how to set one up. Rules that live in a view filter need a warning in the package. An automation triggered when a record enters a view depends on that view's filter, so someone tidying up the view changes what the automation does without opening it. Where a rule still has copies in other tools, such as the same threshold typed into a Zapier filter, the package lists every copy until they're gone.
This section answers four questions for each connection: where failures are recorded, which failures retry on their own, who is told, and what that person does next.
Where failures are recorded. An automation’s run history shows failed and successful runs, and a failed run can be rerun from there, but the rerun uses the same inputs and configuration as the original run, so this feature doesn't always solve the problem, not to mention the risks of re-running an automation on outdated data. A safer option is to trigger the automation again by recreating its trigger conditions
Which failures retry on their own. A 429 rate-limit response should be retried after a 30-second wait, and a brief outage on Airtable's side retried with backoff, while a payload Airtable rejects as invalid won't succeed many times; however, it's resent. The package records what each integration actually does with each kind of failure, using the classification in retry logic for Airtable integrations. If an integration retries everything, or nothing, the package says so.
Who is told. Airtable sends failure emails for each automation to that automation's subscriber list. According to Airtable's documentation on managing automations, "Up to 10 subscribers can be added per automation," and "Only users or service accounts with workspace owner or base creator access can be added to the subscriber list." Whoever turns an automation on after creating it, or deploys a change to it by clicking Update, is subscribed automatically.
That makes the departing builder likely to be on every list for every automation they built, and possibly the only name on many of them. Once they’re gone, an automation with no subscribers left sends its failure emails to all workspace Owners, who may not know what it does or who should act on it.
The package records who is on each list today and who should be after handoff, and the receiving team updates the lists before the builder's last day. An automation must also be on to send failure emails, so one switched off during the handoff alerts no one. A person without workspace owner or base creator access can't be subscribed directly.
Otherwise, the alert has to be built, for example, as a script step that notifies them directly, and the package says which automations have one. A script that catches its own error without throwing it again stops the run from showing as failed in run history, so it should also write the failure to a log the team checks.
What they do next. A short runbook per connection, written for the person who receives the alert. For an API integration, it might cover three cases:
Each runbook ends with who to escalate to, by role, if the first steps don't resolve it.
The receiving team will change the system. The package gives them a short checklist to run first, the same for a field, an automation, or a connection.
This section is easy to leave out, because nothing fails until the account is gone. Airtable’s guide to transferring ownership before leaving a company lists what stops when an Owner’s account is deactivated: automations that reach external systems, synced tables the Owner created, and syncs from external sources the Owner set up, and it recommends building integrations on a service account instead. As the opening example shows, a stopped sync keeps the data it already had, so a team that works only in interfaces can miss the warning in the base until a record that should be there isn’t.
The package lists every connection whose “Runs as” column in section 1 names the Owner, along with what moves each one off the Owner’s account before they leave, because tokens, syncs, and sign-ins keep running on the account that set them up.
|
What runs on a person's account |
What Airtable says happens when the account is deactivated |
What moves it
|
|---|---|---|
|
Integrated automations, which call external services or use personal access tokens |
They fail |
Reconnect the trigger and action steps to an account that belongs to no individual, and in script steps, replace the personal access token or other API credentials with ones issued to that account |
|
Failure notifications for native automations |
They default to the deactivated Owner |
Update the subscriber list as in section 4 before the account is deactivated, since an automation left with no subscribers sends its failure emails to all workspace Owners |
|
Base-to-base synced tables the Owner created |
They stop updating, and their existing data stays |
A collaborator with access to both bases takes over the sync and reconnects it |
|
Synced tables from external sources |
The sync stops updating |
Reconnect it under a service account or dedicated integration user, as the guide recommends, with an external-system login that belongs to no individual |
|
Personal access tokens and OAuth-connected tools, such as a Make or n8n connection |
The guide covers tokens only as part of integrated automations, and each token or OAuth connection authenticates as the person who created it |
Create a replacement on a service account or dedicated integration user, switch the integration over, then revoke the old one |
Service accounts are available on Enterprise Scale. On other plans, a dedicated integration user that belongs to no individual does the same job. Either way, move a connection before the builder's account is deactivated, not after, so each one can be tested on its new account while the person who built it can still answer questions.
A package is complete when someone who didn't build the system can work from it alone. To find out, give the receiving team three realistic situations and ask them to resolve each one using only the package, with the builder in the room but not answering.
|
Situation |
What the team should work out from the package |
Sections used
|
|---|---|---|
|
The CRM integration that updates customers failed overnight, and 40 customers changed in the CRM since its last successful run |
Where the failure is recorded, whether it will retry on its own, who was alerted, what the error means, whether the account it runs on still has access, and whether the next successful run will pick up the 40 changes |
1, 4, 6 |
|
Sales wants to rename the Proposal option in the deal Stage field to Quote |
What reads that option by name, including integrations outside the base, which system has the final say on Stage, who has to hear, and where to test the rename first |
1, 2, 3, 5 |
|
Marketing wants a BI tool to read deals from the base |
Which account and token it should use, which tables it needs, given that a read token can reach every table and field its account can see in the bases it's granted, and where the new connection gets recorded |
1, 6 |
Each question the team can't answer, or answers by asking the builder, is a gap in the package. Write the answer in, then run the situation again. Run the test while the builder is still around to fill those gaps, which for an internal builder means before their last day on the system, and for an outside partner means before the project closes.
The more systems a base connects to, the more this package has to carry. InAir's guide to running Airtable inside complex, high-volume system landscapes calls this Integration Load and shows how to assess it.
If your Airtable system depends on one person's knowledge, or you're about to take one over, Schedule a Discovery Call with InAir.