SYNC SYSTEMS INTEGRATION / FIELD SERVICES SYNC LAYER CRM JOB BOARD ERP / STOCK VENDOR BILL FIELD
DRAFT NOTE — REMOVE BEFORE PUBLISHING.
Verified against ClickUp, Systematics and Drive records: all system counts, dates, architecture details and both client quotes.
Placeholder figures pending confirmation: hours recovered per month, inventory count speed, ERP licence cost avoided, and the "100%" and "3 → 1" stat cards.
Open gates before publish: (1) written consent from Scott Boeckner; (2) reconciliation of the client revenue figure; (3) a decision on related-party disclosure.
Systems Integration Field Services GoHighLevel JobTread Odoo n8n Inventory

Creative Coatings is a family-owned epoxy and polyaspartic flooring contractor working out of Minnesota, pouring floors for garages, dairies, fire halls and industrial plants since 2010. By the middle of 2025 the company had every piece of software a growing contractor is told to buy: a CRM for the sales pipeline, a construction platform for jobs and budgets, an ERP for inventory, and an accounting package underneath it all.

None of them talked to each other. The integration was a person.

Step 01

A business that ran on re-typing

Before any code was written, we timed the actual motions. A lead came into the CRM. Somebody keyed the customer into the job platform. Somebody moved the opportunity when the crew moved. Somebody reconciled the two on Friday when the numbers disagreed. Every one of those steps was a person doing a computer's job, and none of them were fast.

MotionCost per occurrenceFrequency
Lead capture and contact creation5–10 minPer contact
Opportunity stage update2–5 minSeveral times per deal
Re-keying customer and job into the job platform10–15 minPer job
Ongoing status sync between systems5 minSeveral times per project
Data cleanup and reconciliationSeveral hoursPer week

Materials were worse. Every product existed three times — once in the job platform's catalog, once in the ERP, once in accounting — and each copy was maintained by hand. The ERP the company was already paying for was being used at roughly ten to twenty percent of its inventory capability, because keeping it accurate cost more than ignoring it.

The owner's own framing of the problem, from an early call, was not about software at all:

Emails track in those projects. Certificate of insurance comes in, it needs to automatically go to our insurance agent. Basic stuff. But it takes time. Scott Boeckner, Owner, Creative Coatings
Step 02

Pick one source of truth, then defend it

The first architecture we shipped tried to keep both platforms authoritative and let changes flow in either direction. It worked until two people touched the same record, and then it fought itself. In May 2026 we pivoted deliberately and wrote the rule down: the CRM is the source of truth for customers and opportunities. The job platform reads stages back and nothing else.

That single decision collapsed most of the ambiguity. Three orchestration workflows now carry the whole contract — contact to account, opportunity to location and job, and job update back to CRM stage — running on a self-hosted n8n instance rather than a per-task automation vendor.

Stage mapping was the part nobody expects to be hard. The pipeline has thirteen named stages from New Lead through Completed Closed. Twelve map one-to-one onto the job platform. Three — Appointment Set, Proposal Signed and Ask for a Review — exist only on the sales side, because they describe things that happen before or after a job exists. Rather than invent fake job states to force symmetry, we documented the asymmetry and taught the sync to leave those stages alone.

The undocumented API problem. The job platform exposes a proprietary query language rather than REST, with no published schema. Part of the engagement was writing the reference documentation for it — including the discovery that its pagination cursor is returned as nextPage but only accepted as page. Under 96 rows the bug is invisible. On a job with 133 cost items, every paginated query returns a 400.
Step 03

The migration, and the mess it exposed

Turning the sync on meant first reconciling several years of divergent history. This was run as a scripted migration with verification at every step, not a bulk import and a hope.

471
Jobs migrated into the CRM pipeline, zero errors
$5.98M
Total job value carried across intact
406
Opportunities linked by job, customer and location ID — zero unmatched

Of the contacts involved, 172 were already correctly linked, 204 matched by name, and 95 were genuinely new records that had never existed on the sales side. Every one of the 406 opportunity statuses was remapped and verified — 66 open, 135 won, 205 lost — giving the owner the first honest win-rate number the business had ever had.

The migration also produced garbage, and we cleaned it rather than leaving it: 104 ghost jobs created by a workflow misfire during the import, 35 orphan accounts, 104 orphan locations with null addresses, and 7 stage mismatches. Job count was restored to exactly 406 with zero pre-existing records affected.

Step 04

Inventory that exists in one place

Rather than buy an enterprise ERP licence, we stood up Odoo 18 Community on a single cloud droplet — Docker Compose, PostgreSQL, Nginx, automatic TLS — running Inventory, Purchase, Sales, CRM, Invoicing and Project, with a paid barcode module bolted on. The client owns the server, the database and the credentials.

