Solution — Construction

Job costing that starts at the truck, not at month end.

A receipt is only a cost when it lands on the right job, in the right account, with the photo attached. So the capture happens where the spending happens: a QR sticker inside the truck, a 4-digit PIN, a photo, a total. From there it posts to QuickBooks tagged to the job, and the job is the same object as your QuickBooks customer and your Autodesk Construction Cloud project. Built with a sports-construction firm running real job sites.

1job = QBO customer + ACC project

QRin every truck, PIN to identify

Hourlysync, ledgered, never double-posts

0auto-posted AI receipts — a human approves

01 — One job, three systems

QuickBooks Autodesk integration that doesn't guess

Every job here carries two links: a QuickBooks customer and an Autodesk Construction Cloud project. That mapping is what makes the rest possible — costs post against the customer the accountant already invoices from, and the same job shows up in the field system the superintendent already lives in.

The link can be made three ways. You can import projects directly from Autodesk, which creates the jobs without needing a QuickBooks customer first (archived projects come in unticked). You can create the job here and push it to Autodesk. Or you can let the hourly auto-link pass pair Autodesk projects with QuickBooks customers by normalised name and find-or-create the job for you. When two names are close enough to be ambiguous, it does not pick one — the candidates land on the Integrations screen as suggestions you apply with a click. A guessed job mapping is worse than no mapping, because nobody audits a number that already looks right.

Expense sync runs one way: QuickBooks to Autodesk, hourly. It's ledgered and marked before the push, so a retry can't post twice, and a cost that can't be matched to a project is surfaced on screen, never dropped silently. Invoices come the other way as a read-only mirror — QuickBooks invoices pulled hourly onto the job so the field can see what's been billed. Manual invoice entry only exists for teams that haven't connected QuickBooks at all. We don't write invoices into your accounting system; that's the bookkeeper's job and she does it better.

02 — Coding

Categories, classes, and vendor rules

The chart of accounts your bookkeeper prints out is the category list, and the "codes" she tags with are QuickBooks classes. Both are modelled, and the resolution order is fixed so the same receipt always codes the same way.

  • Spend categories map to real accountsYour categories are listed in the portal and mapped to QuickBooks accounts by the owner. Until they're mapped, receipts fall back to the single expense account the tenant was already using — connecting coding never breaks a working setup.
  • Vendor rules, longest match winsA vendor-name fragment maps to a category. When two rules both match, the longer fragment wins — so a general "fuel" rule never beats a specific chain. Seeded with the big-box, rental and fuel vendors, then extended as you go.
  • One resolution order, alwaysAn explicit pick on the receipt beats the job's default category, which beats the vendor rule. Class comes from the job, falling back to the employee. No cleverness, no per-case surprises.
  • Coding fills blanks, never overwritesWhen we code an existing QuickBooks Purchase, we fill an empty customer or class and only replace the account if it still says “Uncategorized”. Your bookkeeper's decision always wins over ours.

03 — The truck

Construction field operations software that fits in a glovebox

Each vehicle gets a printable QR sticker. A crew member scans it, taps in their 4-digit PIN, picks the job, snaps the receipt, enters the total and vendor, and says whether it was the company card or cash. That's the whole flow — no app install, no account, no per-user licence. The phone can remember itself after the first PIN so the next receipt is faster.

On the server that becomes a QuickBooks Purchase pre-tagged with the job's customer, with the receipt photo attached to it as a real attachment. If the job isn't linked to QuickBooks yet, the receipt stays pending and posts itself once the link exists — captured now, filed later, never lost. Every push is written to a ledger before it happens, and the Autodesk leg picks the Purchase up on the normal hourly pass.

Receipts

Card receipts wait to match, not duplicate

This is the rule the accountant cared about most. A company-card purchase already reaches QuickBooks through the card connection — a Purchase posted for the same receipt is a duplicate she has to reconcile by hand. So card receipts go into an awaiting-match state and an hourly job looks for the bank-feed line: exact amount, within a few days, widening slightly for backlog items and after repeated tries, excluding cash purchases, our own field Purchases and anything already claimed. One candidate matches itself. Several, and the office picks. “Post anyway” exists, as an explicit choice.

