UGC Reactions from Real Creators
Real creator library videos at $11 and images at $8. Custom production from $25/video with a $250 minimum. Commercial licensing included.
翻訳待ち
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Sistema multicliente de inteligência de tráfego pago. Conecta a conta de anúncios da Meta de cada cliente, cruza a mídia com as vendas e mostra quais anúncios trazem venda, não só clique ou conversa.
Stack: Next.js 16 (App Router), Supabase (Postgres com RLS, Auth, Storage, pgmq, pg_cron, pg_net, Vault) e Vercel.
O roteiro para validar o piloto (GN Coleciona, campanha de 3/11) está em docs/roteiro-teste-piloto.md.
| Pasta | O quê |
|---|---|
supabase/migrations/ | Esquema, RLS e funções. Toda tabela de dados tem organizacao_id, e o isolamento entre clientes é feito no banco. |
src/lib/auth/sessao.ts | Quem está logado e com que papel (dono, gestor, leitura) em qual organização. |
src/lib/integracoes/ | Clientes da Meta (só leitura) e do Stripe. |
src/lib/meta/sincronizacao.ts | Sincronização da Meta: fatiada por mês, retomável pelo cursor. |
src/lib/vendas/ | Entrada de leads e vendas, comum a todas as fontes (webhook, Stripe, CSV). |
src/lib/rastreio/ | Regras de rastreio e o teste de ponta a ponta. |
src/lib/jobs/worker.ts | Worker da fila. |
tests/banco/ | Testes de RLS e das consultas num Postgres em memória (PGlite). |
Crie um projeto em supabase.com (região São Paulo).
Em Authentication → Sign In / Providers:
Em Authentication → URL Configuration:
https://ads.seudominio.com.br);https://ads.seudominio.com.br/** às Redirect URLs.Aplique as migrações:
npm install
npx supabase login
npm run db:vincular -- --project-ref <ref-do-projeto>
npm run db:aplicar
Elas criam as tabelas, o RLS, a fila jobs (pgmq), os agendamentos (pg_cron) e o bucket privado criativos.
No SQL Editor, crie os dois segredos que o agendador usa para acordar o worker:
select vault.create_secret('https://ads.seudominio.com.br/api/jobs/processar', 'worker_url');
select vault.create_secret('<mesmo valor de SEGREDO_WORKER>', 'worker_segredo');
Copie .env.example para .env.local (desenvolvimento) e preencha as mesmas variáveis na Vercel (Settings → Environment Variables):
| Variável | Onde pegar |
|---|---|
NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_ANON_KEY, SUPABASE_SERVICE_ROLE_KEY | Supabase → Project Settings → API |
CHAVE_CIFRAGEM | Gere com node -e "console.log(require('crypto').randomBytes(32).toString('base64'))". Ela cifra as credenciais dos clientes. Guarde num cofre: se ela se perder, todas as conexões precisam ser cadastradas de novo. |
SEGREDO_WORKER | Gere com o mesmo comando. Use o mesmo valor no segredo worker_segredo do Vault. |
URL_SISTEMA | Endereço público do sistema |
META_API_VERSION | v26.0 |
Importe o repositório. É preciso o plano Pro: o worker roda até 5 minutos por chamada (maxDuration = 300), e o plano gratuito corta antes.
npm run criar-admin -- [email protected]
Se a conta não existir, o comando a cria e mostra uma senha provisória uma vez.
Em /o/<organização>/configurar, o assistente leva a pessoa por seis etapas: negócio, Meta, página de destino, fonte de venda, teste completo e resumo. Uma organização nova cai direto nele, e a tela Início mostra onde retomar.
O andamento não é marcado à mão: vem do que o sistema confere (src/lib/onboarding/modelo.ts). Um token removido, por exemplo, volta a aparecer como pendente. As respostas ficam em organizacoes.onboarding.
gn-coleciona). Você entra como dono da organização.Em Configurações → Meta, cole o token de um usuário do sistema do portfólio empresarial do cliente, com ads_read e acesso à conta de anúncios. O passo a passo aparece na própria tela.
/me e /me/adaccounts) e guardado cifrado.offsite_conversion.fb_pixel_complete_registration. A lista mostra as ações que já apareceram nas campanhas.Webhook genérico (qualquer site ou ferramenta de automação):
POST /api/webhook/eventos, com Authorization: Bearer whk_….lead, teste_iniciado, venda e reembolso, um por vez ou { "eventos": [...] }.Stripe:
user_id).invoice.paid, customer.subscription.created, customer.subscription.updated, customer.subscription.deleted e charge.refunded.whsec_… na tela e clique em Importar histórico para trazer os últimos 365 dias.This is the beginning of the README. Read the rest at the original. Read the full README ↗