Saltar para o conteúdo
megapromotingVamos falar

Experiência · Automatizações de marketing

Um ambiente de trabalho em que o agente que trata das suas campanhas Google Ads e Meta lê os relatórios, propõe a mudança com o motivo escrito e executa apenas dentro dos limites que lhe deu.

O serviço é uma oferta, não uma realização, e dizemo-lo primeiro: hoje não temos um sistema que altere orçamentos ou licitações no Google Ads ou Meta. Temos construídas e executadas as peças de que um se faz — o envio do sinal de conversão real para a Google, um motor que compra promoção paga com dry-run ativo por defeito, um registo que escreve cada ação que custa, e um interruptor que desliga um orquestrador sem caminho de desvio.

Oferta, com condições„offer”, nu „delivered”, și motivul se poate verifica în câteva secunde. Am căutat în peste 150 de depozite proprii câmpurile prin care API-urile de reclamă mișcă bani — `budget_micros`, `campaignBudget`, `target_cpa`, `target_roas`, `bid_strategy` — și nu apar nicăieri, nici la Google, nici la Meta. Nu gestionăm azi bugete de reclamă. Ce apare, și se poate deschide fișier cu fișier, sunt piesele care despart o automatizare de un accident: trimiterea conversiilor offline către Google prin Data Manager API, 264 de linii într-un proiect de producție al nostru; un motor de promovare plătită care cumpără boostere, etichete și pachete cu dry-run pornit implicit; un A/B tester bayesian care refuză să declare câștigător sub 100 de afișări per variantă, și orchestratorul de campanii din MEGA CRM cu întrerupător fără `--force`. Serviciul e descris din aceste piese. Nu dintr-un panou care nu există.

Um agente que trata de campanhas não é um botão com a palavra „otimiza”. É um programa que tem autorização para ler determinados relatórios, autorização para escrever determinados campos e nenhuma autorização para o resto. A parte difícil não é propor uma mudança — os modelos fazem isso bem e depressa. A parte difícil é escrever onde isso pára, como prova o que fez, e o que acontece quando erra. É sobre isso que trata o trabalho, e é daí que começamos a conversa.

Dizemos desde o início o que não temos, para não descobrirem isso por outra pessoa. Hoje não corre connosco um sistema que aumente um orçamento no Google Ads ou que altere uma licitação na Meta. O que corre, e pode ser mostrado linha a linha, são os mecanismos de segurança que escrevemos para outras automatizações que gastam dinheiro real: dry-run ativado por defeito, contador para cada ação paga, temporização em caso de erro para não repetir o erro em ciclo, limiar de prova antes de uma decisão, e um interruptor que recusa arrancar o orquestrador.

A peça que já temos construída não é uma alteração de orçamento, mas um sinal — e é a partir dela que propomos começar. A Google aprende com aquilo que lhe diz que é conversão. Se lhe disser „formulário enviado”, vai procurar pessoas que enviam formulários. Escrevemos a integração que lhe diz „pedido chegou realmente ao sistema do cliente”, com o identificador do clique e com identificadores de utilizador passados por SHA-256, através da Data Manager API. Isso pode começar de imediato, porque é código existente, não uma promessa.

O resto do ambiente de trabalho — a camada que lê relatórios, a camada que propõe, a camada que executa — é construído segundo o mesmo padrão que usamos onde já gastámos dinheiro através de código. Começa-se estritamente por leitura, passa-se a propostas sem execução, e só no fim se abre a execução, campo a campo, com um limite escrito em cada um.

Qué incluye

El trabajo, por componentes

Leia os relatórios, não o painel

Define-se desde o início o que o agente lê e de onde: gasto por campanha e por grupo de anúncios, conversões atribuídas, custo por aquisição, quota de impressões perdida por orçamento face à perdida por posição — dois números diferentes que exigem decisões diferentes. A leitura é feita por API, com uma conta de serviço separada, não por capturas de ecrã da interface. A camada de leitura é entregue e arrancada primeiro, sozinha, sem qualquer permissão de escrita na conta.

Proponha a alteração com o motivo escrito ao lado