Receipts

The backlog importer, and what it won't do

Point it at a scanned PDF of a shoebox. The browser splits it into one single-page PDF per receipt, so the attachment in QuickBooks is exactly that receipt and not a 40-page scan. Claude reads the pages directly — no OCR service — and pulls vendor, total and date. Nothing auto-posts. Confident pages queue as extracted; anything doubtful goes to a review list; a human approves each one, and approval is idempotent so a double-click can't post twice. Dates carry through, so a two-year-old receipt matches a two-year-old line. Roughly a cent or two per page.

04 — Who was where

Site check-in, geofences, and a day model that follows reality

Crews don't work the plan. They get moved at 10am, they stop at the yard, they pick up two guys on the way. The time clock has to follow that without anybody filing paperwork about it.

  • Check in on the job's QR — no new signageSite check-in rides the same QR system as the trucks. Employees identify by PIN and are never asked for a name or phone they already gave you. Subcontractors have no login: phone, name, and a selfie, with the number normalised so the same person doesn't become three people.
  • Requirements per jobWhat a check-in must collect — selfie, phone, company — is set per job over a tenant default, because a school site and a back-lot pour don't need the same evidence. Check-in photos live in their own storage prefix and the submit guard refuses anything from another prefix, so a receipt image can never be passed off as a selfie.
  • Geofences, nearest winsGive a job an address and it gets geofenced automatically. The phone's location ranks nearby jobs so the right one is the first button, and a trip that ends inside a fence resolves to that job — nearest fence wins. The yard is a fence too.
  • One button, three statesThe phone shows exactly one primary action depending on where the day is: I'm here, Moved, or Done for the day. “I'm here” writes the check-in and an in-punch on the clock; “Moved” writes an out and a new in at the new site; assignments are rewritten to match where people actually went. English and Spanish.
  • The office reads it backA “who was where” view reconstructs each person's day as segments — job time from the in/out pairs, gaps between sites — next to the travel legs and the rules that priced them.

Underneath all of this is the same workforce core the counter-retail tier runs on — PINs, punches, timesheets, documents, write-ups, scoped permissions. If you want that half in detail, it's on the workforce and store ops page. On construction tenants the people screen drops the counter-shaped concepts and reads Crew and Site PIN, with separate People, Subcontractors and Vendors views.

05 — Travel pay

Samsara legs, priced once, frozen at approval

If you pay for drive time, the drives are already recorded — they're in the telematics. We pull trips from Samsara and turn them into travel-pay legs: a trip that ends inside a job's geofence pays everyone who tapped “I'm here” at that job inside an arrival window, passengers included. A trip out of the yard can count as the first leg. If nobody tapped, it attributes to the truck's usual driver. Unusually long legs are flagged for review rather than paid quietly.

Two invariants matter. Every leg is ledgered on a unique trip reference with a do-nothing conflict, so a re-run never re-pays and never overwrites an approval; and the amount freezes at approval, so changing a rate next month doesn't restate last month's payroll. A driver we can't map yet gets a leg with no employee on it instead of the drive being thrown away, and the sync cursor only advances after a clean pass. No Samsara token means the whole feature stays dark.

Setup honesty, because this one is genuinely fiddly. Samsara has moved trip field names between API versions — we read both the millisecond and ISO shapes — and on the one account we've run live, the modern fleet-trips endpoint returned a 404 and only the legacy per-vehicle endpoint answered. It also returns no trip id, so we synthesise a stable one, and every trip on that account reported driver zero because the trucks weren't assigned to drivers in Samsara at all. Driver mapping alone would have paid nobody. So there's a screen where you name each truck's usual driver, and attribution prefers a signed-in driver when there is one. Expect us to verify all of this against your live token during setup — that verification is part of the work, not a surprise afterwards.

06 — End of day

Daily logs that land in the Autodesk Daily Report

From the site QR, the foreman's phone offers “End of day log”: crew, work done, photos, send. The crew list is pre-filled from that day's site check-ins — the people who actually tapped in — and only while it's still empty, so an edit is never overwritten. One log per foreman, job and day, found or created.

