CASE FILE 09/13CLASS: SAMPLE BUILDDATA: REALISTIC, NOT CLIENTTYPE: Ops systems & SOPs

Sample build: realistic data, built to show how I'd handle this work. Not client work.

Sample buildOps systems & SOPs

Jobber to Google Workspace and QuickBooks Online migration: billing checked before every wave goes live

195/363 recurring jobs move as is after a Jobber and QBO billing check that traced 73,774.99 of over-billing

Sample build · realistic data, built to show how I'd handle this work · not client work · every figure is computed from the files in the appendix

  • 195/363jobs move as is
  • 73,774.99over-billed, Aug to Oct
  • 339calendar events built
  • 32/32controls pass

01Summary

  1. In this scenario a Melbourne commercial cleaning business (158 clients, 252 sites, 60 cleaners) moves 339 active recurring jobs off Jobber: rosters to Google Calendar, site files to Google Drive, billing to QuickBooks Online.
  2. Every job is matched to its QBO recurring template and three months of invoices from both systems are checked: 195 jobs move as is, and 73,774.99 over-billed and 24,094.07 under-billed between August and October are traced to 157 items.
  3. The pilot passes all six go-live gates; the four regional waves stay BLOCKED until their items are cleared. 32 of 32 formula controls and 12 of 12 tests pass.

Every job is matched to its QBO recurring template and three months of invoices from both systems are checked: 195 jobs move as is, and 73,774.99 over-billed and 24,094.07 under-billed between August and October are traced to 157 items.

Key point, computed from the sample files

02The scenario

In this scenario a commercial cleaning business runs recurring jobs and rosters in Jobber, but bills some sites from Jobber and the rest from QuickBooks Online recurring templates. Nobody compares the two, rate changes go into one system only, and alarm codes sit in visit notes. Jobber has to be gone before its renewal.

Exhibit 1: Current-state process map: 6 manual steps across 3 roles
Current-state swimlaneOfficeJobberQuickBooksJob set up twice1Rate rise done inone place2Some sitesinvoice fromJobber3Templates for therest4Codes in visitnotes5No one comparesthe two6

Source: sample files

03Issues in the data

Exhibit 2: Issues in the scenario, counted from the sample data
15sites invoiced by both Jobber and QBO (42,156.02 in three months)
19weekly templates billed at rate x 4 instead of 52/12
31sites missing the 1 July rate rise in one system
66alarm and key-safe codes sitting in visit notes

Source: sample files

04How I approached it

  • An engine (engine.py) that matches customers, sites and templates, reconciles rates, checks 884 QBO and 231 Jobber invoices against what should have been billed, finds roster clashes and moves access codes out of notes.
  • A workbook with 27 tabs and 16,894 formulas: exports, matching, rate reconciliation, billing check, roster clashes, cleaner load, calendar build, Drive plan, cutover waves and gates.
  • 339 recurring Google Calendar events as one .ics file per cleaner, and a 1,670-folder Drive plan with group permissions.
  • A 19-page report, a one-page executive summary and an SOP for moving a site and every change after, as Word and PDF.
Exhibit 3: Target design for the scenario
Future-state architectureSOURCEJobber clients, jobs,visits, invoicesQBO customers,templates, invoicesRECONCILECustomer, site andtemplate matchRates and 3-monthbilling checkGOOGLE WORKSPACE339 recurring events,one calendar percleaner1,670 Drive folders,codes in 02 SiteAccessGO-LIVEGates G1 to G6 perwavePilot, then 4 waves

Source: my design and the sample files

05How this applies to your business

  1. Week 1: exports and matchingJobber and QBO exports, customers, sites and templates matched, the billing check run on three months.
  2. Week 2: decisions and fixesThe bookkeeper and owner clear the billing items; credit notes and catch-up invoices are raised in QBO.
  3. Week 3: pilot2 cleaners (8 jobs) move to Google Calendar and Drive, with a daily check.
  4. Weeks 4 to 8: wavesOne region a week once its six gates PASS; Jobber invoicing is switched off site by site, then Jobber is closed.
