u/Turbulent-Glass1552

I shipped yesterday, then found the feature I charge for had never worked once

Shipped my first solo app to the App Store yesterday. It's an iPhone focus timer where your hours carve a marble statue. The paid tier includes a weekly letter, written by a model on a schedule and stored, same letter for everybody, so it costs me about four cents a week to run no matter how many people read it.

Later the same day I went to check the archive and there was one letter in it. There should have been two.

The cron was set to Monday at 06:00 UTC. It had fired that Monday and written nothing. And when I looked at the timestamp on the one letter that did exist, it was the previous Friday afternoon, which was me running it by hand when I first deployed. So the scheduled job had never produced a letter. Not once. The feature I was selling had been broken since before launch and I had no idea.

The reason I couldn't see it is that I built it that way on purpose. If the letter fails to generate, the code swallows the error and leaves last week's letter up, because someone opening the app during an outage should read the letter they already had instead of an error message. That's still the right call for the user. It also meant the only way to notice was for a human to read the archive and count.

What actually diagnosed it was a billing page. My API balance was fine, nearly five dollars, so my first theory was wrong. But the spend for the month was four cents, which was exactly the cost of the one letter I'd written by hand. Meaning the two scheduled runs since had billed nothing at all.

That's the whole diagnosis, and it's the bit I'd pass on. A job that fails after calling the API still costs you money. A job that fails before it, on auth, costs you nothing. Zero spend across two runs told me the requests were never reaching the model, and with the balance healthy that left the API key. It had gone bad. Rotated it this morning, and the next run wrote the letter.

Two changes came out of it. The cron is daily now instead of weekly, which sounds wrong for a weekly letter but isn't: the week is the letter's identity, so once a week has its letter every later run is a no-op. It only ever means a failed Monday gets retried on Tuesday instead of being lost for seven days. And that change is what let me verify the fix in five minutes rather than waiting until next Monday to find out.

What I'm still sitting with: I made the failure invisible deliberately, for a good reason, and that was the bug. Nothing anywhere tells me a week was missed. I haven't built the monitoring yet.

So the question. For those of you running unattended jobs people are paying for, what do you actually use to notice when one quietly stops? I don't want a status page or a pager. I want the smallest possible thing that makes a missed week loud.

For context, since the rules ask: the app is free with an optional subscription, it's on iOS only, and the bust artwork was generated with an image model and then processed by a script I wrote to derive the marble variants. Everything else, the app and the server, is mine.

reddit.com
u/Turbulent-Glass1552 — 6 days ago