You asked for every 5 minutes. The platform quietly decided once a day. No error. No log. Nothing told you.
The scheduled job was configured for every 5 minutes. The deploy was clean and green. But the work it was supposed to do kept being hours stale — like the job barely ran at all.
"I configured it to run every five minutes and it just… didn't. There was no error to chase. Nothing was 'broken.' How do you debug a thing that fails by quietly doing less than you asked?"
"The free tier silently caps cron frequency to once a day and never tells you. Your config was honored 'as far as the plan allows.' I should have checked the tier's actual limits before we built timing assumptions on top of it."
Platforms optimize their free tiers for cost and a smooth signup, not for your visibility. So your config can be silently downgraded: a 5-minute cron quietly becomes daily, a function gets a shorter timeout, a feature is capped. The platform isn't lying — it's enforcing limits you agreed to without an error message. The danger is that your code's assumptions (it runs every 5 min) and the platform's reality (it runs daily) drift apart with nothing flagging the gap.
config != realityYour setting is accepted, then quietly clamped to the tier's limit. No error fires.
free = cheap, not visibleFree tiers spend their budget on UX, not on telling you what they throttled.
watch real runsDon't trust the schedule field. Log each run's timestamp and confirm the gap matches.
The model: it's an all-you-can-eat coupon with an asterisk — "once per day." You can ask for a plate every five minutes; the kitchen just won't bring it. Either confirm what the plan actually delivers, or move the timing to a scheduler you control (an external cron, an always-on machine) where "every 5 minutes" means every 5 minutes.
The cron config clearly says every 5 minutes. The deploy is green. It runs roughly once a day and nothing logs a problem. What's going on?
Same rule as always: answer it right, or the module isn't done.
"Accepted" is not "honored." A free tier can quietly do less than you configured, with no error. Verify what actually happened — don't trust what you set.
A real heartbeat.js your scheduled job calls on every run — it records the timestamp and screams (a clear log line) when the gap since the last run is far larger than the cadence you configured. Plus a pre-launch checklist of the free-tier limits that bite ship-first apps.