DoceFlow · ativação

Ligar o DoceFlow — tudo num lugar só

Faça na ordem. Ao terminar os secrets, me avise que eu faço o redeploy e a gente testa cobrança + entrada de equipe. As caixinhas ficam salvas neste navegador. 💛

0 de 0 concluído

1 Rodar os SQLs no Supabase

No Supabase → projeto kqpvtckdepzymughclgrSQL Editor → New query → cola → Run. Podem rodar sem medo (idempotentes).
Planos você já rodou ✓
Coluna do plano na confeitaria.
alter table df_config
  add column if not exists plano text not null default 'completo',
  add column if not exists plano_status text default 'ativo',
  add column if not exists trial_ate date;
Academy (aulas) você já rodou ✓
Tabela das aulas do Premium.
create table if not exists academy_aulas (
  id uuid primary key default gen_random_uuid(),
  modulo text not null default 'Aulas',
  titulo text not null,
  descricao text,
  video_url text,
  ordem int default 0,
  criado_em timestamptz default now()
);
alter table academy_aulas enable row level security;
drop policy if exists academy_aulas_read on academy_aulas;
create policy academy_aulas_read on academy_aulas
  for select to authenticated using (true);
Checkout Asaas você já rodou ✓
Campos do Asaas na confeitaria.
alter table df_config
  add column if not exists asaas_customer_id text,
  add column if not exists asaas_subscription_id text;
Código da equipe (multiusuário) falta rodar
Deixa a ajudante entrar sem o seu e-mail/senha.
alter table empresas add column if not exists codigo_equipe text;
create unique index if not exists idx_empresas_codigo_equipe on empresas(codigo_equipe) where codigo_equipe is not null;

create table if not exists equipe_credenciais (
  empresa_id uuid primary key references empresas(id) on delete cascade,
  email text not null,
  senha text not null,
  user_id uuid,
  criado_em timestamptz default now()
);
alter table equipe_credenciais enable row level security;

create or replace function girar_codigo_equipe()
returns text language plpgsql security definer set search_path = public as $$
declare emp uuid; novo text;
begin
  emp := empresa_atual();
  if emp is null then raise exception 'sem empresa'; end if;
  novo := upper(substr(replace(gen_random_uuid()::text,'-',''),1,8));
  update empresas set codigo_equipe = novo where id = emp;
  return novo;
end $$;
revoke all on function girar_codigo_equipe() from public;
grant execute on function girar_codigo_equipe() to authenticated;

2 Setar os 5 secrets no Cloudflare

Cloudflare → Pages → doceflow → Settings → Environment variables → adicione como Secret (encrypt). Estas 5 ligam a cobrança E o login de equipe de uma vez.
VariávelValor
ASAAS_API_KEYSua chave do Asaas (Configurações → Integrações → API Key). Comece no Sandbox.
ASAAS_ENVsandbox (teste) ou prod (dinheiro real)
ASAAS_WEBHOOK_TOKENUm código forte que você inventa (ex.: doceflow-2026-xYz9). Guarde — usa igual no passo 3.
SUPABASE_URLhttps://kqpvtckdepzymughclgr.supabase.co
SUPABASE_SERVICE_ROLE_KEYSupabase → Settings → API → service_role (secreta! cola só aqui, nunca no chat).
Marquei quando as 5 estiverem salvas

3 Cadastrar o webhook no Asaas

Asaas → Integrações → Webhooks → Adicionar.
URLhttps://doceflow.pages.dev/api/asaas-webhook
TokenO mesmo ASAAS_WEBHOOK_TOKEN do passo 2
EventosCobranças (confirmada / recebida / atrasada) + Assinaturas
Webhook cadastrado

4 Me avisar → eu ligo o resto

Assim que terminar 1, 2 e 3, me chama no chat. Eu faço o redeploy (pra o app pegar os secrets) e a gente testa junto:
Avisei a Karen (a IA) que liguei tudo
Aí testamos: assinar um plano no sandbox + entrar com o código da equipe.
Dica: depois de rodar o SQL do passo 1, teste a troca de plano e o Código da equipe (em Minha marca) — já funcionam mesmo antes dos secrets. Os secrets são só pra cobrança real e login da ajudante.