An operating system for a top 1% brokerage in Canada: an owned site with AI where it earns its keep, an admin the team opens every morning, and the automations and tests that keep both honest.
The funnel worked. Running it did not. Performance lived in five dashboards nobody opened together, the content calendar lived in a spreadsheet, and every improvement, however small, went through me.
A growth system that only one person can operate is not a system. It is a dependency.
Four surfaces, all inside the site’s own admin so there is nothing extra to log into, and a layer of automation underneath that runs whether anyone is watching or not.
Everything below is the real layout with invented numbers. The client’s figures are not mine to publish.
Five channels, one timeframe control, one place. Sessions, leads, conversion and a thirty-day delta per channel, pulled every morning and pushed to Telegram as a digest so the team reads it before they open a laptop.
Sixteen time windows, eight rolling and eight calendar, against previous period or year on year. Two rules make it trustworthy. The snapshot ships resolved date ranges rather than date maths the app re-derives, so a headline figure can never disagree with the table under it. And every source anchors to its own latest complete day, never to today, because Search Console finalises about three days late: a today-anchored week gives it four days of data and three of silence, and draws a 40% collapse that never happened.
Real limits are shown rather than filled in with zeros. One source only holds 175 days, so year-on-year is disabled for it and the reason is printed on the card. Another caps account metrics at 30 days, so those hide on longer ranges while the per-post metrics, which do roll up correctly, stay. A dashboard that quietly invents the numbers it cannot fetch is worse than one with gaps.
| Channel | Sessions | Leads | Conv. | Δ 30d | Trend |
|---|---|---|---|---|---|
| Organic search | 1,412 | 84 | 5.9% | +38% | |
| Paid social | 2,680 | 131 | 4.9% | +12% | |
| 318 | 27 | 8.5% | -4% | ||
| Direct | 944 | 39 | 4.1% | +9% | |
| Referral | 207 | 11 | 5.3% | +2% |
The calendar generates itself. Hooks and captions are drafted in the owner’s voice in both English and Farsi, queued three times a day, and held for approval or released automatically. Everything is editable, and everything is undoable.
The part I am most pleased with. Every night the system reads its own analytics, logs and error traces and writes back a short list: what broke, what is wasteful, what is missing. Each item arrives already written as an instruction, so acting on it is a paste rather than a project.
Eighteen rules, not a model, and that is deliberate. A model rewords the same finding differently every day, so nothing ever reads as still open, and it will invent findings the data cannot support. Rules give each finding a stable identity, which is the only thing that makes “opened five days ago”, “new today” and “resolved” mean anything.
Every rule carries a minimum-volume gate. A 100% form-abandon rate across three starts is noise, and a queue that cries wolf gets ignored, which costs more than the finding was worth.
Automations that report success while producing nothing are worse than automations that fail loudly. Every monitor checks the artifact, not the exit code: did the post publish, did the file contain rows, did the digest actually send. When a job stops, the system restarts it and says so.
This exists because of a specific failure. An outage sat unfixed for 47 hours behind an alerting system that was working perfectly and had nobody on the other end. Alerts are not a fix, they are a request for someone to be awake. So the repair loop runs every five minutes: it reads the freshness log, diagnoses with a read-only agent, applies exactly one action from a fixed menu, then re-runs the real job and checks for fresh output before it calls itself done.
Twenty-one checks in total, ten on the website and eleven on the automations. Two traps worth naming: a job can touch a file without writing anything to it, so freshness by timestamp alone lies, and a log read mid-write looks like a truncated failure. Both are checked for.
Overnight: all clear.
Social publisher stopped at 02:41 and restarted itself at 02:44. One post went out 3 minutes late. No content lost.
4 new listings, 1 relisted, 2 sold and removed. 3 items in this morning’s queue.
It has a roadmap, which is the difference between a project and an operating system. Currently queued: an autonomous agent that drafts and schedules the whole content week for approval, a bilingual voice caller that qualifies inbound leads into the CRM, and self-hosted walkability data so one third-party rate limit cannot take a feature down.
It does not replace judgement. It surfaces the decisions faster and removes the excuse of not knowing, but somebody still has to choose what to build and what to leave. The morning queue is a list of candidates, not a plan, and roughly a third of what it proposes is not worth doing.