September 2026 Bot Report: What Ran, What Broke, What It Cost
A monthly log for 17 Claude Code bots in a real company: the US$100 bill, the hours, and four things that broke in September 2026, with what we changed.
This is the first of a monthly series, and I’ll warn you now: it has no narrative arc. Nobody learns a lesson. There is no “key takeaways” box. It’s the log of what seventeen bots did in September, what it cost, what broke, and what we changed, written the way I’d want to read someone else’s at 11pm with a cold coffee.

The bill
| Item | September 2026 |
|---|---|
| Claude Max subscription (5x) | US$100 |
| Anthropic API | US$0 |
| Hosting, servers, deployment | US$0 |
| My time | about 1 hour a week |
Nothing moved on the bill. Nothing will move next month either. The bill is the boring part of this series on purpose; the interesting numbers are below.

What ran
Seventeen bots share one Python process on an always-on Mac. The ones that pulled their weight in September:
- Claims logger. Every closed support chat becomes a row in our claims sheet at 03:00. Humans correct rows; the bot logs each correction and sulks quietly.
- Monthly statements. Customer asks in chat, bot builds the spreadsheet from our dashboards, posts a Slack card, a human approves, email goes out.
- Usage-amount answers. “How much did we spend in May?” answered with a number, not a file attachment the size of a small novel.
- Unshipped-orders bot. 04:00 duplicate check on outgoing SMS, 05:00 bridge into the claims sheet.
- Error watcher. Reads the bot channel, diagnoses errors, proposes a patch. Never applies one unattended, because I’ve seen enough films.
- Referral rewards. Posts a card per pending reward; a human issues it.
- Price bot. Pulled market prices into a sheet daily at 13:00. Switched off in October, see below.
What broke
8 September: 100% of a bulk notification send failed, silently. We send transactional notifications through a messaging provider. The API accepted every single message. Not one was delivered. The provider’s “accepted” is not “delivered”, and we’d only been checking the first. The fix was a second call that fetches delivery results, and a line in the runbook in bold: accepted ≠ delivered, always read the results endpoint. I’d like to say I knew this already. I knew it the way you know you should floss.
9 September: the receipts bot went on hold. It generates transaction statements and card receipts from our admin API when a customer asks. The approval button in its Slack card stopped responding, and we couldn’t reproduce it on demand, which is the most annoying kind of bug. Rather than ship a bot with a flaky gate, we paused it. It’s still paused. The first task when we resume is the button, not the feature.
11 September: a notification template was rejected. We wanted to tell top customers how far they were from a monthly threshold. The messaging provider rejected the template: a balance reminder doesn’t meet their rules for that message type. The bot was finished. Tested. Beautiful. It never sent a single message. Check the template rules before you build the bot. I’m writing that down for future me, who will ignore it.
14 September: a supplier stopped trading with us. Not a bot failure, but it changed a bot decision. Their rows in the claims sheet were candidates for archiving, until we noticed they carry 13% of our recorded loss cost. They stayed. The archive rule became: rows leave the sheet only when they leave the analysis too.
What changed
- Delivery-result checks on every bulk send.
- The receipts bot is paused with a written “first thing to fix” note so it doesn’t quietly rot in a corner.
- Every bot error now goes to one person’s DM. The channel version had become wallpaper.
- The claims logger got the company’s recent rows and the order items as context. Accuracy went up on a bench of past chats, and the cheaper model held up fine.
October preview
The price-collection bot was switched off on 19 October. Its data source is a rolling 30-day window, so it could never backfill history, and the sheet it fed stopped being used. “It works” is not a reason to keep a bot alive. The 2 October outage (the database is locked evening) gets its own post, with the log, because it deserves it.
One line from me
Seventeen bots, US$100, and the worst failure of the month was a send that reported success. October’s log is already filling up.
The evergreen version of the bill is what the bots cost per month; the 2 October evening is written up in “database is locked”.