Cerebro Studio · Backlog · Changelog
RioNoTeatro • /www/wwwroot/rionoteatro.com.br/docs/BACKLOG.md
Abrir Studio Projeto externo em modo read-only; encaminhamento permitido, escrita bloqueada.

Backlog Unificado

Projeto: RioNoTeatro. Fonte principal: /www/wwwroot/rionoteatro.com.br/docs/BACKLOG.md.

Modo read-only: ações de escrita ficam disponíveis apenas para o Cérebro.

Sem itens pendentes em /www/wwwroot/rionoteatro.com.br/docs/BACKLOG.md.

Especificações Disponíveis (fora da fila pendente)

Detalhe do BK Selecionado

/www/wwwroot/rionoteatro.com.br/docs/backlog/BK-278-shortlink-whatsapp-campanha.md • 2026-04-29T14:18:28.976Z

BK-278 - Shortlinks rastreáveis para campanha WhatsApp

Status: DONE em 2026-04-29.

Contexto

O disparo WhatsApp da campanha As Loucas do Méier precisava usar texto com

acentuação correta e links curtos, sem perder UTMs de rastreamento. O link longo

original deixava a mensagem pesada:

https://rionoteatro.com.br/as-loucas-do-meier?utm_source=whatsapp&utm_medium=crm&utm_campaign=loucas_meier_zona_norte_20260429&utm_content=...

Entrega

  • config/shortlink_helper.php
  • cria/garante a tabela rnt_shortlinks;
  • gera códigos curtos de 4 caracteres com fallback de colisão;
  • aceita código preferido quando disponível;
  • restringe destino a https://rionoteatro.com.br/.
  • short.php
  • resolve o código curto;
  • incrementa clicks e last_click_at;
  • registra evento shortlink_redirect_click em cliente_tracking;
  • redireciona com HTTP 302 para o destino com UTM completa.
  • .htaccess
  • recebeu regra equivalente para ambientes Apache/local.
  • /www/server/panel/vhost/rewrite/rionoteatro.com.br.conf
  • recebeu a regra efetiva de Nginx antes do fallback para peca.php?slug=...;
  • regra limitada a códigos de 4 a 8 caracteres iniciados por dígito;
  • backup criado em /www/server/panel/vhost/rewrite/rionoteatro.com.br.conf.bkp_original_20260429-110743_BK-278;
  • nginx -t validado e reload aplicado via /etc/init.d/nginx reload.
  • admin/cron/whatsapp_campaign_dry_run_zona_norte.php
  • passou a criar/reusar shortlink por escopo de campanha;
  • CSV passou a usar link curto na coluna link e dentro de mensagem;
  • resumo JSON passou a registrar destination_url, short_link e shortlink_code;
  • copy revisada com português BR e acentuação.
  • Base Miguel Falabella + Imperator:
  • curto: https://rionoteatro.com.br/1a2b;
  • destino: https://rionoteatro.com.br/as-loucas-do-meier?utm_source=whatsapp&utm_medium=crm&utm_campaign=loucas_meier_zona_norte_20260429&utm_content=miguel_falabella_imperator;
  • expires_at=NULL, sem expiração automática.
  • Extra Zona Norte + Baixada:
  • curto: https://rionoteatro.com.br/9t66;
  • destino: https://rionoteatro.com.br/as-loucas-do-meier?utm_source=whatsapp&utm_medium=crm&utm_campaign=loucas_meier_zona_norte_20260429&utm_content=zona_norte_baixada_extra;
  • expires_at=NULL, sem expiração automática.

Política definida após revisão operacional: shortlink de campanha deve permanecer

ativo por tempo indeterminado enquanto o destino existir. A coluna expires_at

continua disponível apenas para links realmente temporários ou limpeza futura

baseada em muitos meses sem acesso.

CSVs finais

  • Base:
  • admin/runtime/campaigns/loucas_meier_zona_norte_20260429-dryrun-20260429-110647.csv;
  • 1864 linhas;
  • 1864 WhatsApps únicos;
  • 0 duplicados.
  • Extra:
  • admin/runtime/campaigns/loucas_meier_zona_norte_20260429-expanded-zn-baixada-extra-20260429-110656.csv;
  • 2503 linhas;
  • 2503 WhatsApps únicos;
  • 0 duplicados.

Estado da fila WhatsApp

As campanhas importadas antes da copy final foram canceladas, sem disparo:

  • campanha #1, base miguel_falabella_imperator: cancelled_count=1864, sent_count=0;
  • campanha #2, base zona_norte_baixada_extra: cancelled_count=2503, sent_count=0.

A campanha v2 foi importada com shortlinks:

  • campanha #3, base miguel_falabella_imperator: 1864 pendentes, sent_count=0;
  • campanha #4, base zona_norte_baixada_extra: 2503 pendentes, sent_count=0.

Guardrails ainda ativos:

  • global_kill_switch=true;
  • dry_run_default=true;
  • campanhas #3 e #4 com dry_run_only=1;
  • campanhas sem approved_at;
  • process --execute --confirm=PROCESS_QUEUE retornou processed=0 por global_kill_switch_on.

Validações

  • php -l config/shortlink_helper.php
  • php -l short.php
  • php -l admin/cron/whatsapp_campaign_dry_run_zona_norte.php
  • nginx -t
  • /etc/init.d/nginx reload
  • curl -I https://rionoteatro.com.br/1a2b
  • curl -I https://rionoteatro.com.br/9t66
  • curl -L dos dois links curtos retornando HTTP 200 na página da peça com UTMs completas.
  • php83 admin/cron/whatsapp_campaign_queue.php status
  • php83 admin/cron/whatsapp_campaign_queue.php process --limit=5 --campaign=3 --execute --confirm=PROCESS_QUEUE
  • php83 admin/cron/whatsapp_campaign_queue.php process --limit=5 --campaign=4 --execute --confirm=PROCESS_QUEUE

Próximos passos

Para enviar de verdade, ainda exige ação humana explícita:

  1. confirmar a copy final recebida em um teste manual;
  2. escolher se o lote começa pela campanha #3 ou #4;
  3. aprovar campanha com --allow-real;
  4. desligar kill switch;
  5. processar em lote pequeno observando falhas, bloqueios e respostas.