Exhibit 4: Responsibilities (R responsible, A accountable, C consulted, I informed)
ActivityBusiness ownerSpecialist (me)Your team
Export Jobber and QBO dataICR
Run the engine and rebuild the workbookIRC
Decide billing items and creditsACR
Build calendars and DriveARC
Release a waveARC
Switch off Jobber invoicing per siteACR

Source: sample plan

06Controls and checks

Exhibit 5: Control framework: 32 checks, status read from the files
CheckWhat it catchesStatus
Rate Reconciliation job rows = Jobber jobsEvery job is reconciled oncePASS
Active templates on Rate Reconciliation = active QBO templatesEvery live template is accounted for, including QBO-only onesPASS
Formula status = engine status (rows that differ)The workbook logic and the engine agree on every rowPASS
Rows with no next actionEvery status has an action and an ownerPASS
Actions tab rows = Rate Reconciliation rowsNothing falls outside the action listPASS
QBO parents with no Jobber clientEvery customer has a homePASS
QBO parents in Customer Match = parents in QBONo customer skippedPASS
QBO sub-customers with no Jobber propertyEvery location has a homePASS
Templates pointing at a job that does not existNo broken template linksPASS
Jobber invoices total = Billing Check Jobber columnEvery Jobber invoice is in the checkPASS
QBO invoices total = Billing Check QBO columnEvery QBO invoice is in the checkPASS
Should-bill (weekly + monthly active jobs) = 3 x monthly basisBilling policy applied the same way everywherePASS
Gap total = billed (both systems) - should billGaps add upPASS
Billing Check gap = engine gap (rows that differ)Workbook and engine agree on every job-monthPASS
Double-billed jobs: over-billing = their QBO billingThe QBO invoices are the duplicatePASS
Not-billed jobs: anything billedThey really were missedPASS
Archived jobs: should billEnded work is never expectedPASS
Roster clashes where Jobber shows a different cleanerClashes are realPASS
Calendar events marked as clashing = 2 x clashesEvery clash is visible on the rosterPASS
Calendar events = active jobsEvery live job is on a calendar, nothing ended isPASS
Codes found = codes moved to 02 Site AccessEvery code is kept, just not in the calendarPASS
Calendar events with an access code in the textCodes never reach a phone calendarPASS
Drive folders = clients + 6 x locationsFolder plan is completePASS
Active jobs with no waveEvery job has a cutover datePASS
Active jobs across waves = active jobsWaves cover everything oncePASS
Gate open items: formula = engine (cells that differ)Gate logic agrees with the enginePASS
Pilot gates passedThe pilot can go livePASS
Rostered hours = active jobs' weekly hoursLoad covers every jobPASS
Rostered hours: workbook = engine (cleaners that differ)Same load either wayPASS
Exceptions: billing rows = rows needing a fixEvery billing fix is on the registerPASS
Exceptions: roster rows = clashesEvery clash is on the registerPASS
Engine regression: job status disagreementsEngine matches the answer key on every jobPASS

Source: sample files (Checks / Controls tab, test output or run log)

07What the files show

Exhibit 6: What the sample files show
  • 195/363jobs move as is
  • 73,774.99over-billed, Aug to Oct
  • 339calendar events built
  • 32/32controls pass

Source: sample files, measured by script. Sample data, not a client result.

  • What each job should have billed, less what Jobber and QBO actually billed, equals the gap on every line, for 771,931.10 across August to October.
  • The engine agrees with the answer key on all 363 job statuses, 168 customers, 289 templates, 66 access codes and 11 roster clashes.
  • No calendar event contains an access code: every title, location and description is searched.
  • Each wave's six gates are counted by formula; the pilot passes 6 of 6 and 20 gates across the four waves stay BLOCKED.

08Risks and how the build handles them