Uma proposta não é um número. É o campo que muda, o valor antigo, o valor novo, a janela de dados com base na qual a decisão foi tomada, e o porquê. As propostas são reunidas num relatório que uma pessoa lê, na forma „aumentaria o orçamento diário da campanha X de A para B porque nos últimos N dias esteve limitada por orçamento em M% dos leilões, com um custo por aquisição abaixo do limite acordado”. Se o motivo não puder ser escrito, a proposta não é feita.

Três limites: o que faz sozinho, o que pede a uma pessoa, o que nunca faz

Cada campo entra numa das três categorias, escritas antes de arrancar qualquer coisa. Sozinho: alterações abaixo de uma percentagem acordada, dentro de um teto diário, em campanhas marcadas como abertas. Com aprovação: qualquer ultrapassagem do teto, qualquer campanha nova, qualquer público novo, qualquer alteração de licitação. Nunca: parar uma campanha que não foi iniciada por ele, alterar o método de pagamento, tocar nas contas de faturação. A lista é escrita no contrato, não no código, e o código lê-a.

Dry-run ativado por defeito — o padrão que trazemos connosco

No nosso motor de promoção paga em 999.md, a função que decide se o dinheiro é gasto é escrita ao contrário do habitual: o dry-run está ativo se a variável de ambiente não tiver exatamente o valor `false`. Não definida, vazia, `true`, escrita com erro — tudo mantém o dry-run ativado. É uma escolha deliberada: um erro de configuração não pode abrir a torneira, só pode mantê-la fechada. A mesma função existe em dois lugares independentes, o motor de promoção e o executor de republicação.

Cada ação que custa dinheiro é registada num livro de registo

No sistema de promoção, qualquer execução entra numa tabela `agent_costs` com o anúncio, o utilizador, o tipo de ação, o montante em lei, se foi bem-sucedida, a resposta bruta do fornecedor e uma marcação `dry_run`. A escrita é feita na mesma transação da atualização da programação, por isso não pode existir um gasto sem rasto ou um rasto sem gasto. Quando é dry-run, o montante registado é zero, mas a linha existe — vê-se exatamente o que teria acontecido.

O sinal de conversão real — a peça que já existe

Quando alguém chega de um clique pago e envia um pedido, o sinal só vai para a Google depois de o pedido entrar no sistema do cliente, não ao carregar no botão. A integração usa `https://datamanager.googleapis.com/v1/events:ingest`, envia o identificador do clique, o momento, o valor e a moeda, mais identificadores de utilizador passados por SHA-256 — o endereço normalizado em minúsculas, o telefone colocado no formato internacional. Sem o identificador do clique, o envio pára por si e é marcado como saltado, porque não seria atribuível.

O consentimento é colocado antes das etiquetas, não depois

O Consent Mode v2 é inicializado com todas as finalidades de marketing e análise em `denied`, antes de qualquer script Google arrancar, com uma janela de espera de 500 ms para atualização. Passa para `granted` apenas na interação da pessoa com o banner, sem recarregar a página. O armazenamento funcional e o de segurança ficam ativos, porque sem eles a página não funciona. É escrito uma vez e corre em cada visita.

A decisão entre duas variantes é tomada com base em provas, não em impressão

O testador A/B que construímos modela cada variante como Beta-Binomial com prior uniforme e estima a probabilidade de uma ser melhor através de 10.000 amostras Monte Carlo. Não declara vencedor com menos de 100 impressões por variante e com menos de 0,95 de probabilidade. Se ao fim de 168 horas não tiver sido decidido, fecha o experimento e diz que expirou, em vez de nomear um vencedor que não consegue sustentar.

Um interruptor que não pode ser contornado

O orquestrador de campanhas no nosso sistema interno verifica uma variável de ambiente antes de qualquer coisa. Se estiver definida, recusa-se a arrancar — não existe `--force`, não existe argumento que passe por cima. Foi acrescentado depois de um incidente real de envios duplicados, não como decoração. O mesmo padrão é aplicado aqui: um comutador ao nível da conta que pára todas as escritas, deixando a leitura e a elaboração de relatórios continuar.

Qué aspecto tiene

El recorrido, paso a paso.

01

O inventário das contas e dos direitos

