Skip to content
WorkAboutStackContactGet in touch
← All work
AutomationIn productionInteractive · sample data

The business reports itself.

Nobody on the team compiles a report. The priority numbers arrive in Slack at 9am. Every qualified, distributed, quoted and won lead announces itself during the day. The Allocation List closes the books at 11pm, and on Friday each client's weekly update drafts itself. This page plays it all back: a full day of messages, the Friday review flow, and the story of the scheduler that kept skipping.

10+ automated message types
Slack, WhatsApp and email
First post 9am, last 11pm
0 silent failures
The problem

Every report used to be a person. Someone pulled the numbers, pasted them into Slack, forwarded a version to each client's WhatsApp group. It went out late on busy days, wrong sometimes, and it stopped completely when that person went on leave.

Dashboards don't fix that. A dashboard waits for someone to open it. So the numbers go the other way: they get pushed into Slack and WhatsApp, where the team and the clients already are, on a schedule that doesn't depend on anyone remembering.

01 · A day in the channel

Nobody pulled a number all day.

This is #lead-concierge on a normal Tuesday, replayed. Two of the messages run on a schedule. The rest fire when something happens in the pipeline. The whole company reads this one channel to know how the business is doing.

Slack · #lead-conciergeTry itSample data
#lead-concierge · 23 members · the whole company reads this oneTuesday · 8:59 AM
CConcrete APP 9:00 AM Scheduled

Priority progress · week 27
P1 firms · 7 of 10 promised leads sent · P2 · 4 of 12 · P3 · 0 of 6. Four days left in the week. Full list in thread.

CConcrete APP 10:42 AM Real-time

Lead Qualified: Mei L. · Tampines 4-room BTO · budget $45k · keys Oct '26. Qualified by Sara.

CConcrete APP 11:05 AM Real-time

Lead Distributed: Mei L. → Briq Design Studios, Arc & Oak Studio, Form Atelier. PDF, WhatsApp and email sent to all three.

CConcrete APP 2:18 PM Real-time

Closing update: Form Atelier logged a Quote on Ryan T. (Bishan resale): $48,200.

CConcrete APP 4:31 PM Real-time

Closing update: Habitat & Co marked Priya S. as Won 🎉 $61,000 contract.

CConcrete APP 4:47 PM Real-time

Replacement filed: Glamour Concept on Daniel K. (uncontactable, screenshots attached). Vetting card posted for approval.

CConcrete APP 11:00 PM Scheduled

Allocation List · today
4 homeowners allocated → 11 firm sends. Week to date: 23 homeowners. Firm sends and homeowners are counted separately. One homeowner going to 3 firms is not 3 leads.

Nobody pulled a number all dayThe scheduled posts bookend the day; everything in between fires the moment it happens in the pipeline. Asking “how are we doing?” means scrolling up, not pinging a person.
02 · The Friday weekly

Drafted by a machine. Sent by a person.

At 5pm on Friday, every client's weekly update is drafted and posted to Slack. A concierge reads it once, fixes a line if something changed, and only then does the client's WhatsApp group get it. Try the review step yourself.

friday · 5:00 pmTry itSample data
Step 1 · drafted into Slack for review
Slack · #client-weeklies
CConcrete APP 5:00 PM

Weekly draft · Posh Home: review before it goes to their WhatsApp group

Hi Posh Home team 👋 Your week with Network:
• 4 qualified homeowners sent (28 of 60 this cycle)
• 2 consults booked from this week's sends
July shoot confirmed · Tue 10:00 at your showroom
• Instagram +38 followers this week
Full numbers are in your portal anytime.

Step 2 · what the client receives
WhatsApp · Posh Home × Network

Try the buttons: send it as-is, or fix the shoot line first and then send.

Slack first, WhatsApp laterThe machine does the compiling, a person does the judgment. Every client's weekly is drafted at 5pm Friday; none of them leave without a human tap.
03 · The war story

The scheduler that lied.

None of this matters if the messages don't actually go out. The platform's built-in cron kept skipping mornings, silently. What replaced it is deliberately boring, and it hasn't missed since. Here's the whole story.

the scheduler · what actually happenedTry it
Step 1Every report has an appointed hour9am progress, the 11pm Allocation List, Friday's client weeklies. The schedule is the product: a report that arrives late might as well not exist.
Step 2The platform's scheduler kept skippingThe hosting platform's built-in cron just didn't fire some mornings. No error, no log. The 9am message never arrived, and nobody knew until someone asked where it went.
Step 3So every job became a plain URLEach report is now an ordinary web endpoint behind a secret token. Anything that can hit a URL on time can be the scheduler. A boring Zapier clock does exactly that, reliably.
Step 4The endpoint answers in Slack-ready textThe scheduler has zero formatting logic: it posts whatever the endpoint returns. Adding a new report means writing one endpoint. Nothing else changes.
Step 5One embarrassing morning got engineered outThe day a report posted “0 today” twice, every job gained a posted flag. Re-runs, retries, and impatient double-clicks now return silently instead of announcing twice.
Boring beats cleverThe catch-up sweeps don't even trust the clock: they piggyback on endpoints that get hit constantly anyway, so a missed night heals itself by breakfast.
04 · The paper trail

Exports that can't disagree.

Commission statements, revenue reports, client PDFs, bank-ready CSVs. Every one calls the same calculation module the dashboards use, so a document can never contradict the screen it came from. Click through the library.

exports · the paper trailTry itSample data
Generated this month
Preview
branded pdf
Network SingaporeCommission StatementGordon · July 2026 · cash-collected basis
Posh Home · Marketing 6mo · 12%$624
Arc & Oak Studio · Lead Programme · 15%$810
Coaching bonus · multiplier ×1.0$300
Total payable$1,734

Rates come from the product, not the person. The math is the payroll page's math.

Same math as the screensEvery export calls the calculation module the dashboards use. A document can't disagree with the app it came from.
Under the hood

Reporting is the part of the system that talks to people, so it runs on the strictest rules in the codebase:

Fails closed

Every scheduled endpoint checks its secret before doing anything. No token, no run. A failed run pages me through Sentry with the job's context attached.

Never announces twice

Jobs mark what they've already posted. Retries, replays, and double-fired schedules return quietly instead of repeating themselves in the channel.

Idempotent intake

Inbound webhooks dedupe on name, contact, and email. A duplicate deliberately returns success, so the sender stops retrying instead of hammering.

Paced on purpose

WhatsApp sends go out 1.2 seconds apart, because the gateway silently drops bursts. Slower sends, zero drops.

Signed and replay-proof

Slack buttons are signature-verified with a five-minute replay window, and each button is bound to its exact message. A forwarded card can't approve anything.

A kill switch per report

Every module reads its own config flag, where blank means safely off. A misbehaving message type is silenced with one setting, not a deploy.

Contact

Open to full-time roles.

Email me what's broken and how you want it to work. I'll reply within 24 hours with how I'd fix it.