Datos reales, cero gasto estimado

competitive-intelligence · 9 min de lectura

Dentro de CommonWealth Ops: cómo se construyen nuestros informes de inteligencia semanales

Última actualización: junio de 2026

Por qué publicar un post de cómo funciona

La mayoría de herramientas de inteligencia publicitaria describen su pipeline en copy de marketing vago — algoritmos propietarios, clasificación impulsada por IA, actualizaciones en tiempo real. Operadores leyendo este lenguaje no obtienen información útil sobre qué hace la herramienta realmente.

Este post es la versión técnicamente honesta para CommonWealth Ops. Los pasos exactos, en orden, con los modos de fallo reales. Los dos huecos que el pipeline no resuelve — los nombramos. Las reglas Apex que gobiernan los fallos no bloqueantes — las citamos. Un operador leyendo esto debería poder explicar el pipeline de CommonWealth Ops a su equipo en tres frases y decidir si la estructura encaja con su necesidad.

La línea única de cron

El pipeline semanal completo arranca desde una única entrada de crontab en un solo VPS:

``` 0 23 1 bash /home/kobicraft/projects/CommonWealth-Ops/working/deploy/cron-weekly-intelligence.sh ```

Lunes a las 23:00 UTC. El script que sigue corre cinco pasos en secuencia, falla abierto en errores de pasos individuales y escribe un artefacto lastrunstatus.json al final para que las herramientas de observabilidad puedan leer si la corrida tuvo éxito. Ningún humano está en el loop — Apex 34 manda que la inteligencia semanal corra sin intervención humana.

Paso 0 — Transcripción Whisper ASR de nuevos videos de TikTok

Antes de que el ingester lea scrapedads, el pipeline abre un paso de transcripción Whisper. La tabla scrapedads tiene filas de anuncios en video de TikTok donde la librería pública expuso solo la URL del video y ningún caption en pantalla — el hook hablado es invisible para el resto del pipeline a menos que lo escuchemos.

El paso se acota a 25 anuncios por corrida. faster-whisper (una reimplementación optimizada por la comunidad de Whisper, licencia MIT) corre dentro del contenedor docker-worker. Para cada video el worker re-prueba la página de detalle viva de la TikTok Ad Library, descarga el archivo de video, corre ASR y escribe el transcript resultante en scrapedads.hooktext.

El fallo aquí es no bloqueante — Apex 37. Si el contenedor worker no está corriendo, el paso se salta. Si el módulo kobiispy no es importable, el paso se salta. Si Whisper hace OOM en un video particular, ese único video se salta, los otros continúan. El pipeline nunca crashea en un fallo del paso ASR porque el trending_score downstream puede operar solo con los hooks en pantalla y de caption.

Qué significa esto en la práctica: el archivo de hooks de TikTok incluye anuncios cuyo hook solo existía como narración de audio. Sin Whisper esos se clasificarían como anuncios sin hook — entradas false-negative en el archivo. Con Whisper entran en la búsqueda y la superficie de patrón como cualquier otro hook.

Paso 1 — Ingerir en adperformancesignals

La Meta Ad Library y la TikTok Ad Library las scrapea por separado el sistema de scrape KobiiSpy (fuera de scope de este post). El paso 1 del pipeline semanal toma el output más fresco y escribe filas estructuradas en la tabla PostgreSQL adperformancesignals dentro del contenedor cw-postgres.

Cada fila captura: identidad del anunciante, identificador del creativo del anuncio, plataforma (meta o tiktok), etiqueta de nicho, timestamp de captura, texto del hook en pantalla, arquetipo de hook clasificado (identidad / resultado / problema / prueba social), combinación de triggers clasificada, duración de corrida en días, flag de persistencia y (para TikTok) views_band.

El ingester se invoca por nicho para que el filtro sea limpio. El fallo del ingester es no bloqueante — si el ingest sale con código no-cero, el pipeline loguea el warning y continúa a la generación. Las filas existentes en adperformancesignals de semanas previas siguen siendo usables; el generador no requiere que el ingest de esta semana haya tenido éxito para producir un post con sentido (esto importa cuando una sola semana mala de datos de scrape bloquearía el pipeline entero).