Listam-se as contas de anúncios, quem tem acesso hoje e com que papel, que conversões estão definidas e quais delas são na verdade duplicados do mesmo evento. Estabelecem-se as três listas de campos — sozinho, com aprovação, nunca. Entregamos: o inventário escrito, a lista de conversões com o que cada uma mede realmente, e o acordo sobre as três listas.

02

A camada de leitura, arrancada sozinha

A leitura é ligada via API com uma conta que não tem direito de escrita, e o relatório diário é iniciado. Nada muda nas contas nesta etapa — vê-se apenas o que o agente vê. É o momento em que vêm à tona as conversões que contavam mal, as campanhas limitadas pelo orçamento sem ninguém saber e os públicos que se sobrepõem. Entregamos: o relatório diário e a lista do que encontramos ao ler.

03

O sinal de conversão real

O identificador do clique é captado na página de destino, ligado ao pedido no vosso sistema e enviado para a Google apenas quando o pedido é confirmado a jusante, não ao carregar no botão. É iniciada a nova tentativa para os envios falhados, na janela de 90 dias. Entregamos: a integração funcional, um modo de verificação que envia sem registar, e o registo do que saiu e do que foi saltado e porquê.

04

A camada de propostas, sem execução

O agente começa a escrever propostas: campo, valor antigo, valor novo, motivo, janela de dados. Nada é executado. Corre-se assim até as propostas se tornarem aborrecidas — ou seja, até a pessoa que as lê teria carregado de qualquer forma em “sim” para quase todas. Entregamos: o fluxo de propostas, com tudo o que propôs e o que aprovaram ou rejeitaram, para se ver onde erra.

05

A abertura da execução, campo a campo

É aberta a execução para o primeiro campo da lista “sozinho”, com dry-run ativo por defeito e com limite diário. Verifica-se no registo que o que foi escrito é o que foi proposto. Depois o segundo campo. Entregamos: o registo de ações, o comutador que pára todas as escritas deixando a leitura ativa, e o procedimento escrito para o que fazer quando o agente errou.

Traseul unei decizii1citire prin API cucont fără drept descriere2propunere cu câmp,valoare veche,valoare nouă și motiv3filtrul celor treiliste (singur / cuaprobare / niciodată)4execuție cu dry-runpornit implicit șiplafon zilnic5rând în registrul decosturi, scris înaceeași tranzacțieComutatorul de oprire taie execuția și lasă citirea pornită.
Traseul unei decizii

Os dados

Qué tocamos, dónde están y cuánto se quedan

Las preguntas que hace cualquiera que tenga un delegado de protección de datos — hechas aquí antes de que las haga él.

Que dados acede
Relatórios de campanha, grupo de anúncios e palavra-chave lidos via API. O identificador de clique do anúncio, capturado a partir do endereço da página de destino e guardado no pedido do cliente. Eventos de conversão com momento, valor e moeda. A pedido explícito, o endereço de email e o telefone da pessoa que converteu, mas apenas sob forma de resumo criptográfico.
O que segue para o Google e em que forma
O identificador do clique segue em claro — é isso que ele é, um identificador de clique. O email e o telefone seguem apenas como SHA-256, calculado localmente antes do envio: o email limpo de espaços e convertido para minúsculas, o telefone convertido para o formato internacional. O endereço postal não é enviado de todo, porque o esquema Google o pede completo com código postal e código de região, e o código postal não é consistente nos dados reais — o motivo está escrito no código, não presumido.
Onde ficam e quem os vê
Os dados de campanha e os eventos ficam na base do vosso projeto, na infraestrutura acordada. As credenciais das contas de publicidade ficam num ficheiro de ambiente lido pelo serviço do sistema, não no código nem no repositório de fontes. O token de acesso é mantido na memória por no máximo 55 minutos, embora o fornecedor o dê válido por 3.600 segundos — a margem é intencional, para que nunca seja usado um expirado.
Durante quanto tempo ainda pode ser enviado um evento
A janela prática é de 90 dias a partir do momento da conversão — é isso que o Google aceita para conversões offline. A repetição das submissões falhadas funciona exatamente dentro desta janela, em lotes, com no máximo cinco tentativas por pedido. Após cinco tentativas, o pedido é deixado em paz e permanece marcado como não enviado, em vez de ser repetido indefinidamente.
O que não fazemos com os dados
Não construímos publicamente a partir das vossas listas de clientes sem uma base legal escrita e sem aparecer na informação que a pessoa vê. Não transferimos dados entre as contas de dois clientes diferentes. Não guardamos cópias dos relatórios de campanha fora do sistema acordado. O registo de tratamentos é preenchido antes do primeiro envio, não depois.

