GET /v1/orders?customer_wa_id={id}PATCH /v1/subscriptions/{id} con status=paused, resume_datesubscription_pausedgraph.facebook.com/v21.0/{media_id} y la sube a S3GET /v1/boxes/{box_id}// NutriBox WhatsApp Bot — index.js // Meta Cloud API v21.0 + Express + Redis state const express = require('express'); const { createClient } = require('redis'); const { handleMessage } = require('./messageHandler'); const app = express(); app.use(express.json()); const redis = createClient({ url: process.env.REDIS_URL }); redis.connect(); // Webhook verification (GET) — requerido por Meta app.get('/webhook', (req, res) => { const mode = req.query['hub.mode']; const token = req.query['hub.verify_token']; const challenge = req.query['hub.challenge']; if (mode === 'subscribe' && token === process.env.WHATSAPP_VERIFY_TOKEN) { console.log('Webhook verificado correctamente'); return res.status(200).send(challenge); } res.sendStatus(403); }); // Recepcion de mensajes (POST) — responder 200 INMEDIATAMENTE app.post('/webhook', async (req, res) => { res.sendStatus(200); // Responder antes de procesar (max 5s) const entry = req.body.entry?.[0]; const change = entry?.changes?.[0]; const message = change?.value?.messages?.[0]; if (!message) return; // Deduplicacion: ignorar mensajes ya procesados const key = `msg:${message.id}`; const seen = await redis.setNX(key, 1); if (!seen) return; await redis.expire(key, 86400); // TTL 24h const phoneId = change.value.metadata.phone_number_id; await handleMessage(message, phoneId, redis); }); app.listen(process.env.PORT || 3000, () => console.log('NutriBox WhatsApp Bot iniciado') );
Menu principal (botones)
4 reply buttons para redirigir al flujo correcto. Maximo 3 botones por mensaje — se divide en 2 mensajes.
Selector de plato (lista)
Lista interactiva con los 5 platos de la caja semanal. Hasta 10 filas por seccion, descripciones con calorias.
Recepcion de media
Extrae media_id de imagen, descarga via API con Bearer token y sube a S3 como evidencia del ticket.
| Tipo | Precio/conv. | Primer 1.000/mes |
|---|---|---|
| Service (usuario inicia) Soporte, consultas |
Gratis hasta 1.000/mes |
0 € |
| Service (exceso) >1.000/mes |
0,0083 € | ~25 €/1.000 |
| Utility (reminders) Confirmaciones, avisos |
0,0110 € | ~11 €/1.000 |
| Marketing Campanas salientes |
0,0650 € | ~65 €/1.000 |
| Authentication OTP, 2FA |
0,0540 € | ~54 €/1.000 |
msg:{id} con TTL 24h para ignorar reenvios80 msg/seg
Limite de la Cloud API. Para NutriBox (3.200 usuarios) mas que suficiente incluso en horario pico.
250 conv/24h
Limite inicial de cuenta nueva. Sube automaticamente a 1K tras periodo de calidad positivo.
1K → 100K
Escalado en fases segun quality rating de Meta. NutriBox puede llegar a ilimitado en 3-4 meses.
Cron reminders
El lunes a las 9:00 AM se disparan 3.200 templates weekly_delivery_reminder en batches de 50.