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>
A Meta passou a exigir esse campo explícito quando o orçamento está no
conjunto (sem CBO), senão a criação falha com erro 100/4834011. Default
false: cada conjunto gasta o próprio orçamento.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Erros do Supabase (PostgrestError) não são Error, então o catch caía no
fallback genérico "Erro ao listar campanhas salvas" e escondia a causa
(tabela ausente, projeto pausado, key inválida). Agora extrai
message/code/details/hint.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- copy passa de gpt-5.4-mini para gpt-5.4 (full), sobrescrevível por
OPENAI_COPY_MODEL; temperatura 0.9 para texto menos engessado
- prompt ganha bloco "proibido ser genérico": exige detalhe concreto por
frase, pattern interrupt na 1a linha, variações realmente distintas
- skin festa_infantil: copy_rules descrevem o fluxo self-service real
(foto -> avatar 3D grátis -> escolher e gerar entre 33 artes; R$9,99 =
10 créditos) e proíbem "receba/kit pronto", forçando verbos de criação
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
O app na Meta ainda não tem o produto/uso de Instagram habilitado, então
pedir instagram_basic dispara "Invalid Scopes" e impede o login. Volta a
lista de escopos para a que funciona; reincluir após ativar no painel.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sem instagram_basic, o campo instagram_business_account de /me/accounts
volta vazio e o app mostra "sem Instagram vinculado" mesmo quando há um
IG profissional conectado à página. Requer relogin para aplicar.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Refina o pipeline de criação de campanhas para produtos de entrada
(ticket baixo, Pix/cartão) com foco em otimização por compra e controle
de custo, evitando prejuízo.
- scraper: lê sites SPA/JS (og tags, JSON-LD com preço/oferta, fallback
de renderização via r.jina.ai) — antes só lia o <title>
- skins: nova skin "Festa Infantil / Produto de Entrada" com copy-rules
de tripwire (Pix = acesso imediato, preço-âncora) e default em Vendas
- create: campanha de Vendas exige Pixel/Dataset e otimiza por
OFFSITE_CONVERSIONS (antes caía para LINK_CLICKS), evento de conversão
selecionável e estratégia Cost Cap (teto de custo por compra)
- corrige bid_strategy pré-mapeado errado no cliente que anulava o Bid Cap
- settings: persiste Pixel/Dataset ID e pré-preenche no formulário
- copy/analyzer: usam oferta, preço e formas de pagamento; variações A/B
(preço / benefício / dor) para resposta direta
- creative: opção de estampar preço/oferta no criativo
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The duplicate buttons pushed the Ações column past the viewport edge.
Reduce horizontal cell padding (16px -> 10px across all 10 columns) and
tighten the campaign-row action button gap so the full row fits without
horizontal cutoff.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
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>
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>
Some ad accounts aren't authorized to use the Instagram account that's
auto-detected from the existing ad set, causing Meta error 200/1815199
on publish. The new selector lists all of the user's connected Pages
(with linked Instagram accounts) so they can choose a valid combination
themselves, falling back to the auto-detected default. Also paginate
/me/accounts so accounts beyond the first page show up.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
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>
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>
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>