Back to log
2026-04-08 · Initial migration

Mass migration — Airtable → TruxFlow Safety module

First and largest migration. Brought every active carrier, driver, truck, trailer, contractor, and credential record into TruxFlow with all attached documents.

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

867
Total records migrated
1,900
Documents uploaded to S3
187
Driver/truck/trailer assignments
31
Credential sets

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

  1. Pulled every active record from each Airtable base via the REST API.
  2. Mapped Airtable fields to the corresponding TruxFlow Prisma models (canonical names, type coercion, choice-field normalization).
  3. Downloaded each attached document from Airtable's CDN, uploaded to Linode S3 under documents/<entity>/<trxId>/<TYPE>/, inserted matching Document rows in TruxFlow.
  4. 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