4dim / Notas
Cuánto tarda Meta en aprobar una plantilla de WhatsApp
Meta declara un techo de 24 horas y nadie publica una distribución. Los dos relojes que se confunden, cuántas vueltas cuesta un rechazo, y el protocolo para medirlo.
La pregunta tiene dos relojes, no uno
«Cuánto tarda Meta en aprobar una plantilla» mezcla dos cosas que se resuelven en momentos distintos, y solo una de ellas tarda.
La validación de categoría es síncrona: viene dentro de la respuesta a la llamada de creación. Si Meta está de acuerdo te devuelve PENDING; si no, REJECTED con reason: INCORRECT_CATEGORY, en el mismo segundo. La revisión de contenido es la asíncrona, y es la única a la que se refiere el techo de 24 horas. Lo que vuelve PENDING ya pasó la aduana; lo rechazado en la propia llamada nunca llegó a revisarse por contenido.
Hay una tercera puerta. En la biblioteca de plantillas el ejemplo oficial de respuesta de creación ya trae "status": "APPROVED" (13-09-2026). Meta no escribe «aprobación instantánea» en ninguna parte: la conclusión es inferencia nuestra, no declaración suya.
Lo que Meta declara, palabra por palabra
La cuarta columna dice verificado y no «actualizado»: ninguna de estas páginas expuso fecha de actualización.
| Afirmación | Cifra declarada | Documento | Verificado |
|---|---|---|---|
| Decisión de aprobación | «up to 24 hours» | Revisión de plantillas | 13-09-2026 |
| Decisión de apelación | «within 24 hours»; la muestra es obligatoria | Revisión de plantillas | 13-09-2026 |
| Plantilla de biblioteca | el ejemplo de respuesta ya trae APPROVED | Biblioteca | 13-09-2026 |
| Entrega pese a la frecuencia | «within an hour (99 percentile)» | Frecuencia | 13-09-2026 |
| Percentil de tiempo de revisión | no se publica | — | 13-09-2026 |
Sobre cómo se revisa, Meta dice «a combination of automated systems and manual reviews» y se detiene: no dice qué proporción pasa por cada vía.
Meta publica un percentil 99 —pero es de otra cosa. Para la revisión solo publica un techo, y un techo no es un tiempo: es una promesa de que no será peor.
Lo que el rechazo te dice, y lo que te calla
Un rechazo no detiene el reloj: lo reinicia. Por eso el rechazo entra en una nota sobre tiempos, pero entra por un lado concreto —cuánto te acerca a la siguiente versión— y no por el catálogo de motivos. Los motivos uno a uno, y cómo se evitan antes de someter, están en la nota de los rechazos.
Para ser utilidad hay que cumplir dos condiciones a la vez: ser «non-promotional, not containing any promotional or persuasive intent» y ser específica de lo que el usuario pidió, o esencial para él. El contenido mixto o ininteligible tira hacia marketing; es criterio y no automatismo, porque Meta escribe «might be categorized differently».
El rechazo llega con uno de ocho valores. Contando las cadenas de la tabla de Meta aparece esto (13-09-2026):
rejected_reason | Descripción oficial | ¿Te dice qué arreglar? |
|---|---|---|
INVALID_FORMAT | «template has an invalid format» | Sí — el único con rejection_info |
INCORRECT_CATEGORY | «content doesn't match the category designated…» | A medias |
TAG_CONTENT_MISMATCH | la misma descripción, palabra por palabra | A medias |
ABUSIVE_CONTENT | «content that violates our policies» | No |
PROMOTIONAL | la misma descripción | No |
SCAM | la misma descripción | No |
NONE | «template was paused» — no es un rechazo | — |
CATEGORY_NOT_AVAILABLE | obsoleto: autenticación en región no admitida | — |
Cinco de los ocho no distinguen nada. Solo INVALID_FORMAT trae rejection_info, con reason y recommendation en prosa: si te rechazan por formato Meta te dice qué arreglar, y si es por política, no. Los fallos que enumera: llaves desparejadas, parámetros con # o % o no secuenciales, y plantillas que empiezan o terminan con un parámetro.
Traducido a reloj: de cada ocho motivos, cinco te devuelven a adivinar, y adivinar cuesta una revisión entera cada vez. Ahí «cuánto tarda» deja de ser una cifra y pasa a ser un número de vueltas, que es lo que nadie cuenta al dar una mediana.
Quién dice qué, y qué mide cada cifra
| Fuente | Qué publica | Qué mide en realidad |
|---|---|---|
| Twilio (BSP) | «within minutes»; hasta 48 h si va a revisión humana | su plataforma y su umbral de escalado |
| 360dialog (BSP) | 48 h en un punto y 24 h en otro de la misma página | su propia documentación, que se contradice |
| Infobip (BSP) | «typically… within 24 hours» | su estimación de soporte, sin método |
| Post de agencia, 11-04-2026 | «mediana de 1h 12m»; «Meta afirma que baja de 2 h» | 14 envíos sin método; lo atribuido a Meta no cita fuente |
Las tres páginas de BSP respondían el 13-09-2026, y solo Twilio publica fecha de actualización comprobable: 04-05-2026, la única fecha de fuente verificada aquí.
Ninguna mide el mercado: las 48 horas de Twilio son el momento en que te dicen que abras un tíquet. Y la cifra que más circula en 2026 es una anécdota de catorce envíos, sin dispersión ni método. No la citamos como dato, sino como ejemplo de lo que circula.
Aprobada no es para siempre
La calidad empieza en UNKNOWN. Con YELLOW y RED todavía se puede enviar, pero RED dispara la pausa. Y reaparece el vicio de la tabla anterior: las descripciones de YELLOW y RED son idénticas salvo por «medium» y «low» (13-09-2026).
| Instancia | Duración | Qué llega | Qué se puede hacer |
|---|---|---|---|
| 1.ª | 3 horas | other_info.title: FIRST_PAUSE | esperar, o POST /{TEMPLATE_ID}/unpause |
| 2.ª | 6 horas | SECOND_PAUSE | ídem |
| 3.ª | inhabilitada, sin reloj | DISABLED; el envío falla con 132016 | editar y volver a revisión |
| (extra) limitación de tasa | no declarada | RATE_LIMITING_PAUSE | no documentada |
La escalera está escrita así (verificado el 13-09-2026). La trampa está en el arreglo: «once you edit a message template and resubmit it for approval, its status will change to In Review». Salir editando de una pausa de tres horas cuesta el resto de la pausa más una revisión nueva.
La frecuencia alcanza a marketing y utilidad, con ventana de 7 días para plantillas nuevas, reactivadas o sin GREEN. El envío devuelve accepted o held_for_quality_assessment: «aceptado» no es «enviado», y los retenidos se tiran con el código 132015. El umbral es «an unspecified threshold». Se estrenó el 12-09-2023 en Brasil, Colombia y Singapur; en el resto, el 12-10-2023.
Y una cuarta forma de perderla: la recategorización
Si una utilidad debía ser marketing, la categoría cambia y «there is no change to template status; it remains APPROVED»: sigues enviando, y pagando como marketing. El efecto va más allá de la tarifa, porque desde el 01-07-2025 Meta cobra por mensaje entregado y «utility templates delivered within an open customer service window are free». Recategorizar no solo encarece: elimina una gratuidad. Si el cambio es hacia autenticación, el estado pasa a REJECTED el primer día del mes siguiente. Se ve venir con GET /{WABA_ID}/message_templates?fields=category,correct_category.
Y aquí Meta se contradice consigo misma. Para el paso de utilidad a marketing, la guía de categorización dice «A 1-day advance notice is provided» y, párrafos más abajo, «on the first day of the next month». La contradicción es interna a una sola página. El webhook template_category_update habla de «in 24 hours» y desempata contra la segunda. Reportamos la discrepancia; no la resolvemos. Verificado el 13-09-2026.
Cuatro cosas que comprobamos contra la API
Medido contra nuestra cuenta con la Graph API v23.0. Muestras pequeñas de una sola cuenta: cada fila lleva su n y su hora porque sin eso no valen.
| Lo que dice la documentación | Lo que devolvió la API | Cuándo, y con qué n |
|---|---|---|
quality_score trae «the date it was last updated» | devolvió 1789311702 y 1789311761 en dos llamadas separadas por 59 s, con el score inmóvil: es la hora de la petición | 13-09-2026, 15:01:42 y 15:02:41 UTC, v23.0, n=2, una plantilla |
last_updated_time es «integer (int64) — Unix timestamp» | devolvió la cadena ISO "2026-02-24T21:18:38+0000" | 13-09-2026, 15:32:23 UTC, v23.0, una plantilla |
la prosa nombra message_template_status_change | ese nombre no tiene página de referencia; el real es message_template_status_update | 13-09-2026 |
health_status trae can_send_message | MESSAGE_TEMPLATE en AVAILABLE, pero el agregado en LIMITED por el error 141010 de la entidad BUSINESS | 13-09-2026, 15:32:23 UTC, v23.0 |
La primera: no cronometres nada con quality_score.date. La segunda rompe cualquier parseador escrito contra la referencia. La tercera va con cuidado: ese nombre no tiene página propia y ningún BSP lo usa, pero no pudimos enumerar todos los campos suscribibles, así que no decimos que no exista.
La cuarta es la más útil: aprobada no es enviable. La plantilla estaba APPROVED y el agregado decía LIMITED, porque el negocio no ha pasado la verificación de Meta. Lo que no está documentado no es el campo: es el desglose por entidad y el código 141010, que no figura en la referencia pública de errores.
El protocolo para medirlo con datos propios
El método está listo; los números no: esta medición no se ha ejecutado.
| Qué medir | De dónde sale el reloj | Error que arrastra |
|---|---|---|
| t0, envío a revisión | tu propio reloj: la API no expone marca de envío | latencia de red, despreciable |
| validación de categoría | status de la respuesta de creación | ninguno: es síncrono |
| t1, decisión de contenido | entry[].time del webhook message_template_status_update | ninguno, si el campo suscrito es el correcto |
| t1 sin webhook | sondeo de GET /{TEMPLATE_ID}?fields=status cada 30 s | el intervalo entero; hay que declararlo |
| nunca | quality_score.date | devuelve la hora de tu propia petición |
Lo demás es disciplina: una variable cada vez, y mediana y p90 con su n, nunca la media. Los límites (13-09-2026): 100 plantillas por cuenta y hora; 250 por cuenta sin portafolio verificado, 6.000 con él; y «if you delete an approved template, you cannot create a new template with the same name for 30 days». Cada iteración quema un nombre. Archivar en vez de borrar sería la salida, pero no pudimos verificar ese endpoint.
Que es la razón por la que medir esto sale caro, y por la que conviene no gastar vueltas en lo evitable: lo que se valida antes de someter no entra en ninguna medición, porque no llega a pasar.
Lo que no sabemos, y conviene decirlo
Lo grande primero. No existe ninguna distribución pública de tiempos de aprobación con método publicado: ni de Meta, ni de ningún BSP, ni de un tercero. Lo comprobamos el 13-09-2026 buscando en inglés y en castellano por mediana, p90 y distribución. Es refutable por construcción: si alguien publica esa distribución, esta frase cae, y mejor.
Y las lagunas de este trabajo, que son contenido y no vergüenza:
- No pudimos confirmar la fecha de actualización de ninguna página de Meta. Por eso las tablas dicen «verificado».
- No se sabe qué proporción resuelve la máquina y cuál llega a un revisor humano.
- No se sabe cuál de los dos plazos de recategorización rige: no hemos visto una carga real de ese webhook.
- No se sabe si la categoría, el idioma o la hora del día cambian el tiempo de revisión. Es plausible; nadie lo ha medido publicando el método.
- No hay ninguna cifra observada de cuánto tarda una apelación, y el registro de cambios oficial devolvía HTTP 500 el 13-09-2026.
El número exacto es alcanzable, y el método está en el apartado 08. Mientras nadie lo mida, cualquier cifra sobre cuánto tarda Meta en aprobar una plantilla es un techo declarado o una anécdota, y lo honesto es decir cuál de las dos.
Esta nota sale de nuestro trabajo en AI-CRM Connection.