Case file 01Lead response / booking / recovery

HVAC Lead & Booking Automation

Six GoHighLevel workflows that answer a new lead in under 60 seconds, route by sentiment, book the job, recover no-shows, and request the review after completion.

<60s
first response
GoHighLevelTwilioWebhooksCalendar API
Status: In production

The problem

Leads arrived through Facebook lead ads and a claim-offer form and went cold within minutes. Every reply was typed by hand, so after-hours enquiries waited. Appointments were booked manually, no-shows were never followed up, and nothing asked for a review once the job was done.

What made it work

  • The 7-minute wait plus sentiment branch is the core state machine: a hot lead gets the booking link, silence routes to call connect and voicemail, and negative sentiment escalates to a human path.
  • No-show recovery reuses the pipeline rather than a separate list.
  • The review request is gated on job completion so it cannot fire against an open deal.
  • Every transition is driven by an event from the previous step, with no polling and no manual stage editing.

The system

01Intake

Facebook Lead Ad and claim-offer form post a webhook payload into GoHighLevel.

02Response

Twilio SMS and email, first reply inside 60 seconds.

03State

The CRM contact record is the source of truth; every stage transition is a status change.

04Routing

A 7-minute reply window, then a sentiment split into positive, negative and neutral paths.

05Booking

Calendar link on a positive reply, plus reminders before the appointment.

06Recovery

The no-show path re-enters the same nurture sequence rather than a separate list.

07Close

The review request fires only after job completion.

08Hardening

Failed webhooks retry and each step fires only on a valid event payload.

HVAC lead automation system architecture diagram
HVAC lead system / six connected workflows

Outcome

Six workflows in production: leads answered in under 60 seconds, appointments booked automatically, missed appointments recovered, and reviews requested without anyone touching a record.

Open the full case file
Case file 02Review collection / private feedback

Review & Reputation Management

Four workflows that request reviews after completion, stop on engagement, and intercept negative feedback before it reaches the public page.

0
repeat review asks
GoHighLevelSMS APIEmailSurvey triggers
Status: In production

The problem

Review collection depended on whoever remembered to ask. Negative feedback went straight to the public page because nothing intercepted it first, and customers who had already left a review kept being asked again.

What made it work

  • Exit-on-engagement is the rule that fixed over-messaging: the moment a customer clicks the review link, the sequence ends.
  • Negative feedback is intercepted before it reaches the public page and routed to the team as an alert.
  • Review requests are tied to the completion event rather than a calendar schedule, so the ask lands after the work is done.

The system

01Trigger

A contact tag applied on job completion in GoHighLevel.

02Outreach

SMS and email, sequenced rather than sent together.

03Cadence

A wait interval followed by a single follow-up.

04Exit

Link-click detection stops the sequence immediately.

05Intercept

Low-score responses route to a private form and raise an internal alert.

Review and reputation management system architecture diagram
Reputation system / four connected workflows

Outcome

Four workflows collecting reviews automatically, negative feedback intercepted privately, and no customer asked twice for the same review.

Case file 03Order-to-invoice / duplicate prevention

Shopify → Zoho → Xero Order Automation

A five-module Make.com flow that takes a Shopify webhook through Sheets, Gmail, Zoho stock, Xero contact resolution, and a referenced invoice.

0
manual steps
ShopifyMakeGoogle SheetsGmailZohoXero
Status: Case study

The problem

Orders were processed by hand: logged into a spreadsheet, invoiced manually in Xero, and confirmed with typed emails. Nothing checked whether the customer already existed in Xero, so duplicate contacts accumulated, and invoice references were inconsistent between orders.

What made it work

  • The contact-resolution router is the part that matters: invoicing only runs after the contact is resolved, so a first-time customer cannot create a duplicate record and an existing customer cannot create a second one.
  • Five scenarios were tested end to end: new customer, existing customer, no contact match, malformed payload and repeat order.
  • The spreadsheet acts as a log rather than a queue, so nothing waits on a human to move a row.

The system

