Skip to content

Implementation and migration

A two-way accounting sync that refuses to guess

Receivables, payables and timesheets sync both ways on a fifteen-minute cycle. Every rule that could round, merge or classify a dollar is written down and refuses to guess.

Built for
SMT Research, Vancouver
Service line
Implementation and migration
Window
Jun to Sep 2026
Milestone
Live both directions 2026-07-21
The headline number16%Of live invoice lines carried unsafe decimal precision21 of 135 lines replayed. Caught at the accounting boundary, with no Salesforce field narrowed.

01Key numbers

What we measured

21 / 135Replayed invoice lines with more than four decimal placesFrom division and floating-point noise. Measured on live synced lines, not on synthetic test data.
5,905 / 5,945Classed invoice lines covered by fully qualified name matchingAcross the whole invoice history. The remaining 40 throw rather than guess.
95.1%Classification accuracy on the auto-creation previewMeasured on a 140-order corpus. The feature is built and deliberately switched off pending sign-off.
14 to 18sRound trip for a real seven-line invoiceOn-demand path. The scheduled path runs on a fifteen-minute cron.

02The situation

What was true before

Invoices, bills and timesheets were rekeyed between Salesforce and the accounting system by hand. The same seven-line invoice existed twice, and the two copies drifted.

The chart of accounts reuses six leaf names across regions, so any lookup by name matched three rows at once and filed every region’s revenue under one of them.

Contact us to find out more

Recognise this in your own org?

03What we built

The mechanism

Tokens live outside Salesforce. The in-org button only queues work, and a hosted runner executes it.

A four-decimal cap at the boundary only

Two enforcement layers trim precision as data leaves for the accounting system. No Salesforce field was narrowed, because the platform data is not wrong. The single exclusion is the exchange rate, and the reason is stated: it is not an amount, and trimming it would move a $5,000 bill by about 21 cents.

Line consolidation that only combines identical things

Lines merge only when location, product, description, unit price, discount, tax rate and class all match, because the company reuses one product code for customer-specific configurations. A combined line is emitted only when it still balances. Either way the invoice is worth precisely what it was worth.

Class resolution that throws instead of guessing

Resolution matches the fully qualified account name first and accepts a bare leaf only when it is unique. Otherwise it throws. A wrong region on a revenue line is worse than a failed sync, because a failed sync is visible.

Payables linked rather than duplicated

3,169 bills carry purchase-order style document numbers keyed by hand. A reconciliation sweep found 34 completed purchase orders missing from the accounting system and linked 30 that had already been keyed manually, stamping a drift note wherever totals differed by more than two cents.

1Quote accepted
2Create order and lines
3Carry the tax code across
4One location and work order per segment
5Raise intake tasks from config
6Fault path: show the real errorAdded
Depiction · The quote-to-order conversion, as rebuilt. Eleven create and update steps, each with a fault path.It had no fault handling at all, so a failed conversion crashed silently and the salesperson could only report that it did not work. The error screen is why they can now say what went wrong.

Surfaces built

We will demonstrate any of these live, on the real org,.

  • Queue record showing sync state and last heartbeatImage withheld
  • Drift note stamped on a payables linkImage withheld
  • Read-only preview package for the auto-creation featureImage withheld
The finding

The integration ran on a laptop, and one day it stopped without saying so.

On 23 July 2026 the scheduled job stopped for about twelve hours. It loaded, exited with code zero, and raised no error, so roughly fifty cycles were missed while accounting queued invoices and watched nothing happen. It now runs on hosted infrastructure with a heartbeat object and an hourly watchdog. If it stops again you get told, not the controller.

04Outcome

What changed, verified

Both directions have been live since 21 July 2026, with the parts that could get a number wrong deliberately held back.

  • Receivables, payables and timesheets sync on a fifteen-minute cycle with an on-demand path.
  • Automatic creation of customers and projects is built and switched off, pending the controller’s sign-off.
  • A read-only preview command generates the verification package she needs to give that sign-off.
  • Silence is now an alert rather than an absence.
How it was verified

Precision handling was validated by replaying 135 live synced invoice lines rather than by writing new test cases.

Sources
  • docs/research/01-salesforce-platform.md §2.5 · QuickBooks integration
  • docs/research/01-salesforce-platform.md §5 · Pull quotes

Keep reading

Two more

All case studies
  • Implementation and migration
    0Failed records across 16 archive objects1,553 sales orders, 8,478 order lines, 3,438 purchase orders, 2,862 invoices and 14,889 stock movements loaded.

    An ERP retired without losing a transaction

    Sixteen archive objects populated with zero failures, and two phantom invoices caught and removed before they touched a live record.

  • Implementation and migration
    395Of inventory value made visible for the first time395 priced SKUs in the warehouse, plus stock on job sites. Priced stock only.

    Where the inventory value actually is

    One question drove the whole design: where is the inventory value now. The answer required a state machine, an audit trail on every movement, and an honest note about two parallel ledgers.

Next step

Bring us your hardest Salesforce problem

Tell us what is broken. You get a written read on it within one business day, before any money changes hands.

  • Reply within one business day
  • Live walkthrough of the org itself
  • Vancouver, British Columbia