Commit graph

10 commits

Author SHA1 Message Date
8ebbe079ec diag: revelar o motivo de a customização por posicionamento falhar
As 3 imagens sobem, mas a Meta recusa montar o criativo com elas e o app
cai pra 1 imagem silenciosamente. Agora o erro real da Meta é logado
([Placement]) e devolvido na resposta (placement_error), aparecendo na
tela final — pra diagnosticar e corrigir a estrutura do asset_feed_spec.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 14:21:28 -03:00
adc6580848 fix: priorizar imagem única + Instagram sobre as 3 imagens (1772103)
A cascata anterior, ao falhar a customização por posicionamento, podia
derrubar o Instagram e deixar criativo sem IG num ad set que mira IG —
gerando 1772103. Agora: se a customização (asset_feed_spec) falhar, cai
para imagem única MANTENDO o Instagram (caminho comprovado). O IG só é
removido se o próprio criativo de imagem única falhar com erro de IG.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 13:08:04 -03:00
349203b761 feat: opção de subir a campanha já ativa (no ar)
Antes tudo subia PAUSED por padrão. Agora o pipeline propaga um status
comum para campanha, conjunto e anúncio (os 3 precisam estar ACTIVE para
entregar). A rota aceita activate=true e o Preview ganha um toggle
"Iniciar a campanha já ativa" (default desmarcado = pausada para revisão).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 12:47:18 -03:00
6068f77b09 feat: usar as 3 imagens por posicionamento (placement customization)
Antes o criativo usava só a imagem quadrada. Agora, quando há >=2 imagens
geradas, monta o criativo com Placement Asset Customization: 1:1 no feed,
9:16 em stories/reels e 1.91:1 na coluna direita — em ad set normal
(não-dinâmico), com object_story_spec mantendo page_id/IG.

Cascata de fallback segura: se a Meta recusar a customização, refaz com a
imagem única (comportamento antigo estável); se recusar o IG, refaz só
com Facebook. Publicação nunca quebra por causa disso.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 12:40:29 -03:00
87fdacfb3d fix: fallback p/ Facebook quando instagram_actor_id é inválido
O fallback que refaz o criativo só com Facebook só pegava o erro de
permissão (1815199). Agora também cobre "instagram_actor_id must be a
valid Instagram account id", evitando que um IG incompatível (ex: conta
do fluxo de login do Instagram) bloqueie a publicação inteira.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 12:19:27 -03:00
38f5dc444f feat: duplicate campaigns, ad sets and ads like the Meta Ads Manager
Adds a "Duplicar" button on every campaign, ad set and ad row, mirroring
the native Duplicate in Ads Manager. Uses Meta's /copies endpoint with
deep_copy for campaigns/ad sets (children come along) and always creates
the copy as PAUSED with a " - Cópia" suffix so it's safe to review before
activating. This lets users grow a campaign by cloning: duplicate an ad
for a new creative, duplicate an ad set for a new "subcampanha", or
duplicate a whole campaign.

Backend: copy_campaign/copy_adset/copy_ad tools in the Graph wrapper,
duplicateEntity() helper, and a single POST /api/meta/duplicate route.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-08 14:33:24 -03:00
a88e96adf5 fix: fall back to Facebook-only when ad account can't use the page's Instagram
Meta rejects the whole ad creative with error 200/1815199 when the ad
account isn't authorized (in Business Manager) to use the Instagram
account linked to the chosen page. Picking a different page in the new
selector doesn't help if that page's IG is also unshared. Now, when the
creative fails for that specific reason, we retry without
instagram_actor_id so the ad still publishes on Facebook, and the modal
explains why Instagram was dropped and how to enable it.

createFullCampaign gets the same fallback for free.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-08 14:21:18 -03:00
b4ad2e0585 feat: pre-preenche contexto do modal de novo anuncio com a copy existente
A geracao de copy/imagem por IA exigia que o usuario descrevesse o
anuncio do zero. Agora getAdSetDefaultCreative tambem extrai o texto
do criativo de um anuncio ja existente no ad set (headline, mensagem
e descricao) e o AddAdModal usa isso para preencher automaticamente
o campo de contexto, permitindo gerar variacoes no mesmo tom sem
digitar nada.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-08 13:18:41 -03:00
d2406f0152 feat: permite adicionar novos anuncios a campanhas ja ativas
Adiciona modal "+ Anuncio" na tabela de campanhas que reaproveita o
fluxo de geracao de copy/imagem por IA para publicar novos criativos
no mesmo ad set existente, mantendo orcamento e segmentacao.

- Extrai pipeline de upload+criativo+anuncio (addAdToAdSet) do
  createFullCampaign para reuso
- Adiciona get_adset_default_creative para pre-preencher pagina,
  link, instagram e CTA com base em anuncio ja existente no ad set
- Novas rotas POST /api/adsets/[id]/ads e
  GET /api/adsets/[id]/creative-defaults
- Novo componente AddAdModal com geracao de copy/imagem via IA ou
  upload manual

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-08 12:54:00 -03:00
Marcio Bevervanso
234314d1c6 Publish MetaAds Pro: AI-driven Meta Ads campaign management dashboard
Full app with AI campaign creation/copy/creative generation, dashboard,
campaign automation engine, Meta OAuth login, and a redesigned landing page.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-07 19:30:33 -03:00