03 · DATA SERVICES
Off the old system, without a bad week.
Migrations, ETL and the unglamorous middle.
The work nobody puts on a landing page: moving years of records between systems, keeping feeds honest, and proving the numbers match before anyone flips the switch.
WHAT WE TAKE ON
Boring on purpose. That’s the feature.
System migrations
Moving a business off the system it has outgrown: customers, history, balances and stored payment methods, with a plan for the week it happens.
ETL and pipelines
Feeds between the systems you keep: scheduled, observable, and owned by someone who answers when a number looks wrong.
Backfills and history
Rebuilding years of records from an API or an export, in chunks that can fail and resume without double counting.
Reconciliation and reporting
Proving two systems agree, row by row, and turning the result into numbers the owner can run the business on.
A REAL CUTOVER PLAN
How do we switch without a bad week?
These are the steps from the migration workflow in our pest-control case study, as written. The target: “The same customers on the same autopay, and a calm first week.”
The business requests the full data export and, in writing, the export of stored card and bank tokens to the new processor.
Imports customers, homes, contacts, plans, upcoming visits, history and balances, with a report of every row that didn’t map.
Dry runs: compare counts, spot-check accounts, fix mappings, repeat until clean.
Pilot: one technician runs real days in the app while the old system stays the record.
Cutover in a quiet week: final import, cards in place, the texting number live, and every customer welcomed to the new portal.
The old system stays read-only for history until the contract ends.
THE RULES WE RUN DATA WORK BY
Done means the numbers match.
- Re-running an import updates. It never duplicates.
- Dry runs first: compare counts, spot-check records, fix mappings, repeat until clean.
- Every row that didn’t map is in a report, not in a log nobody reads.
- The old system stays read-only for history. Nothing is burned on cutover day.
- Vocabulary is translated once, at the boundary, so the rest of the system never learns the old one.
- Money is integer cents, and every money row carries the processor’s id.
- Re-running an import updates, never duplicates.
- Everyone on autopay before cutover is on autopay after, or on a named follow-up list.
- Customers, active plans, upcoming visits and open balances match before go.
START WITH A CONVERSATION
Tell us what the business runs on today.
The tools, the workarounds, the things that fall through. We’ll tell you what we would build, what we would keep and what we would leave alone.
Start a conversationhello@codewrights.io