Reads hotel customers' purchase history for mattress protectors and flags who bought 10–14 months ago and hasn't reordered — the annually recurring revenue we currently leave to memory.
Monthly to Ifham & Mithun: “these hotels bought 10–14 months ago and haven't reordered — worth a call”, with amounts, unit counts, and how overdue each is.
First live run found 34 customers in the due window — including a major development customer 15 months overdue (893 units) and a landmark hotel 28 months overdue. Every one of those is a phone call we should already have made.
Start of month
Protector-family orders per hotel customer
10–14 months since last order → due; beyond → overdue
Amounts, units, months overdue
Relationships stay human
For implementers and the technically curious. The full build sheet — verified queries, thresholds, and build notes — lives on the specs page.
| System | Role in this loop |
|---|---|
| NetSuite warehousePostgres on our server | Our nightly read-only copy of NetSuite (ERP) data — items, stock, transactions — refreshed by the ETL sync every morning. The loop queries this copy, never NetSuite itself. |
| Metabasebi.huxapps.com | The BI layer over the warehouse. The loop runs its SQL through Metabase's API, and every number in the digest links to a live, clickable Metabase list so you can drill into the exact records. |
| Hermesagent runtime on our server | The scheduler that wakes the loop up. Each loop is a cron job under a Hermes profile; the planned bizops profile will host the business digests (IT loops run under vpsops). |
| Healthcheckshealthchecks.huxapps.com | The dead-man's switch. The loop pings it only after a clean run — if the loop dies or errors, the ping stops and Healthchecks raises the alarm independently. This is how 'never silent' is enforced by machinery, not promises. |
| Email renderer + gwsrender_email.py | All digests pass through one shared renderer: Huxberry-branded HTML, tables for repeated rows, a coral 'needs your response' box when the loop has questions, and an arrow link on every record. Sent from the loops mailbox via the Google Workspace CLI. |
| Loop chassisloop_common.py | Shared plumbing every loop reuses instead of reinventing: state files, run-over-run diffing, Metabase drill-down link building, quiet-on-green notify logic. |
| Model / brain | What it does here |
|---|---|
| None at run timedeterministic script | A normal cycle is a plain Python script — no AI tokens are spent unless a diagnosis or judgment step is actually needed. AI wrote the script; the script does the rounds. |
| GPT-5.5 via Codexthe bulk-work model | Wrote and maintains the mechanical parts — SQL, diffing, digest assembly. Effectively free on our existing subscription, so routine cycles cost almost nothing. |
Last month's due list — so the digest can show “new this month” vs “still uncalled”.
Monthly email call list, per team, every customer linking to its records.
Read-only. A minimum-history filter (open threshold question) keeps one-off buyers from polluting the list.