My WhatsApp automation ran green for 3 weeks while quietly dying. What I learned the hard way
Been running WhatsApp automations in production for a while now (Business API + n8n, self hosted) and I want to share some stuff I learned the painful way. Mostly because none of this shows up as errors. Your executions stay green. Everything looks fine. And then results just quietly die.
- The 24 hour window
Once a customer's last message is older than 24h you can't send free-form replies anymore, only pre-approved templates. My bot was "replying" to expired conversations for days. n8n showed success on every run. WhatsApp was just silently not delivering. Now I store last-inbound timestamp per chat and route expired windows to a template flow. Boring fix, saved my life.
- Lists that were "definitely opted in"
Client swears the list is opted in. It never is. Every block and report tanks your quality rating and enough of them gets the number restricted. My rule now: if I didn't see the opt-in mechanism with my own eyes, the list doesn't exist. I run a re-confirmation flow before any campaign. Costs one extra message, saves the number.
- Templates that read like ads
Meta rejects half of them in review, and the ones that pass get reported by users anyway. Same ending, longer route. Writing them like a normal human text with variables (name, order, context) fixed both problems.
- Sending without handling replies
Fired 500 messages once, \\\~40 people replied, nobody was watching the inbox. They blocked us. Rating took the hit. Every outbound flow needs an inbound path now, even a dumb one.
- Quality rating
Nobody watches this number until it arrives as a support ticket. Your daily messaging limit is tied to it and it can drop overnight mid-campaign. I check it before every send now and warm up new numbers slowly.
The common thread: WhatsApp doesn't throw errors for any of this. n8n can't save you from a green log that's lying to you.
Curious what others got burned by. Anyone found a clean way to monitor quality rating automatically? The webhook coverage there feels thin.