Paso 2 — Generar posts por nicho y por idioma

Para cada par (nicho, idioma) el pipeline llama a scripts.generateintelligencepost dentro del contenedor cw-api con tres argumentos: nicho, idioma, semana ISO. El generador consulta adperformancesignals para la semana ISO actual y produce un Markdown-con-frontmatter (MDX).

Dos decisiones de diseño gobiernan el generador. Primero — y esto sostiene al sistema — el generador falla duro con código de salida 1 si hay cero filas de señal publicitaria para la tupla (nicho, semana). Nunca se genera un post de inteligencia vacío, nunca se inserta data sintética para llenar un hueco. Apex 9 (señal honesta) y Apex 33 (fallo duro sobre cero señal) se citan inline en el script de despliegue. El fallo por par se traga en la capa bash — el loop continúa al siguiente par — pero el archivo individual nunca aterriza si no hay data real detrás.

Segundo — el generador produce output determinista para una entrada dada. Re-correrlo sobre el mismo estado de adperformancesignals produce un archivo MDX byte-idéntico. Esto es lo que hace la idempotencia del siguiente paso real.

El MDX generado incluye: título semana-ISO, resumen lead, tabla de patrones top (arquetipos de hook + combinaciones de triggers + flags de persistencia), top anunciantes, creativos de anuncio de muestra y cita de metodología. Cada claim del post es rastreable de vuelta a una fila en adperformancesignals.

Paso 3 + 4 — Git clone, copy, commit, push

Los archivos MDX generados existen dentro del contenedor docker. Para llegar a producción deben atravesar al filesystem del host, después al repo bare de producción. El pipeline lo hace vía:

  1. `docker cp` de cada archivo MDX fuera del contenedor cw-api a un directorio temporal del host.
  2. `git clone` del repo bare de producción en `/home/kobicraft/projects/CommonWealth-Ops/repo.git` a otro directorio temporal.
  3. Copia cada MDX a su path destino dentro del working tree clonado (frontend/content/blog/{lang}/...).
  4. `git add` pathspec-scoped — solo los archivos MDX listados alcanzan el index. Doctrina cross-proyecto documentada tras un incidente de colisión de paneles en mayo; este script fue adopter temprano.
  5. `git diff --cached --quiet` — si no hay cambio real de contenido, saltar commit. Re-correr el cron en la misma semana es idempotente.
  6. `git commit` con identidad de bot (CW Ops Intelligence Bot, intelligence@cw.infinityops.ai) y un mensaje de commit estructurado.
  7. `git push` al repo bare. El hook post-receive en el repo bare despliega el sitio Next.js.

A minutos del paso 7, las nuevas URLs de post devuelven 200 en el sitio de producción. El sitemap se regenera automáticamente (lee el directorio MDX en build time). Los alternates hreflang entre EN y ES emparejan correctamente porque ambos posts usan el patrón de slug semana-ISO coincidente.

Paso 5 — Notificar la API de indexación de Google

Después de que el push completa, el pipeline llama a `scripts/notifynewposts.py` con ambos sitemaps de blog EN y ES. El script descubre cualquier URL en los sitemaps que no haya sido notificada antes (tracking vive en `vault/seo/notified-posts.csv`) y envía una URL Notification a la API de indexación de Google.

Scope honesto aquí: la documentación de la API de indexación de Google dice que la API solo ACTÚA sobre los esquemas JobPosting y BroadcastEvent. URLs de Article y FAQPage reciben respuestas 200 OK pero la política documentada de Google es que la señal de crawl se ignora para esquemas no-JobPosting. Cableamos el paso 5 igual por dos razones. Primero, si Google alguna vez expande la superficie accionable de la API, ya estamos plumbing-in. Segundo, el CSV de tracking captura cobertura de URL para acciones manuales downstream de GSC Request-Indexing — operadores de nuestro lado usan este CSV.