01Intake

A webhook receives the Shopify order payload.

02Logging

The order is written to Google Sheets as the running record.

03Notification

Gmail sends the customer confirmation.

04Resolution

A Xero contact search runs before anything is invoiced.

05Branching

Existing contact creates the invoice directly; a new contact is created first.

06Output

The Xero invoice is generated with the correct reference.

07Testing

Five scenarios were validated in ReqBin, from new customer to malformed payload.

Make.com execution history showing successful order automation runs
Order-to-invoice / execution history

Outcome

A webhook arrives, the order is logged, the customer is notified, the contact is resolved or created in Xero, and the invoice is produced with the right reference, across five test scenarios with no manual steps.

Open the full case file
Case file 04Reconciliation / exception review

Multi-Source ERP & Customer Account Reconciliation

A Python and SQL pipeline that normalises ERP, account-platform and spreadsheet extracts, matches accounts, isolates exceptions, and drives daily and weekly reporting.

3
sources reconciled
PythonSQLExcelGoogle SheetsERP & CRM exports
Status: In production

The problem

Commercial account data lived across an enterprise ERP, a customer account platform and operational spreadsheets that did not agree. Account records were matched by hand, mismatches were found late, and daily and weekly figures were collated manually.

What made it work

  • Reconciliation runs identifier-first with a normalised name and address fallback, so records still join when source systems format the same account differently.
  • Mismatches are classified rather than skipped: missing record, conflicting value, or duplicate.
  • Reporting figures are derived from the reconciled dataset, which removes manual collation and the transcription errors that came with it.
  • The same pipeline runs each cycle, so figures stay comparable week to week.

The system

01Sources

ERP account exports, customer account platform records and operational spreadsheets.

02Extraction

Python scripts pull and normalise each extract into a common schema.

03Matching

SQL joins resolve records on a stable account identifier, with normalised name and address as fallback.

04Duplicates

Near-duplicate accounts are flagged rather than silently merged.

05Exceptions

Unmatched and conflicting records are isolated into a review queue.

06Reporting

The reconciled dataset drives the daily and weekly activity reports.

07Output

Excel and Google Sheets carry the review queue and published workbooks.

Xero invoice records used in the reconciliation workflow
Reconciliation / reviewed output

Outcome

Account records reconciled across three sources, mismatches surfaced for review instead of reaching reporting, and daily and weekly reports generated from clean data rather than manual collation.

Codex automation

Internal tooling built with Codex: reporting pipelines, audience hygiene and versioned agent skills.

Case file 05Reporting automation / data reconciliation

Automated Daily Activity Reporting

A Python and Node pipeline that turns XGen exports into verified per-day, per-rep application, card, deferral and approval figures inside a six-sheet Excel workbook.

17
reporting rows restored
CodexPythonNode.jsExcelPower BIXGen
Status: Shipped

The problem

The daily activity workbook combined telephony metrics from Power BI with credit-application metrics from XGen. Every application, card, deferral and approval column had been empty since 25 September 2026, and the live CRM interface exposed neither card counts nor decision statuses.

What made it work

  • A control week matched the issued weekly figures exactly—2 applications, 15 cards, 1 deferred, 1 approved and 10 cards approved—before the method was trusted on unverified days.
  • Every populated cell carries a note recording its source and rule; summary columns aggregate the five rep sheets by formula.
  • Two retroactive source changes were detected and corrected, including a card count that grew from 1 to 16 and a pending application that was subsequently declined.

The system

01Source mapping

Map XGen, Power BI and the rolling workbook to one reporting chain.

02Rule reconstruction

Recover owner attribution, alias consolidation, date windows, withdrawn applications and deferral semantics.

03Control validation

Reproduce the already-issued 30 Sep–6 Oct totals exactly before applying the rules to unverified days.

04Recovery

Resolve per-day, per-rep figures for 24 September–12 October and reconcile them with telephony evidence.

05Automation

Run a Python extractor and a Node workbook writer that seeds values, formulas, formats and provenance notes.

