Back to log
2026-05-02 · Reconciliation sweep

Active+Onboarding reconciliation sweep

After a stretch where the team kept editing Airtable while TruxFlow couldn't be touched, the gap had grown. This sweep pulled Airtable as the authoritative source for in-scope rows and brought TruxFlow back into alignment.

Why this was needed

Between the initial Apr 8 migration and this date, dispatchers continued working in Airtable — adding new documents, fixing fuel-card statuses, updating phone numbers, and onboarding/deactivating drivers. TruxFlow's data drifted out of sync. This sweep reconciled the two systems for the in-scope set.

Scope: Active+Onboarding for drivers and trucks; Active for trailers; all carriers. Owners and contractors were explicitly skipped due to known data-quality issues on Airtable.

Overall result

95
Documents merged into TruxFlow
56
Rows deactivated to mirror Airtable
36
Field updates applied (rule A)
~200
ID links written across both sides
0
Failures
5
Postgres dumps taken

Step 0 — ID mapping

Before any data movement, every TruxFlow record needed its Airtable counterpart's record ID, and every Airtable in-scope row needed the TruxFlow CUID. Two passes:

Final coverage: Drivers 36/37 (97%), Trucks 36/36 (100%), Trailers 46/49 (94%), Carriers 17/18 (94%).

Step 1 — Document merge

For each in-scope entity: download Airtable CDN URL → upload to Linode S3 → insert Document row. Defensive defaults: dedupe by (relatedId, type, fileName); new docs default to isActive=false so existing favorites stay favorites (only the very first doc of a type for a given entity becomes the active one).

EntityDocs addedNewly activeHistory only
Drivers33231
Trucks23617
Trailers392019
Total952867

Step 2 — Status mirror

For every TruxFlow row currently Active/Onboarding with an Airtable link, if the linked AT row was not Active/Onboarding, deactivate TruxFlow.

All matched what the team had already inactivated on Airtable. Guardrail: skipped rows with no AT link and rows on the "Archived" placeholder carrier.

Step 3 — Field merge (rule A)

Rule A: fill empty TruxFlow fields from Airtable, Airtable wins on both-populated conflicts, never wipe TruxFlow when Airtable is empty, ignore cosmetic differences.

Two normalizers added to suppress no-op conflicts:

EntityUpdatedNotable
Trucks2311 fuelCardStatus flips, 5 status overrides
Drivers10After type alias, real conflicts dropped 53 → 4
Carriers3Phone-number cleanups

Items that needed human attention afterwards

The merge couldn't auto-resolve everything. Surfaced the following for review:

Most of these were addressed in the May 3 link-integrity event the next day.

Safety measures