Submitting syncs it into Autodesk Construction Cloud as a Daily Report form: we find the project's daily-report template, create the form, then batch-fill weather and the worklog, materials and equipment tables. The form id is stamped the moment Autodesk returns it — before the values call — so a failed fill retries the same form instead of littering the project with empties. Pending and failed logs retry hourly. In the office, each job carries a daily-logs card with per-log Autodesk status and a Send button.

One caveat we'd rather state than have you find: Autodesk's template-detail endpoint doesn't exist for this form type, so the field shape was read off a real filled form. The projects we've run against carry Autodesk's own sample Daily Report template. If your team has customised theirs, the mapping may need a pass — that's a setup conversation, not a rebuild.

07 — Getting connected

What setup actually involves

  1. QuickBooks

    Connect it from the portal. Sandbox versus production is decided by the connect flow, never typed in by hand. Your categories are listed for the owner to map to accounts in Integrations; until they're mapped, receipts use the existing single expense account, so nothing waits on the mapping to work.

  2. Autodesk approval

    An ACC account admin has to approve our app as a Custom Integration with hub access. Without that step a perfectly valid token returns zero hubs — and we tell you that in plain words, with the client id to hand to whoever does it, rather than showing an empty list.

  3. Autodesk project creation needs a re-consent

    Listing and importing projects works with a read-only token. Creating a project in Autodesk from here needs account:write, which is requested by the current connect URL — but a token issued before that scope existed will 403 on creation until an account admin disconnects and reconnects Autodesk once. One click by the right person; we'll tell you which click.

  4. Samsara, verified against your token

    Paste a token and we probe it: which trips endpoint answers, which field shapes come back, whether drivers are assigned to vehicles. Then we map each truck's usual driver with you. The sync surfaces its error text on screen rather than going quietly dark.

  5. Bringing your history in

    We've imported a Buildertrend export into a live tenant: users became employees (inactive ones marked terminated, roles kept as titles) and every subcontractor row became a company. Worth knowing up front — Buildertrend's export gave us users, client contacts and subs only. No schedule, no daily logs, no to-dos, so those modules start empty. And roughly a third of what it calls "subs" are really vendors — gas stations, hardware, grocery — which is one click each to reclassify.

  6. Pricing

    Quoted per site and headcount. Unlike the published $200/mo loyalty platform, a field operation with trucks, geofences, an accounting connection and crews on phones is scoped per company. You'll get a number on the call.

08 — Questions

Straight answers.

Does anything post to QuickBooks without a person looking at it?

A receipt captured in the field posts as a Purchase with its photo attached, because a crew member already stood in front of the register and entered the vendor and total. The AI backlog importer never posts on its own: confident pages queue as extracted, doubtful ones go to review, and a human approves each one. Approval is idempotent, so a double click cannot create two Purchases.

Will this duplicate the expenses my card connection already brings into QuickBooks?

No. A company-card receipt goes into an awaiting-match state instead of posting. Bank-feed items are invisible to the API until your bookkeeper accepts them, so we retry hourly: exact amount within a few days, excluding cash purchases, our own field Purchases and anything already claimed. One candidate matches automatically, several go to the office to pick, and post-anyway is an explicit choice. Cash receipts post as before.

How hard is the Autodesk and Samsara setup, honestly?

Listing and importing Autodesk projects works as soon as an account admin approves our app as a Custom Integration in ACC — without that, a valid token returns zero hubs and we say so. Creating projects in Autodesk from here additionally needs a token issued with account:write, which means one disconnect-and-reconnect by an account admin. Samsara has moved trip field names between API versions and one account answered only the legacy per-vehicle endpoint, so we verify against your live token during setup rather than promising it works blind.

What does it cost?

Construction and ops pricing is not published — it is quoted per site and headcount. The loyalty platform's $200/mo is published because it is the same build for every store; a field operation with trucks, geofences, an accounting connection and a crew on phones is not. Ask on a demo call.

09 — Next step

Bring last month's receipts.

Twenty minutes: a truck QR scanned on a real phone, a receipt posting into QuickBooks with its photo, a day reconstructed from check-ins, and an honest read on which of your integrations will need a re-consent.

Construction & ops pricing is quoted per site and headcount · no contracts