06Guards

Fail if any call column changes; recalculate, scan for formula errors and render changed regions for review.

07Codification

Package the procedure as the reusable Codex skill “united-card-daily-report”.

Outcome

17 days of missing CRM metrics restored across six worksheets. The run produced 11 applications, 61 cards, 4 deferrals, 5 approvals and 25 approved cards, with zero formula errors and telephony columns proven unchanged.

Case file 06Audience hygiene / API operations

Audience List Hygiene & Data Cleanup

A Mailchimp API toolkit for audited bulk archiving, suppression tagging and audience maintenance, with dry-run defaults and count gates before every irreversible action.

38,467
contacts archived
CodexPythonMailchimp APIRESTSHA-256
Status: Shipped

The problem

Across 35 Mailchimp audiences, 40,120 contacts sat unsubscribed or hard-bounced with no removal mechanism. One competition audience was 76% non-deliverable, and an audience labelled “Test” held 1,617 live customers imported from a portal migration.

What made it work

  • The three-count gate caught mismatches before irreversible archive actions; each of the six passes was verified by API count collapse.
  • The identifier index used the account-number field as the only reliable join between cancellation records and audience members.
  • Resolved matches were tagged and read back individually; unmatched cancellations were reported as a data gap rather than guessed.

The system

01API tooling

Build a Python standard-library toolkit with an offline fixture mode, dry-run default and an explicit live-write flag.

02Defect diagnosis

Fix the web-ID versus API list-ID mismatch and the HTTP 204 success handler that made successful writes look like failures.

03Safety gate

Require the filtered count, selected count and typed platform confirmation to agree before every archive.

04Async handling

Treat partial archive counts as in-flight processing, not an operation cap, and prevent destructive re-runs.

05Archive

Archive 38,467 unsubscribed and cleaned contacts across three audiences in six verified passes.

06Identity index

Page 41,091 members into 6,123 account numbers and match 43 cancellation codes to 12 contacts.

07Privacy and handover

Use masked addresses and SHA-256 fingerprints, then document the verified technical scope and open marketing decisions.

Outcome

38,467 undeliverable contacts archived across three audiences with zero failures. Unsubscribed and cleaned counts on all three audiences fell to zero; 12 whole-account closures were tagged and verified, and the live-customer “Test” audience was renamed.

Case file 07Agentic tooling / version control

Custom Agentic Skills & Repository Versioning

A version-controlled library of Codex skills covering daily reporting, inbox triage, portal setup, gift-card invoices, discount batches and welcome emails.

11
versioned skills
CodexGitMarkdownPythonNode.js
Status: Versioned

The problem

Recurring operational workflows depended on the person who discovered them. The runbooks, scripts, validation gates and reporting formats lived in separate task folders with no shared baseline or version history.

What made it work

  • The repository baseline contains 11 operational skills, each with its own scripts and references rather than a single monolithic prompt.
  • Git history preserves both the baseline and the later workflow updates, so changes to a control can be traced.
  • Skills include validation and reporting requirements, which turns an ad-hoc Codex session into a repeatable operating procedure.

The system

01Baseline

Bring the 11 United Card operational skills into one Git repository with a clean initial commit.

02Skill authoring

Package each workflow as a Codex skill with a runbook, scripts, references and a compact reporting format.

03Validation gates

Encode control checks, duplicate checks, count gates and exception paths so a run cannot silently pass.

04Versioning

Track later changes—including inbox processing, discount expiry, welcome email and career journal updates—as a second commit.

05Reuse

Keep skills portable across tasks so the same procedure can be run again without rebuilding the workflow.

Outcome

Eleven operational skills are version-controlled in Git, with a baseline commit and a subsequent update commit. The library covers daily reporting, inbox triage, portal setup, gift-card invoices, discount batches, weekly sales and activity reports, and welcome-email preparation.

Start with the process

Send the process that is still running by hand.

You get a written read on what can be automated, what it would take, and what it removes from the week. No pitch deck required.