Skip to main content

Visão Geral

O sistema de assinaturas da Garu permite criar produtos com cobrança recorrente. Com ele você pode:
  • Criar planos com intervalos flexíveis (diário, semanal, mensal, anual)
  • Oferecer períodos de teste gratuito
  • Processar pagamentos automaticamente via cartão de crédito
  • Gerenciar retry automático em caso de falha
  • Permitir que clientes gerenciem suas assinaturas via Portal
Apenas cartão de crédito suporta cobrança recorrente automática. PIX e Boleto requerem pagamento manual a cada ciclo.

Conceitos Principais

TermoDescrição
ProdutoO item ou serviço que você vende (ex: “Plano Premium”)
Preço de AssinaturaUm plano de preço com intervalo e valor (ex: “Mensal R$ 49,90”)
AssinaturaO acordo de cobrança ativo entre você e um cliente
Período de TesteDias gratuitos antes da primeira cobrança
Ciclo de CobrançaIntervalo recorrente das cobranças

Intervalos de Cobrança

IntervaloValorDescrição
DiáriodailyCobrança a cada dia
SemanalweeklyCobrança a cada 7 dias
MensalmonthlyCobrança no mesmo dia todo mês
AnualannuallyCobrança uma vez por ano

Ciclo de Vida da Assinatura

StatusDescrição
pendingAssinatura criada, aguardando primeiro pagamento
activeAssinatura ativa e cobrando normalmente
pending_cancellationCancelamento agendado para fim do período
canceledAssinatura encerrada
failedPagamento falhou após todas as tentativas

Passo a Passo: Criar uma Assinatura

1. Criar o Produto

Primeiro, crie um produto de assinatura. Apenas o name é obrigatório - defina isSubscription: true para indicar que é um produto de assinatura. Veja a API de Criação de Produtos para mais detalhes.
curl -X POST https://garu.com.br/api/products \
  -H "Authorization: Bearer sk_test_sua_chave" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Plano Premium",
    "isSubscription": true
  }'
Para produtos de assinatura, o preço é definido nos preços de assinatura, não no produto. Por isso, não é necessário informar value.
Resposta:
{
  "id": 123,
  "uuid": "prod_abc123xyz",
  "name": "Plano Premium",
  "isSubscription": true,
  "isActive": true
}

2. Criar Preços de Assinatura

Crie um ou mais planos de preço para o produto. Consulte a API de Criação de Preços para todos os campos disponíveis.
# Plano Mensal
curl -X POST https://garu.com.br/api/subscription-prices \
  -H "Authorization: Bearer sk_test_sua_chave" \
  -H "Content-Type: application/json" \
  -d '{
    "productId": "prod_abc123xyz",
    "name": "Plano Mensal",
    "amount": 49.90,
    "billingInterval": "monthly",
    "trialDays": 7
  }'
Resposta:
{
  "id": "price_def456uvw",
  "productId": "prod_abc123xyz",
  "name": "Plano Mensal",
  "amount": 49.90,
  "currency": "BRL",
  "billingInterval": "monthly",
  "trialDays": 7,
  "isActive": true
}
Combine o uuid do produto com o id do preço para gerar o link de pagamento:
https://garu.com.br/pay/{product_uuid}?priceId={price_id}
ParâmetroOrigemExemplo
product_uuidCampo uuid do produtoc69c63d2-4207-4613-ad69-28e7e902544b
price_idCampo id do preçoprice_gNgQVRrG5goab0Ql
Link completo:
https://garu.com.br/pay/c69c63d2-4207-4613-ad69-28e7e902544b?priceId=price_gNgQVRrG5goab0Ql
Salve o uuid do produto e o id do preço no seu banco de dados para gerar links de pagamento a qualquer momento.

4. Cliente Realiza o Checkout

Quando o cliente acessa o link:
  1. Preenche informações pessoais (nome, email, CPF/CNPJ)
  2. Insere dados do cartão de crédito
  3. Sistema valida e cria a assinatura
  4. Se houver período de teste, primeira cobrança é agendada
  5. Cliente recebe confirmação

Período de Teste (Trial)

O período de teste permite que clientes experimentem antes de pagar.

Como Funciona

  1. Assinatura Criada: Status active imediatamente
  2. Durante o Trial: Cliente tem acesso, sem cobranças
  3. Trial Termina: Primeira cobrança processada automaticamente
  4. Cobrança Continua: Ciclo normal de cobrança inicia

Exemplo de Timeline

Para um trial de 14 dias iniciando em 1º de janeiro:
DataEvento
1 JanAssinatura criada, trial inicia
1-14 JanPeríodo de teste (sem cobranças)
15 JanPrimeira cobrança de R$ 49,90
15 FevSegunda cobrança de R$ 49,90
Continua mensalmente
Clientes podem cancelar durante o trial sem serem cobrados.

Lógica de Retry de Pagamento

Quando um pagamento falha, o sistema tenta novamente automaticamente.

Estratégia de Retry

TentativaTimingAção
1ImediatamentePrimeira tentativa
2+3 diasRetry automático
3+3 diasRetry automático
4+3 diasTentativa final
FalhaApós 4ªAssinatura marcada como failed

Motivos Comuns de Falha

MotivoDescrição
insufficient_fundsSaldo insuficiente
card_expiredCartão expirado
card_declinedTransação recusada pelo banco
invalid_cardNúmero ou CVV inválido
fraud_suspectedDetecção de fraude

Cancelamento

Existem duas formas de cancelar uma assinatura. Veja a API de Cancelamento para mais detalhes, ou Pausar e Retomar para opções de pausa temporária.

Cancelamento Imediato

