Referencia completa del CLI
Esta es la referencia completa del CLI de Ads Uploader. Para una introducción y una guía para empezar, consulta Configuración por CLI.
Comandos
Autenticación
| Comando | Qué hace |
|---|---|
ads login | Autentica mediante el navegador (abre tu navegador predeterminado) |
ads logout | Borra las credenciales almacenadas |
ads whoami | Muestra el usuario actualmente conectado |
ads config | Muestra la configuración (cuenta, URL de la API, ruta de credenciales) |
Navegación
| Comando | Qué hace |
|---|---|
ads accounts | Lista todas las cuentas publicitarias conectadas a tu cuenta de Meta |
ads account <id> | Establece una cuenta publicitaria predeterminada para comandos futuros |
ads pages | Lista las páginas de Facebook con las que puedes anunciarte, incluida cualquier cuenta de Instagram vinculada, para usar con las sustituciones de perfil |
ads campaigns | Lista las campañas activas |
ads campaigns --status all | Incluye las campañas pausadas y archivadas |
ads campaigns --search "text" | Filtra las campañas por nombre |
ads campaign <id> | Muestra los conjuntos de anuncios dentro de una campaña |
ads adsets --campaign <id> | Lista los conjuntos de anuncios de una campaña (admite --search, --status) |
ads adset <id> | Muestra los anuncios dentro de un conjunto de anuncios |
ads ad <id> | Muestra los detalles completos del anuncio, incluida la configuración del creativo |
ads presets | Lista tus preajustes de API guardados |
ads presets <id> | Muestra los detalles de un preajuste específico |
ads presets:save --from-ad <adId> --name "Preset Name" | Guarda un anuncio existente como preajuste de API |
ads text-presets | Lista tus preajustes de texto guardados |
ads text-presets <id> | Muestra los detalles de un preajuste de texto específico |
ads uploads | Lista las subidas recientes |
ads uploads <batchId> | Muestra los detalles de la subida (archivos, variantes, hashes) |
Subida de medios
| Comando | Qué hace |
|---|---|
ads upload <files...> | Sube imágenes y vídeos a tu cuenta publicitaria |
ads upload ./directory/ | Sube un directorio completo |
Los archivos se preparan en paralelo, y los fallos de red transitorios se reintentan automáticamente con backoff. Rara vez necesitas tocar esto, pero está disponible:
| Flag de subida | Descripción |
|---|---|
--concurrency <n> | Número de archivos preparados en paralelo, 1-6 (predeterminado: 4). Los vídeos grandes se limitan automáticamente para no exceder la memoria. |
--upload-timeout <ms> | Tiempo de espera de subida por archivo (predeterminado: 120000) |
--api-timeout <ms> | Tiempo de espera de la solicitud de API en milisegundos (predeterminado: 60000) |
Creación de anuncios
| Comando | Qué hace |
|---|---|
ads create spec.json | Crea anuncios a partir de un archivo de especificación |
ads create:preview spec.json | Ejecución de prueba que muestra qué se crearía |
ads create:interactive | Asistente guiado (acepta todos los flags de creación) |
Gestión de trabajos
| Comando | Qué hace |
|---|---|
ads jobs <jobId> | Comprueba el estado de un trabajo |
ads jobs <jobId> --follow | Transmite actualizaciones de progreso en vivo |
ads jobs cancel <jobId> | Cancela un trabajo en ejecución |
Flags de creación
Estos flags se aplican a ads create, ads create:preview y ads create:interactive. Se pueden usar en lugar de un archivo de especificación o junto con él.
| Flag | Descripción |
|---|---|
--account <id> | Sustituye la cuenta publicitaria predeterminada |
--preset <id> | Usa un preajuste de API guardado (alternativa al archivo de especificación) |
--text-preset <id> | Carga un preajuste de texto guardado |
--copy-from <adId> | Copia la configuración de un anuncio existente |
--upload <batchId> | Especifica el ID de la subida |
--status <PAUSED|ACTIVE> | Establece el estado del anuncio (predeterminado: ACTIVE) |
--pause-at <level> | Nivel de pausa: ad (predeterminado), adSet o campaign |
--daily-budget <amount> | Sustituye el presupuesto diario por conjunto de anuncios (unidades de moneda, p. ej. 50 para 50 $) |
--bid-amount <amount> | Sustituye la puja/límite de coste por conjunto de anuncios (unidades de moneda) |
--page <id> | Usa esta página de Facebook en lugar de la de la plantilla (consulta Opciones de perfil) |
--instagram <id> | Usa esta cuenta de Instagram en lugar de la de la plantilla |
--threads <id> | Usa este perfil de Threads en lugar del de la plantilla |
--text-file <path> | Carga la configuración de texto desde un archivo JSON |
--expanded | Muestra los valores completos de título, texto principal y descripción en las vistas previas |
Flags de navegación
Estos flags están disponibles en campaigns, adsets, adset y campaign:
| Flag | Descripción |
|---|---|
--status <status> | active (predeterminado) o all |
--inactive | Abreviatura de --status all (en campaigns) |
--search <text> | Filtra por nombre (en campaigns, adsets) |
Flags de detalle
Estos flags están disponibles en ad:
| Flag | Descripción |
|---|---|
--expanded | Muestra los valores completos de título, texto principal y descripción |
Flags comunes
| Flag | Descripción |
|---|---|
--account <id> | Sustituye la cuenta publicitaria predeterminada para cualquier comando |
--json | Devuelve JSON sin procesar (disponible en la mayoría de los comandos, pensado para scripting) |
Formato del archivo de especificación
El archivo de especificación JSON controla cada aspecto de la creación de anuncios. Solo dos campos son obligatorios: una fuente de plantilla (adPresetId o copyFromAd) y uploadId.
Especificación mínima
{
"adPresetId": "your_preset_id",
"uploadId": "batch_abc123"
}
Ejemplo completo
{
"adPresetId": "preset_id_here",
"uploadId": "batch_abc123",
"adSet": {
"name": "My New Ad Set",
"dailyBudget": 50
},
"adNamePattern": "{filename}",
"texts": {
"perAd": {
"hero.jpg": {
"headlines": ["Main Headline"],
"bodies": ["Ad copy here."],
"descriptions": ["Short description"],
"cta": "SHOP_NOW",
"link": "https://example.com/landing"
}
}
},
"creativeEnhancements": "none",
"options": {
"status": "PAUSED",
"pauseAt": "adSet"
}
}
Fuente de plantilla
Necesitas una de estas para indicarle al CLI qué configuración de anuncio usar como base.
| Campo | Descripción |
|---|---|
adPresetId | El ID de un preajuste de API guardado. Fija la campaña, el conjunto de anuncios y la configuración del anuncio. |
copyFromAd | Un ID de anuncio de Facebook del que copiar la configuración. |
Cuando uses copyFromAd, proporciona la subida y, opcionalmente, la campaña y el conjunto de anuncios:
{
"copyFromAd": "120233848667930472",
"uploadId": "batch_abc123",
"campaign": { "id": "120233848666410472" },
"adSet": { "id": "120233848666620472" }
}
Para encontrar el ID de anuncio correcto, navega por tu cuenta: ads campaigns luego ads campaign <id> luego ads adset <id> luego ads ad <id>.
Opciones de perfil
De forma predeterminada, los nuevos anuncios heredan la página de Facebook, la cuenta de Instagram y el perfil de Threads del anuncio de plantilla o del preajuste. Es el mismo control de Opciones de perfil disponible mediante el panel de Valores predeterminados en la aplicación web. Sustituye cualquiera de ellos con un bloque profile (o con los flags --page / --instagram / --threads, que tienen prioridad sobre el archivo de especificación):
{
"copyFromAd": "120233848667930472",
"uploadId": "batch_abc123",
"profile": {
"pageId": "123456789012345",
"instagramId": "17841400000000000",
"threadsId": "987654321098765"
}
}
Ejecuta ads pages para listar los IDs de página que puedes usar, junto con la cuenta de Instagram vinculada de cada página.
Importante: si sustituyes solo la página, los perfiles de Instagram y Threads se restablecen (pertenecían a la página antigua), no se trasladan. Para cambiar la página y conservar un perfil específico de Instagram o Threads, establécelos explícitamente. También puedes cambiar solo el perfil de Instagram o Threads sin tocar la página, estableciendo solo esos campos.
Los perfiles por campaña para lanzamientos multicampaña aún no se admiten en las especificaciones del CLI.
Estructura de la campaña
De forma predeterminada, los anuncios van a la campaña del anuncio de plantilla. Puedes crear una nueva campaña proporcionando campaign.name.
Para los modos multicampaña, usa campaign.mode con un array campaigns:
{
"campaign": {
"mode": "duplicate",
"campaigns": [
{ "name": "Campaign A" },
{ "name": "Campaign B" }
]
}
}
| Modo | Comportamiento |
|---|---|
"single" | Predeterminado. Una sola campaña. |
"duplicate" | Todos los medios se duplican en cada campaña. |
"split" | Los medios se reparten equitativamente entre las campañas. |
Modos de conjunto de anuncios
De forma predeterminada, los anuncios van al conjunto de anuncios existente del anuncio de plantilla. Los siguientes modos te dan control sobre cómo se distribuyen los anuncios entre los conjuntos de anuncios.
Crear un nuevo conjunto de anuncios:
{ "adSet": { "name": "My Ad Set" } }
Usar un conjunto de anuncios existente por ID:
{ "adSet": { "id": "120233848666620472" } }
Un conjunto de anuncios por cada archivo subido:
{ "adSet": { "mode": "perUpload" } }
Agrupación automática en conjuntos de anuncios de tamaño fijo:
{ "adSet": { "mode": "autoGroup", "adsPerAdSet": 5 } }
Grupos personalizados con control total sobre qué archivos van a dónde:
{
"adSet": {
"groups": [
{ "name": "Images - April 10", "media": ["hero.jpg", "banner.jpg"] },
{ "name": "Videos - April 10", "media": ["promo.mp4"] }
]
}
}
Patrón de nombres de conjunto de anuncios para los modos de varios conjuntos de anuncios:
{ "adSet": { "mode": "perUpload", "namePattern": "Ad Set {index:01}" } }
La agrupación por variantes agrupa los anuncios por identificador de variación en el mismo conjunto de anuncios:
{ "adSet": { "mode": "autoGroup", "groupVariations": true, "variationIdentifier": "-" } }
Sustitución de presupuesto y puja
Sustituye el presupuesto diario o el importe de la puja en los nuevos conjuntos de anuncios. Los valores están en las unidades de moneda de tu cuenta (p. ej. 50 para 50 $ o 50 euros).
dailyBudget y bidAmount son campos de Meta independientes:
- Campañas ABO (el presupuesto está en el conjunto de anuncios): puedes establecer
dailyBudget,bidAmounto ambos. Las estrategias con límite de puja comoCOST_CAP,LOWEST_COST_WITH_BID_CAPyTARGET_COSTrequieren unbidAmountjunto al presupuesto. - Campañas CBO (el presupuesto está en la campaña): no establezcas
dailyBudgeten el conjunto de anuncios, Meta lo rechaza porque el presupuesto ya proviene de la campaña. Para las estrategias con límite de puja, establece solobidAmount.
{ "adSet": { "dailyBudget": 50 } }
{ "adSet": { "bidAmount": 5 } }
{ "adSet": { "dailyBudget": 50, "bidAmount": 5 } }
También disponible como flags del CLI: --daily-budget 50, --bid-amount 5 o ambos.
Configuración de texto
El texto común aplica la misma copia a todos los anuncios:
{
"texts": {
"common": {
"headlines": ["Headline 1", "Headline 2"],
"bodies": ["Primary text"],
"descriptions": ["Description"]
},
"strategy": "flexible"
}
}
El texto por anuncio te permite establecer una copia única para cada archivo:
{
"texts": {
"perAd": {
"hero.jpg": {
"headlines": ["Hero Headline"],
"bodies": ["Hero copy"],
"descriptions": ["Hero desc"],
"cta": "LEARN_MORE",
"link": "https://example.com/hero",
"urlTags": "utm_content=hero"
},
"banner.jpg": {
"headlines": ["Banner Headline"],
"bodies": ["Banner copy"]
}
}
}
}
Las claves por anuncio son nombres de archivo (no rutas completas). Cada entrada admite: headlines, bodies, descriptions, cta, link, displayUrl, urlTags. Los campos que no especifiques se heredan del anuncio de plantilla.
Los preajustes de texto te permiten cargar una configuración de texto guardada:
{ "textPresetId": "preset_id_here" }
No puedes combinar textPresetId con texts.
Las opciones de estrategia controlan cómo se gestionan varias variaciones de texto:
"flexible"(predeterminado) deja que Meta optimice entre tus variaciones de texto. Varios títulos y textos se convierten en opciones que Facebook combina libremente."separate"crea un anuncio separado para cada combinación de texto.
CTA y enlaces
Una CTA de nivel superior se aplica a todos los anuncios. Las CTA por anuncio en texts.perAd la sustituyen.
{
"cta": {
"type": "SHOP_NOW",
"link": "https://example.com",
"displayUrl": "example.com"
},
"urlTags": "utm_source=facebook&utm_medium=paid"
}
Tipos de CTA estándar: LEARN_MORE, SHOP_NOW, SIGN_UP, SUBSCRIBE, GET_OFFER, CONTACT_US, DOWNLOAD, ORDER_NOW, BUY_NOW, BOOK_NOW, APPLY_NOW, GET_QUOTE, GET_IN_TOUCH, WATCH_MORE
Las CTA específicas del objetivo se heredan del anuncio de plantilla y no deben establecerse manualmente. Establecerlas en el tipo de campaña incorrecto causará un error de la API de Facebook.
| CTA | Objetivo de campaña requerido |
|---|---|
MESSAGE_PAGE | Destino Messenger |
WHATSAPP_MESSAGE | Destino WhatsApp |
INSTAGRAM_MESSAGE | Destino DM de Instagram |
CALL_NOW | Campaña de llamada |
Prueba dividida de URL (destino dividido)
Proporciona de 2 a 5 URLs de destino bajo texts.urlVariants y cada conjunto de anuncios generado se duplica una vez por URL para que Meta optimice cada combinación de anuncio y página de destino de forma independiente.
{
"texts": {
"common": { "headlines": ["Hero"], "bodies": ["Copy"] },
"urlVariants": [
{ "link": "https://example.com/homepage", "label": "homepage" },
{ "link": "https://example.com/quiz", "label": "quiz-v2" }
]
}
}
labeles opcional. Cuando se omite, se usa el último slug de la ruta de la URL (/quiz-v2→quiz-v2), con retroceso al nombre de host para las URLs raíz.- En el modo de conjunto de anuncios único, la etiqueta de cada variante se convierte en el nombre completo del conjunto de anuncios.
- En los modos
perUploadyautoGroup, el nombre de cada conjunto de anuncios duplicado añade_{label}al patrón (o sustituye un token{destination}si incluyes uno). - El token
{date}en una etiqueta se resuelve a la fecha de hoy (p. ej.launch-{date}→launch-2026-04-27). - Cada URL de destino debe ser única. Las URLs idénticas (o variantes con barra final o con distinta mayúscula/minúscula de la misma URL) se fusionan en una sola entrada, así que asegúrate de tener al menos 2 destinos distintos.
- El presupuesto de tu conjunto de anuncios se multiplica por el número de variantes, ya que cada duplicado es su propio conjunto de anuncios.
- No compatible con anuncios de origen con destino especial (formulario de clientes potenciales, Messenger, WhatsApp, DM de Instagram, llamada). El CLI rechaza esta combinación con un error claro, esos formatos no se enrutan a través de
cta.link. - Las sustituciones de
linkpor anuncio entexts.perAdpierden frente a la URL de la variante cuando ambas están establecidas.
Mejoras creativas
Controla las mejoras creativas de Advantage+:
{ "creativeEnhancements": "none" }
| Valor | Efecto |
|---|---|
| omitido | Todas las funciones desactivadas |
"metaDefaults" | Alias obsoleto de "none" |
"all" | Todas las funciones activadas |
"none" | Todas las funciones desactivadas |
["feature1", "feature2"] | Solo las funciones listadas activadas, el resto desactivado |
Funciones disponibles: text_translation, inline_comment, enhance_cta, text_optimizations, reveal_details_over_time, image_brightness_and_contrast, image_touchups, video_auto_crop, video_filtering, image_animation, image_templates, adapt_to_placement, product_extensions, description_automation, add_text_overlay, music, carousel_to_video, carousel_dynamic_description, multi_share_end_card, multi_share_optimized
Cuando selecciones funciones concretas, lista solo las que sean relevantes para el tipo de medio. Las funciones de vídeo (video_auto_crop, video_filtering) solo se aplican a los anuncios de vídeo. Las funciones de carrusel (carousel_to_video, carousel_dynamic_description, multi_share_end_card, multi_share_optimized) solo se aplican a los anuncios de carrusel.
Anuncios de carrusel
Agrupa los archivos subidos en anuncios de carrusel con texto por tarjeta y texto general opcional del carrusel. cardTexts controla las tarjetas individuales. El texto general del carrusel puede colocarse en el objeto del carrusel o establecerse en texts.perAd usando el name del carrusel; los campos colocados ganan cuando ambos están presentes.
{
"carousel": [
{
"name": "My Carousel",
"cards": ["slide1.jpg", "slide2.jpg", "slide3.jpg"],
"headlines": ["Overall Carousel Headline"],
"bodies": ["Overall primary text"],
"descriptions": ["Overall description"],
"cta": "SHOP_NOW",
"link": "https://example.com/carousel",
"urlTags": "utm_content=my_carousel",
"cardTexts": [
{ "headline": "Slide 1", "description": "First card", "link": "https://example.com/1" },
{ "headline": "Slide 2", "description": "Second card", "link": "https://example.com/2" }
]
}
]
}
Forma alternativa para el texto general:
{
"texts": {
"perAd": {
"My Carousel": {
"headlines": ["Overall Carousel Headline"],
"bodies": ["Overall primary text"],
"descriptions": ["Overall description"],
"cta": "SHOP_NOW",
"link": "https://example.com/carousel",
"urlTags": "utm_content=my_carousel"
}
}
},
"carousel": [
{
"name": "My Carousel",
"cards": ["slide1.jpg", "slide2.jpg", "slide3.jpg"]
}
]
}
Las tarjetas deben referenciar nombres de archivo de la subida. Mínimo 2 tarjetas por carrusel. Los archivos reclamados por un carrusel se eliminan de la lista de anuncios estándar.
Anuncios flexibles
Agrupa varios recursos en un único anuncio flexible donde Meta elige el mejor recurso por ubicación:
{
"flexible": [
{
"name": "Multi-Asset Ad",
"assets": ["hero.jpg", "promo.mp4", "banner.jpg"]
}
]
}
Mínimo 2 recursos por grupo. Los archivos reclamados por un grupo flexible se eliminan de la lista de anuncios estándar.
Anuncios multimedia
Agrupa de 2 a 10 imágenes o vídeos subidos en un anuncio Multi Media de Meta:
{
"multimedia": [
{
"name": "Mixed Media Ad",
"assets": ["hero.jpg", "promo.mp4", "banner.jpg"],
"assetTexts": [
{
"headline": "Hero headline",
"primaryText": "Hero primary text",
"description": "Hero description",
"link": "https://example.com/hero",
"displayUrl": "example.com/hero"
}
]
}
]
}
Los recursos deben referenciar nombres de archivo de la subida. assetTexts es opcional y se alinea con assets por índice; cada campo es una única sustitución para ese recurso y los campos en blanco recurren al texto principal y a las URLs del anuncio. El recurso principal renderizado usa el texto y la URL principales del anuncio, y cualquier sustitución del texto principal de un recurso se convierte en la primera opción de texto principal. Los vídeos necesitan una URL de miniatura pública en caché procedente del procesamiento de la subida. Los archivos reclamados por un grupo Multi Media se eliminan de la lista de anuncios estándar.
Nombres de anuncios
Personaliza cómo se nombran tus anuncios:
{ "adNamePattern": "{filename} - {date}" }
| Marcador de posición | Qué inserta |
|---|---|
{filename} | Nombre de archivo original sin extensión |
{index:01} | Índice con ceros a la izquierda (01, 02, 03...) |
{variation} | Identificador de variación si la agrupación por variantes está activada |
{campaign} | Nombre de la campaña |
{date} | Fecha actual (AAAA-MM-DD) |
{date:short} | Fecha corta (MM-DD) |
{timestamp} | Marca de tiempo Unix |
Opciones
{
"options": {
"status": "PAUSED",
"pauseAt": "adSet",
"schedule": {
"startTime": "2026-04-01T09:00:00",
"endTime": "2026-04-30T23:59:59"
}
}
}
| Campo | Valores | Descripción |
|---|---|---|
status | "PAUSED", "ACTIVE" | Estado de lanzamiento del anuncio (predeterminado: ACTIVE) |
pauseAt | "ad", "adSet", "campaign" | En qué nivel pausar (predeterminado: ad) |
schedule.startTime | Cadena ISO 8601 | Hora de inicio programada (usa la zona horaria de la cuenta publicitaria) |
schedule.endTime | Cadena ISO 8601 | Hora de fin programada (opcional) |
Subida y detección de variantes
Los grupos de variantes se detectan automáticamente a partir de las convenciones de nombres de archivo, igual que en la aplicación web. Consulta Variaciones de relación de aspecto para todos los detalles sobre las convenciones de nombres.
Sufijos de relación: hero_1x1.jpg + hero_4x5.jpg + hero_9x16.jpg + hero_16x9.jpg + hero_1.91x1.jpg se agrupan como un único anuncio con variantes. Hasta 5 relaciones por grupo.
Posición del token: el token de relación puede aparecer al final (hero_4x5.jpg), en el medio (hero_4x5_v2.jpg) o al principio (4x5_hero.jpg).
Sufijos de palabra heredados: hero.jpg + hero_vertical.jpg + hero_horizontal.jpg siguen funcionando y se asignan a 9x16 y 16x9.
El delimitador predeterminado es _. Puedes cambiarlo (o aceptar varios) en Cuenta > Valores predeterminados > Ubicaciones > Separador de nombre de archivo.
Patrones comunes
Subir y crear con un preajuste
ads upload ./creatives/hero.jpg ./creatives/banner.jpg
ads create:preview spec.json
ads create spec.json
Donde spec.json contiene:
{ "adPresetId": "PRESET_ID", "uploadId": "BATCH_ID" }
Copiar la configuración de un anuncio existente
Navega por tu cuenta para encontrar el anuncio:
ads campaigns
ads campaign 120233848666410472
ads adset 120233848666620472
ads ad 120233848667930472
Luego crea una especificación que lo referencie:
{
"copyFromAd": "120233848667930472",
"uploadId": "BATCH_ID"
}
El anuncio de origen debe tener configuración de creativo en línea. Si se construyó a partir de una publicación de página existente, el CLI lo rechazará antes de enviar una solicitud de creación.
Guardar un preajuste de API a partir de un anuncio existente
ads presets:save --from-ad 120233848667930472 --name "Spring Purchase Template"
ads create --preset PRESET_ID --upload BATCH_ID
Esto guarda la misma forma de preajuste de API que usa la aplicación web. El anuncio de origen debe tener configuración de creativo en línea; los anuncios respaldados por publicaciones de página no pueden guardarse como preajustes de API.
Texto por anuncio con copia única por archivo
{
"adPresetId": "PRESET_ID",
"uploadId": "BATCH_ID",
"texts": {
"perAd": {
"hero.jpg": {
"headlines": ["Summer Sale Now On"],
"bodies": ["Save up to 50% on all items"],
"cta": "SHOP_NOW",
"link": "https://example.com/summer"
},
"banner.jpg": {
"headlines": ["New Collection Available"],
"bodies": ["Browse our latest styles"],
"cta": "LEARN_MORE",
"link": "https://example.com/new"
}
}
}
}
Agrupación automática en varios conjuntos de anuncios
{
"adPresetId": "PRESET_ID",
"uploadId": "BATCH_ID",
"adSet": { "mode": "autoGroup", "adsPerAdSet": 3 }
}
Notas importantes
- Siempre previsualiza primero.
create:previewdetecta errores de configuración antes de tocar Facebook. - Los anuncios están activos de forma predeterminada. Usa
--status PAUSEDo"status": "PAUSED"en la especificación para crearlos pausados. uploadIdproviene de la salida de la subida. Es el ID de la subida que devuelveads upload.- Las subidas están vinculadas a una cuenta publicitaria. Los archivos se suben directamente a la biblioteca de medios de Facebook de la cuenta seleccionada. El ID de la subida solo puede usarse con la misma cuenta.
copyFromAdnecesitauploadId. Debes proporcionar la subida. Opcionalmente, proporcionacampaign.idyadSet.idpara controlar la ubicación.- Las claves de texto por anuncio son nombres de archivo. Usa
"hero.jpg", no"/path/to/hero.jpg". textPresetIdytextsson mutuamente excluyentes. Usa uno u otro, no ambos.- Las CTA específicas del objetivo se heredan de la plantilla. No establezcas
MESSAGE_PAGE,WHATSAPP_MESSAGE, etc. manualmente.