What happened
WeLink Cargo had been running operations on Airtable for years across multiple bases (carriers, units, drivers, trailers, recruiting, dispatch). The Safety module of TruxFlow was the first piece of the new SaaS to come online. This event was the one-shot migration that loaded every active Airtable record into TruxFlow as the new source of truth.
Records with no carrier link or no DOT# were intentionally skipped — they couldn't be mapped cleanly without manual review. Those were left in Airtable for later cleanup.
What landed
Per-entity breakdown
| Entity | Source table | Migrated | Documents | Skipped | Skip reason |
|---|---|---|---|---|---|
| Carriers | 4.1. Carriers — WeLink (tblzMTF3LeUAIOBUL) |
15 | 68 | 3 | No DOT# |
| Trucks | 2.2. Units Base (tblav6peuPlIwP8wg) |
117 | 592 | 105 | No carrier link |
| Drivers | 2.1. Drivers Base (tbldwlXQlfx1qwRDP) |
131 | 892 | 109 | No carrier link |
| Trailers | 2.5. Trailers Base (tblwGQQ9EomlBiM25) |
37 | 122 | 40 | No carrier link |
How the migration worked
- Pulled every active record from each Airtable base via the REST API.
- Mapped Airtable fields to the corresponding TruxFlow Prisma models (canonical names, type coercion, choice-field normalization).
- Downloaded each attached document from Airtable's CDN, uploaded to Linode S3 under
documents/<entity>/<trxId>/<TYPE>/, inserted matchingDocumentrows in TruxFlow. - Built driver/truck/trailer assignment links from the recruiting Airtable's "Match" relationships.
Skipped records weren't deleted — they remained in Airtable, and were the input for the later reconciliation sweeps as the team filled in their carrier links.
What this established
- TruxFlow's Safety module became the canonical store for active operations.
- Document URLs migrated from Airtable's expiring CDN links to durable Linode S3 paths.
- The two-system gap began: Airtable continued operational dispatch, TruxFlow held the safety/compliance authoritative record.