Then we filled it properly. 419 products across 7 categories, 28 custom units of measure built to match how coatings are actually bought and used, and roughly 30 vendors verified or created. EAN-13 barcodes were generated for 405 inventory items on an internal 200-prefix range, printed to sheets, and mapped to physical storage — including three job trailers modelled as distinct stock locations alongside the warehouse.

The workflow that came out of it is the part the crew notices. A proposal gets approved; a pick list is created automatically. The crew scans what actually went on the truck. At end of job they scan what came back. Stock levels stop being a guess.

Before

  • Products maintained by hand in three systems
  • Stock levels estimated from memory
  • Trailer contents unknown until someone looked
  • ERP used at 10–20% of capability

After

  • One catalog, 419 items, synced downstream
  • Barcode scan in and out of every location
  • Warehouse and three trailers tracked separately
  • Pick lists generated on proposal approval

Alongside it, the job platform's own estimating catalog was rebuilt from the ground up: 25 cost-group templates standardised to a single margin, square-footage formulas replaced with parent-quantity references so nested assemblies stopped double-counting, the polishing system rebuilt from a five-step grit structure to a three-step one, and colour selection split out from base cost so flake was no longer counted twice.

Step 05

The form the crew actually uses

The most-used thing we built for Creative Coatings is also the least glamorous: a material usage form, written in Vue and Quasar because a crew lead fills it out on a phone standing on a slab, not at a desk.

It reads the job's real budget from the job platform, lets the crew record what they used against the correct cost group, allows searching the catalog for unbudgeted items, and writes a draft vendor bill. Draft, deliberately — the tool produces the accounting artifact, a human approves it. Field input to bookable document with nothing re-typed in between.

Getting it right took real debugging. An early version linked material lines to a proposal's copy of a cost item rather than the root budget row, which meant actual costs landed in the wrong column and the owner could not see what a job had really consumed. Version 2.0 relinked every line to the root budget item. A later release fixed the pagination fault and a cost-group read that pulled from proposals instead of the live budget.

Adoption, measured rather than assumed. At 14:17 on 22 July 2026 — hours after the fix shipped — the owner submitted a real material usage bill through the form: 33 line items totalling $17,314.31 across 5 cost groups and multiple phases. All 33 lines resolved to root budget rows. Nobody was asked to test it.
Step 06

What broke, and what we did about it

Two systems writing to each other will eventually mistake their own echo for a human. On 30 June 2026 that happened: two opportunities looped between platforms for roughly two hours and forty-five minutes before rate limiting stopped it on its own. No duplicate job records were created, but the cause mattered more than the damage.

Neither system could distinguish a change made by a person from a change made by the sync. Webhook delivery had drifted about two minutes behind, so the middleware was always comparing against stale state. Two stage changes thirty seconds apart were enough to set it off.

The fix was to give the sync its own identity — a dedicated API key, filtered out of the triggers that would otherwise react to it. Changes now propagate in under twenty seconds in both directions and stop cleanly with no echo.

A second class of failure came from duplicated jobs carrying a stale opportunity ID, causing the sync to skip records it thought already existed. Nineteen jobs had never synced; thirteen real ones were recovered and the duplication path was fixed so each copy now creates its own opportunity. Both incidents were written up and handed to the client as briefings rather than quietly patched.

Step 07

Where it landed

Twelve months in, Creative Coatings runs on systems that agree with each other. The sales pipeline is authoritative, the job platform is fed rather than typed into, inventory reflects what is physically on the shelf and in the trailers, and the crew's material usage becomes an accounting document without a single re-entry.

62
Hours of manual data entry recovered per month
100%
Of job records re-keyed by hand — eliminated
3 → 1
Systems requiring manual product maintenance
4.5x
Faster inventory count at period close
$14K
Annual ERP licence cost avoided by self-hosting
<20s
Record propagation between systems

The engagement is ongoing. A forecasting engine that reads approved proposals, nets required materials against on-hand stock and drafts purchase orders grouped by vendor is in build — driven by a supply reality the owner named plainly: some coatings ship from Germany on a two-to-three week lead time, and a late order slips a job.

I think it's working great so far. Thanks a lot. Scott Boeckner, Owner, Creative Coatings — on the material usage form, 28 July 2026

The most useful thing the owner said, though, was not about his own company:

Seven contractors I'm connected with that are using the same platform have the exact same frustrations. Scott Boeckner, Owner, Creative Coatings

That is the pattern. Owner-operated trades businesses buy good software and then discover that the integration between it is a person — usually the person who can least afford to be one. The work is not replacing the tools. It is building the connective tissue the tools assume already exists, and then staying on to run it.