Un caso

Uma campanha que pagava por formulários, não por pedidos

A situação

Uma plataforma de Chișinău que recebe pedidos online comprava tráfego de pesquisa. A conversão definida na conta de publicidade era “formulário enviado”. O algoritmo de licitação fazia exatamente o que lhe era pedido: trazia pessoas que enviam formulários. Quantos deles se tornavam pedidos reais, mais adiante na cadeia, nunca chegava de volta à plataforma de publicidade.

Qué construimos

Transferimos o momento da conversão para mais tarde na cadeia. O identificador do clique é captado na página de destino e guardado no pedido. O pedido segue para o sistema a jusante; se este devolver um identificador próprio — ou seja, se tiver realmente entrado — só então o evento é enviado para a Google, através da Data Manager API, com o momento, o valor, a moeda e identificadores de utilizador passados por SHA-256. Sem identificador de clique, o envio para automaticamente e é marcado como ignorado. Acrescentámos um job de nova tentativa que procura os pedidos com identificador de clique e sem marcação de envio, nos últimos 90 dias, em lotes de 50, com no máximo cinco tentativas.

Qué salió

O sinal que a plataforma de publicidade recebe descreve agora os pedidos que chegam ao destino, não os cliques em botão. Todas as operações são inertes se a integração não estiver configurada ou estiver desligada — a função verifica todas as sete credenciais antes de qualquer coisa, e devolve “ignorado” se faltar uma. Os erros são registados, mas não se propagam: se o Google não responder, o pedido do cliente segue em frente intacto.

Qué no dice el caso

Esta é uma integração de sinal, não de gestão de campanha. Não altera nenhum orçamento nem nenhuma licitação. O efeito sobre o custo por aquisição não foi medido por nós e não o publicamos — no código existe uma expectativa escrita do autor, não uma medição, e entre as duas está toda a diferença.

Perguntas

Lo que nos pregunta la gente antes de llamar

Quem assume a responsabilidade quando o agente aumenta um orçamento e a despesa sobe?

Vocês. E por isso o ambiente é construído para que possam assumir a responsabilidade em conhecimento de causa, não para vos apanhar de surpresa. Concretamente: o agente não tem nenhuma permissão de escrita que alguém não lhe tenha dado por nome, por escrito, campo a campo; cada campo aberto tem um limite acima do qual a proposta segue para aprovação humana; cada ação executada é escrita num registo com o valor antigo, o valor novo e o motivo, na mesma transação da execução; e existe um comutador que interrompe todas as escritas sem interromper a leitura. Nós respondemos pelo que construímos — que os limites que escreveram são respeitados pelo código, que o registo está completo, que a paragem funciona. Não respondemos pelo resultado comercial de uma alteração que aprovaram, tal como também não responde a agência que carrega no botão manual. Se alguém vos prometer outra coisa, perguntem-lhe o que diz o contrato no capítulo da limitação da responsabilidade.

Hoje vocês têm um sistema que gere campanhas Google Ads ou Meta?

Não. Em lado nenhum do nosso código aparece qualquer campo através do qual se altere um orçamento, uma licitação ou uma estratégia de licitação no Google ou na Meta. Verificámos procurando exatamente esses nomes de campos em todos os repositórios. O que temos é o envio das conversões para o Google, um motor que compra promoção paga noutra plataforma, e os mecanismos de segurança à volta disso. O serviço é construído a partir daí, e é marcado como oferta precisamente para não haver confusão.

Então o que é que já construíram e gasta dinheiro real?