Si el token OAuth en `~/.claude-google-accounts/<email>.json` falta, el paso sale limpio con código 3 y el pipeline continúa. Apex 37 no bloqueante de nuevo.

El emitter de status de fin de corrida

El EXIT trap del script escribe `/home/kobicraft/kobiispy/lastrunstatus.json` atómicamente (mv-on-same-fs) antes de que la limpieza del directorio temp corra. El JSON incluye: timestamp, semana ISO, status de éxito-o-fallo, duración de corrida en segundos, conteo de posts generados, timestamp de próxima corrida programada y el realpath del propio script.

Herramientas de observabilidad downstream — incluyendo los posts de auditoría creados en sprints subsiguientes — leen este archivo para verificar que el pipeline está saludable. Un lastrunstatus.json faltante o caducado es una alarma estructural; significa que el cron falló al disparar (una regresión de crontab) o el script crashó antes de que el EXIT trap pudiera correr (un fallo más profundo).

Lo que el pipeline captura bien

Tres cosas que el pipeline hace que son difíciles de replicar.

Hooks de TikTok transcritos por Whisper. El hook solo-hablado de un anuncio en video de TikTok es invisible para cualquiera leyendo la TikTok Ad Library pública a mano. El pipeline convierte audio en texto buscable, semanalmente, a escala. Los nichos dominados por video con narración hablada (coaching de fitness, tutorial de skincare) son donde esta palanca paga más.

Captura de anuncios en mercados emergentes. La superficie de scrape incluye India (Flipkart, BigMuscles, HK Vitals, franquicia Plix, franquicia Mamaearth, BEARDO for Men, Lotus Botanicals, Clinikally, Purplle, Pilgrim), LATAM (marcas brasileñas en portugués de fitness, marcas hispanohablantes de skincare como Angê y Tori Repa) y otras geografías que las herramientas occidentales sub-indexan estructuralmente.

Manejo honesto de resultado-vacío. Una tupla nicho-semana de cero-señal no produce un post vacío. El pipeline crashea limpio y el resto del pipeline continúa. Sin data sintética, sin contenido alucinado por IA. Operadores leyendo un post de inteligencia de CommonWealth Ops pueden confiar en que cada claim tiene al menos una fila subyacente de señal publicitaria.

Lo que el pipeline NO resuelve

Dos huecos estructurales que un post honesto debe nombrar.

Hueco 1 — Gasto de anunciantes Meta y TikTok. Como cubierto en el FAQ, ninguna plataforma expone el gasto comercial de anunciantes. El pipeline usa proxies observables (duración de corrida, concentración de anunciante, conteo de anuncios) para ranking pero no clama números de gasto. Operadores que quieren gasto de competidor necesitan aceptar el muro de política de plataforma o pagar por data de panel de terceros con bandas de error anchas.

Hueco 2 — Atribución cross-platform. El pipeline lee qué corrieron los anunciantes en Meta y qué corrieron en TikTok independientemente. No cose la estrategia creativa cross-platform de un solo anunciante en una sola vista. Un anunciante corriendo campañas Meta-y-TikTok sincronizadas aparece como dos señales separadas; el patrón de sincronización queda para el lector.

Cómo los operadores lo usan en práctica

Tres workflows reales.

El brief de lunes por la mañana. Los suscriptores leen el post de inteligencia por nicho lunes por la mañana hora local. El patrón lead, los top anunciantes y las top combinaciones de triggers informan la hoja de ruta creativa de esa semana. Tiempo de decisión después de leer: típicamente bajo treinta minutos.

La watchlist de competidores. Operadores añaden anunciantes específicos a su watchlist interna. Cuando un anunciante observado aparece en la sección de anuncios persistentes del post semanal, eso es señal de que el anunciante escaló un nuevo creativo. La respuesta del operador es tirar de creative-test o revisar estrategia.

La búsqueda en el archivo de patrón. Operadores buscando hacia atrás hooks en su nicho usan el archivo de posts como superficie de búsqueda estructurada. Los hooks de TikTok transcritos por Whisper son particularmente sostén aquí — no existirían como texto en ninguna otra parte.