Exhibit 7: Risks and mitigations
RiskMitigation built in
A site is billed by both systems during the moveGate G1 blocks the wave while any of its sites still invoices from Jobber and has a live QBO template
Two QBO templates bill one siteGate G2; templates are matched on property and service, then amount, so an old template is never mistaken for the live one
A wrong rate is carried into QBOEvery job compared on a monthly basis (52/12 for weekly work); gate G4 holds the wave until rates agree
Access codes end up in a calendar inviteAll 66 codes are moved to a restricted Drive folder; gate G6 searches every event and finds none
A cleaner is double-booked after the moveClashes are found from the visit times; 11 are listed and gate G5 holds the wave

Source: sample design

09Appendix: files

A. Screenshots of the deliverable

Dashboard tab: scope, matching, rates, billing, roster, calendar, Drive, cutover and controls, every figure a formula

Exhibit 8: Dashboard tab: scope, matching, rates, billing, roster, calendar, Drive, cutover and controls, every figure a formula

Source: sample files

Rate Reconciliation tab: each Jobber job against its QBO templates, with the status worked out by formula, next action and owner

Exhibit 9: Rate Reconciliation tab: each Jobber job against its QBO templates, with the status worked out by formula, next action and owner

Source: sample files

Billing Check tab: what each job should have been billed each month against Jobber and QBO invoices

Exhibit 10: Billing Check tab: what each job should have been billed each month against Jobber and QBO invoices

Source: sample files

Calendar Build tab: one recurring Google Calendar event per active job, by cleaner and wave

Exhibit 11: Calendar Build tab: one recurring Google Calendar event per active job, by cleaner and wave

Source: sample files

Cutover Waves tab: the pilot passes all six gates; each regional wave stays BLOCKED until its open items reach zero

Exhibit 12: Cutover Waves tab: the pilot passes all six gates; each regional wave stays BLOCKED until its open items reach zero

Source: sample files

Controls tab: 32 formula controls, all PASS

Exhibit 13: Controls tab: 32 formula controls, all PASS

Source: sample files

Report page: target process across the office, Google Calendar, the cleaner, Google Drive and QBO

Exhibit 14: Report page: target process across the office, Google Calendar, the cleaner, Google Drive and QBO

Source: sample files

SOP-01: moving a site from Jobber and every change after

Exhibit 15: SOP-01: moving a site from Jobber and every change after

Source: sample files

Overview of the Jobber migration sample build: jobs reconciled, over- and under-billing for August to October, calendar events and controls

Exhibit 16: Overview of the Jobber migration sample build: jobs reconciled, over- and under-billing for August to October, calendar events and controls

Source: sample files

B. Downloadable files

FileWhat it isSize
Jobber-to-Google-and-QBO-Migration.xlsxWorkbook: Jobber and QBO exports, customer, site and template matching, rate reconciliation, three-month billing check, roster clashes, cleaner load, access notes, calendar build, Drive plan, cutover waves and gates, controls and test log654.3 KB
Jobber-Migration-Report.pdfReport (19 pages): data profile, findings, options, target design, matching, reconciliation, billing check, roster, calendar, Drive, waves and gates, controls, tests, cutover plan, risks, SOP751.5 KB
Executive-Summary.pdfOne-page executive summary134 KB
Migration-SOP.pdfSOP-01: moving a site and every change after (PDF)56.6 KB
Migration-SOP.docxSOP-01, editable Word file37.6 KB
engine.pyEngine: matching, rate reconciliation, billing check, roster clashes, access-code removal, calendar and Drive build, gates and the regression test19.6 KB
Jobber-Migration-data-and-code.zipInputs as exported (CSV), engine output, one .ics calendar per cleaner, and the scripts that rebuild the workbook, report and SOP208.6 KB

Sample build: realistic data, built to show how I'd handle this work. Names are placeholders and no client data is used.

Have a similar problem in your business?

Hire me on Upwork (opens in a new tab)