Skip to content

Desafio 16: Antecipação de Recebíveis — O Mercado de R$ 500 Bi que Move o Brasil

🇧🇷 Crédito sobre Vendas Futuras
🇬🇧 Receivables Financing


A Antecipação de Recebíveis permite merchants receberem hoje vendas no cartão que só seriam pagas em 30, 60 ou 90 dias. Movimenta mais de R$ 500 bilhões por ano e é a principal receita de Stone, PagSeguro e Mercado Pago.

Switch: TypeScript vs Go

O que é Antecipação?

ConceitoDescrição
D+30Prazo padrão de recebimento (30 dias)
MDRTaxa do adquirente (1,5-3% por transação)
SpreadMargem do banco na antecipação (2-8% a.a.)
IOFImposto: 0,38% + 0,0041% ao dia
CETCusto Efetivo Total anualizado
FIDCFundo de Investimento em Direitos Creditórios

Matemática da Antecipação

typescript
// Cálculo de antecipação de R$ 10.000 em 30 dias
const valorFuturo = 10000;
const dias = 30;
const taxaAnual = 0.18; // 18% a.a. (CDI + spread)
const iof = 0.0038 + (0.000041 * dias);
const taxaFixa = 10;

const taxaDiaria = Math.pow(1 + taxaAnual, 1/365) - 1;
const desconto = valorFuturo * (Math.pow(1 + taxaDiaria, dias) - 1);
const valorIOF = valorFuturo * iof;
const valorLiquido = valorFuturo - desconto - valorIOF - taxaFixa;

// Valor Líquido: R$ 9.795,33
// CET: 18.00% a.a.

Fluxo Completo

Arquitetura

Pricing Engine

typescript
export class PricingEngine {
  public async calculateQuote(merchantId: string, receivables: Receivable[]) {
    const cdiRate = await this.marketData.getCDIRate();
    const riskPremium = this.calculateRiskPremium(merchant);
    const spread = this.calculateSpread(merchant);
    const totalRate = cdiRate + spread + riskPremium;

    let grossAmount = 0, discountAmount = 0, iofAmount = 0;

    for (const r of receivables) {
      const days = r.daysUntilPayment();
      const dailyRate = Math.pow(1 + totalRate, 1/365) - 1;
      const discount = r.netAmount * (Math.pow(1 + dailyRate, days) - 1);
      const iof = r.netAmount * (0.0038 + 0.000041 * days);

      grossAmount += r.netAmount;
      discountAmount += discount;
      iofAmount += iof;
    }

    return {
      grossAmount, discountAmount, iofAmount,
      netAmount: grossAmount - discountAmount - iofAmount - 10,
      effectiveRate: this.calculateCET(grossAmount, grossAmount - discountAmount - iofAmount, avgDays),
    };
  }

  private calculateRiskPremium(merchant: Merchant): number {
    const ratingFactors: Record<string, number> = {
      'AAA': 0.000, 'AA': 0.005, 'A': 0.010,
      'BBB': 0.020, 'BB': 0.035, 'B': 0.050, 'CCC': 0.080,
    };
    let risk = ratingFactors[merchant.creditRating] || 0.10;
    if (merchant.chargebackRate > 0.02) risk += 0.02;
    if (this.monthsSince(merchant.createdAt) < 6) risk += 0.015;
    return risk;
  }
}

Risk Engine

typescript
export class RiskEngine {
  public async evaluate(input: RiskEvaluationInput) {
    const creditData = await this.creditBureau.query({ document: merchant.document });
    const history = await this.historyRepo.findByMerchant(input.merchantId, { months: 12 });
    const fraudCheck = await this.fraudService.evaluateAnticipation({ ... });

    const finalScore = Math.round(
      creditData.score * 0.35 +
      this.calculateHistoryScore(history) * 0.30 +
      this.calculateBehaviorScore(merchant, input) * 0.20 +
      fraudCheck.score * 0.15
    );

    return {
      approved: finalScore >= 500 && input.totalAmount <= limits.maxAmount,
      score: finalScore,
      riskLevel: finalScore >= 800 ? 'LOW' : finalScore >= 650 ? 'MEDIUM' : 'HIGH',
    };
  }
}

Comparação: TypeScript vs Go

AspectoTypeScriptGo
MathNumber (ok)shopspring/decimal
BatchWorker threadsGoroutines
1M recebíveis~14 minutos~80 segundos
Quote P99180-1200ms45-280ms
Memory~2GB~100MB

Casos Reais

  • Stone (Go) — Líder, R$ 100+ bi/ano, P99 < 200ms
  • PagSeguro (Go + Java) — 40M clientes, auto-antecipação
  • Mercado Pago (Go) — Maior da Latam, dynamic pricing
  • Creditas (Go) — Nicho PME, FIDC próprio

Como testar

bash
# TypeScript
pnpm --filter @banking/anticipation dev

# Go
cd packages/backend/anticipation-go
go run .

# Simular cotação
curl -X POST http://localhost:3010/anticipation/quote \
  -H "Content-Type: application/json" \
  -d '{"receivableIds":["uuid1","uuid2"]}'

Lições aprendidas

  1. R$ 500+ bi/ano — Maior mercado de crédito do Brasil
  2. Matemática precisa é crítica — Centavos importam em escala
  3. shopspring/decimal — Nunca float nativo pra dinheiro em Go
  4. Batch processing — 50M+ recebíveis/dia em grandes adquirentes
  5. Risk engine multi-camada — Crédito + histórico + comportamento + fraude
  6. Funding sources — Capital próprio, FIDCs, bancos atacadistas
  7. Chargeback é o maior risco — Merchant pode sumir
  8. CET precisa ser divulgado — Exigência BACEN
  9. Go processa 1M em 80s — vs 14min em TypeScript
  10. Stone, PagSeguro e Mercado Pago — Todos usam Go no core