Qué cambia el próximo trimestre

Dos upgrades del pipeline en la hoja de ruta. Primero, expandir cobertura de nicho más allá de fitness y skincare requiere volumen semanal consistente de señal publicitaria en los nichos candidato — suplementos es el candidato líder basado en volumen de scrape existente. Segundo, el paso Whisper está actualmente acotado a 25 anuncios por corrida; el límite existe porque el paso ASR añade tiempo de reloj y queremos que el cron termine dentro de su ventana. Subir el límite es un cambio de config único pero requiere presupuesto aceptable de tiempo-reloj por corrida.

Para el glosario completo de términos usados dentro del pipeline, lee nuestro glosario de 50 términos. Para la comparación honesta contra otras herramientas en esta categoría, lee nuestra comparativa con AdSpy.

Ver precios →

Preguntas frecuentes

¿Con qué frecuencia se actualiza la inteligencia de CommonWealth Ops?
Una vez por semana — cada lunes a las 23:00 UTC. El cron dispara el pipeline; el pipeline ingiere, clasifica, genera, commitea, empuja y notifica la API de indexación de Google. La URL del post está viva en minutos desde el commit del cron. Si un nicho tiene cero filas de señal publicitaria para una semana, ese par nicho-idioma se salta limpiamente (nunca se publica un post vacío) — comportamiento documentado, no defecto.
¿Qué plataformas cubre el pipeline?
Meta Ad Library (Facebook, Instagram, Messenger, Audience Network) y TikTok Ad Library — expuesta vía TikTok Creative Center. Snapchat, Pinterest, YouTube y LinkedIn NO están cubiertos. Para operadores LinkedIn-heavy o B2B, discutimos el hueco en nuestro post de inteligencia competitiva B2B.
¿Cómo encaja Whisper ASR?
Muchos anuncios en video de TikTok tienen narración con audio pero sin caption en pantalla — la TikTok Ad Library pública no expone el hook hablado. El pipeline descarga hasta 25 anuncios así por semana, corre faster-whisper (Whisper optimizado por la comunidad) dentro del contenedor docker-worker y escribe el transcript en la columna scraped_ads.hook_text. Los hooks transcritos entran después en el cálculo del trending_score junto con los hooks en pantalla. Apex 37 gobierna el paso — si Whisper hace OOM o el modelo falta, el pipeline loguea y continúa; el ranking cae a señales no-Whisper.
¿CommonWealth Ops expone el gasto publicitario de competidores?
No. Meta expone gasto en rangos gruesos SOLO para anuncios políticos — el gasto comercial de anunciantes no se expone. TikTok no expone gasto en absoluto. Cualquier herramienta que clame exponer gasto comercial de competidores está infiriendo de paneles de datos de terceros con bandas de error anchas. Documentamos el scope honesto de qué capturamos en nuestro post de scope honesto.
¿Qué nichos cubre actualmente el pipeline?
Actualmente fitness y skincare son los nichos activamente scrapeados con output del cron semanal. Suplementos, beauty, food and beverage y home goods se leen on-demand para posts editoriales de inteligencia pero no vía el cron semanal. Añadir un nicho al cron semanal requiere expandir el array NICHES en el script de despliegue — operacionalmente directo pero requiere volumen consistente de señal publicitaria en el nicho objetivo para que valga la pena.
¿El pipeline es open source?
El pipeline en sí no es open source. El modelo Whisper que usamos (faster-whisper, licencia MIT) es open source. El contenido de inteligencia enviado desde el pipeline se publica abiertamente bajo cw.infinityops.ai/blog. Operadores que quieren la señal estructurada usan el dashboard; operadores que quieren el patrón editorial leen los posts públicos.

Conviértete en operador

¿Quieres el mismo camino?

CommonWealth Ops es por invitación directa — únete a la lista y te contactamos según se abran plazas. 49 €/mes + 20% del profit neto al empezar. Sin spam, sin filtraciones.

Ver preciosHistorias reales y aspiracionales
Por CommonWealth Ops Intelligence · Editorial, 2026-06-01

← Todos los artículos