Cliente perde acesso imediatamente:
curl -X POST https://garu.com.br/api/subscriptions/100/cancel \
  -H "Authorization: Bearer sk_test_sua_chave" \
  -d '{"cancelImmediately": true}'

Cancelamento Agendado

Cliente mantém acesso até o fim do período:
curl -X POST https://garu.com.br/api/subscriptions/100/cancel \
  -H "Authorization: Bearer sk_test_sua_chave" \
  -d '{"cancelImmediately": false}'
Resultado:
  • Status muda para pending_cancellation
  • Cliente mantém acesso até o período terminar
  • Nenhuma cobrança adicional
  • No fim do período, status muda para canceled

Portal do Cliente

O Portal permite que assinantes gerenciem suas assinaturas de forma autônoma. Veja a API do Portal do Cliente para configurações avançadas e todos os endpoints disponíveis.

Criando uma Sessão do Portal

curl -X POST https://garu.com.br/api/portal/sessions \
  -H "Authorization: Bearer sk_test_sua_chave" \
  -H "Content-Type: application/json" \
  -d '{
    "customerId": 50,
    "returnUrl": "https://seusite.com/conta"
  }'
Resposta:
{
  "token": "a1b2c3d4e5f6...",
  "expiresAt": "2024-01-15T11:30:00.000Z",
  "portalUrl": "/portal?token=a1b2c3d4e5f6..."
}

URL do Portal

https://garu.com.br/portal?token={session_token}

O que Clientes Podem Fazer

AçãoDescrição
Cancelar assinaturaEncerrar a assinatura
Atualizar pagamentoTrocar cartão de crédito
Atualizar dadosAlterar informações de cobrança
Ver históricoConsultar pagamentos anteriores
Pausar/RetomarPausar temporariamente a cobrança
Configure o Portal em ConfiguraçõesPortal do Cliente no Dashboard.

Webhooks de Assinatura

Configure webhooks para receber notificações em tempo real. Consulte a documentação de Webhooks para implementação completa e validação de assinatura.

Eventos Disponíveis

EventoDescrição
subscription.createdNova assinatura criada
subscription.activatedAssinatura ativada
subscription.payment_successPagamento recorrente confirmado
subscription.payment_failedPagamento falhou (pode haver retry)
subscription.canceledAssinatura cancelada
subscription.trial_endingTrial termina em 3 dias

Exemplo de Payload

{
  "event": "subscription.payment_success",
  "timestamp": "2024-02-15T10:00:00.000Z",
  "data": {
    "subscription": {
      "id": 100,
      "status": "active",
      "customerId": 50
    },
    "payment": {
      "amount": 49.90,
      "transactionId": "tx_abc123",
      "paidAt": "2024-02-15T10:00:00.000Z"
    }
  }
}

Exemplo Completo

const GARU_API = 'https://garu.com.br/api';

class GaruAssinaturas {
  constructor(apiKey) {
    this.apiKey = apiKey;
  }

  async request(method, endpoint, data) {
    const response = await fetch(`${GARU_API}${endpoint}`, {
      method,
      headers: {
        'Authorization': `Bearer ${this.apiKey}`,
        'Content-Type': 'application/json'
      },
      body: data ? JSON.stringify(data) : undefined
    });
    return response.json();
  }

  // Criar produto de assinatura (apenas nome é obrigatório)
  async criarProduto(nome) {
    return this.request('POST', '/products', {
      name: nome,
      isSubscription: true
    });
  }

  // Criar preço de assinatura (productId é o UUID do produto)
  async criarPreco(productId, nome, valor, intervalo, trialDias = 0) {
    return this.request('POST', '/subscription-prices', {
      productId, // UUID do produto (ex: 'prod_abc123xyz')
      name: nome,
      amount: valor, // Valor em Reais (ex: 49.90)
      billingInterval: intervalo, // 'daily', 'weekly', 'monthly', 'annually'
      trialDays: trialDias
    });
  }

  // Gerar link de checkout
  getCheckoutUrl(productUuid, priceId) {
    return `https://garu.com.br/pay/${productUuid}?priceId=${priceId}`;
  }

  // Cancelar assinatura
  async cancelar(subscriptionId, imediatamente = false) {
    return this.request('POST', `/subscriptions/${subscriptionId}/cancel`, {
      cancelImmediately: imediatamente
    });
  }

  // Criar sessão do portal
  async criarSessaoPortal(customerId, returnUrl) {
    return this.request('POST', '/portal/sessions', {
      customerId,
      returnUrl
    });
  }
}

// Uso
const garu = new GaruAssinaturas('sk_test_sua_chave');

// Criar produto (apenas nome é obrigatório)
const produto = await garu.criarProduto('SaaS Premium');
// produto.uuid = 'prod_abc123xyz'

// Criar planos de preço (usando o UUID do produto)
const planoMensal = await garu.criarPreco(produto.uuid, 'Mensal', 49.90, 'monthly', 7);
const planoAnual = await garu.criarPreco(produto.uuid, 'Anual', 479.00, 'annually', 14);

// Links de checkout
console.log('Mensal:', garu.getCheckoutUrl(produto.uuid, planoMensal.id));
console.log('Anual:', garu.getCheckoutUrl(produto.uuid, planoAnual.id));

Próximos Passos

Criar Preço

Crie planos de preço para assinaturas

Listar Assinaturas

Consulte todas as assinaturas

Detalhes da Assinatura

Consulte os detalhes de uma assinatura

Cancelar Assinatura

Cancele uma assinatura

Pausar/Retomar

Pause temporariamente as cobranças

Eventos

Histórico de eventos e pagamentos

Portal do Cliente

Configurar e usar o portal de autoatendimento

Webhooks

Receber notificações de eventos