O nosso motor de promoção paga numa plataforma de anúncios classificados da Moldávia. Coloca etiquetas pagas, inicia boosters com limite diário e preço por clique, ativa pacotes e republica anúncios após um intervalo calculado a partir da velocidade real da categoria. Recusa iniciar um booster cujo limite diário não seja superior ao preço por clique — uma verificação pequena, mas exatamente o tipo de verificação que normalmente falta. Cada ação passa pela verificação de dry-run antes de qualquer chamada que custa.

O que pode mudar sozinho e o que exige aprovação?

Decide-se em conjunto, antes, e escreve-se. O nosso ponto de partida na discussão: sozinho — ajustes abaixo de um percento acordado do orçamento diário, dentro de um teto diário absoluto, nas campanhas que vocês marcaram como abertas; com aprovação — qualquer ultrapassagem do teto, novas campanhas, novos públicos, qualquer toque nas licitações; nunca — a paragem de campanhas iniciadas por outra pessoa, métodos de pagamento, contas de faturação. Se quiserem tudo sujeito a aprovação no início, é uma escolha válida e nós preferimo-la.

Como é que o agente sabe que uma conversão é real e não um formulário vazio?

Porque o sinal não é enviado ao clicar no botão. Só é enviado quando o pedido é confirmado a jusante, no sistema que conta para vocês — um identificador de pedido devolvido pelo CRM ou pelo parceiro. Até lá, nada aconteceu que mereça ser chamado conversão. A diferença não é cosmética: o algoritmo de licitação do Google aprende com o que lhe enviam, por isso, se lhe enviarem formulários, ele trará pessoas que preenchem formulários.

O que acontece com os dados pessoais de quem converte?

O email e o telefone seguem apenas como resumo criptográfico SHA-256, calculado localmente antes do envio, com normalização — email sem espaços e com letras minúsculas, telefone convertido para formato internacional. O endereço postal não é enviado de todo. Nada é enviado antes de a pessoa ter aceite a finalidade de marketing no banner, porque o Consent Mode começa todo em `denied`. A base legal e a informação escrevem-se antes do primeiro envio, não depois da primeira pergunta de alguém.

O que acontece se a chamada à plataforma de anúncios falhar a meio?

Regista-se a falha com a resposta bruta, e a ação é adiada — no nosso executor de republicação, com o máximo entre o arrefecimento configurado e cinco minutos, explicitamente para que um erro não se transforme num ciclo de chamadas. Os envios de conversões falhados são retomados através de um job separado, em lotes de 50, com no máximo cinco tentativas por pedido, na janela de 90 dias. Após a quinta tentativa, pára e fica marcado como não enviado, para que se veja, não para desaparecer.

Como é que o desligo, completamente e depressa?

O interruptor de escrita. A leitura e o reporte continuam, a execução pára. Nos nossos sistemas existentes isto está implementado de duas formas, ambas verificáveis: uma variável de ambiente que tem de ter exatamente o valor `false` para que se gaste dinheiro — qualquer outra coisa mantém a torneira fechada — e um interruptor no orquestrador de campanhas que recusa o arranque e não tem `--force`. Não dependemos de um botão numa interface que pode não carregar.

Garantem-me uma redução do custo por aquisição?

Não, e vale a pena dizer porquê, porque no nosso código existe exatamente esse número. No comentário no início da integração de conversões está escrita uma expectativa — quanto poderia descer o custo por aquisição e quanto poderia subir a quota de impressões. É uma expectativa escrita por quem a construiu, não uma medição, e por isso não a encontrará em lado nenhum neste site como resultado. O que vos podemos prometer é que a medição poderá ser feita: com conversões que significam algo e com um registo de cada alteração, a comparação antes-depois torna-se possível. Sem isso, não é.

Em que se baseiam as afirmações acima (20 fontes)

20 delas são código e ficheiros dos nossos repositórios. Não publicamos o nome nem a linha: juntos, numa única página, descreveriam com demasiada precisão como estão construídos sistemas que não são só nossos. Percorremo-los consigo, no repositório, a pedido — a verificação continua possível, só que se faz numa conversa.

O que gostaria que funcionasse melhor?

Conte-nos o seu processo. Em conjunto decidimos o que vale a pena construir, o que podemos ligar e como verificamos o resultado.

Vamos falar