🚀 Oferta especial: 60% OFF no CrazyStack - Últimas vagas!Garantir vaga →
Voltar ao Curso
Módulo 4
Aula 13
40 min

Estruturas de Mercado SaaS

Da competição perfeita ao monopólio: framework microeconômico para decisões estratégicas.

Aula MIT #7: Competition in the Short Run

Conceitos-chave: Perfect competition, price-taking, profit maximization (P=MC), shutdown rule, market equilibrium

Aula MIT #9: Welfare Economics (Consumer & Producer Surplus)

Conceitos-chave: Consumer surplus, producer surplus, primeira teoria fundamental da economia de bem-estar, deadweight loss, welfare maximization

Por que estruturas de mercado são críticas em SaaS

Determina tudo: pricing power, margens, CAC, LTV, estratégia de crescimento e defensibilidade. A estrutura de mercado que você enfrenta define se você é price-taker (aceita preços do mercado) ou price-maker (define seus próprios preços).

Impacto no Pricing

Competição perfeita → P=MC (zero lucro econômico). Monopólio → P > MC (lucro maximizado)

Estratégia de Entrada

Oligopólio exige diferenciação brutal. Competição monopolística permite niching

Taxonomia: 4 Estruturas de Mercado

A teoria microeconômica classifica mercados em 4 estruturas básicas, determinadas por 2 eixos: número de firmas e grau de diferenciação de produto.

1. Competição Perfeita
CARACTERÍSTICAS:
  • Infinitas firmas (ou muitas)
  • Produtos idênticos (commodities)
  • Price-takers: nenhuma firma afeta preço
  • Demanda perfeitamente elástica ao nível da firma
  • Zero custos de transação, informação perfeita
EXEMPLOS EM SAAS (RAROS):

• Cloud storage (S3, GCS, Azure Blob) — quase commodity
• CDN básico — Cloudflare, Fastly
• Compute resources (EC2, VMs) — diferenciação mínima

REGRA:

P = MC

Lucro econômico = 0 no longo prazo

2. Concorrência Monopolística
CARACTERÍSTICAS:
  • Muitas firmas (mas não infinitas)
  • Produtos diferenciados (features, UX, brand)
  • Algum poder de pricing (downward sloping demand)
  • Entrada/saída relativamente fácil
  • Marketing e diferenciação importam
EXEMPLOS EM SAAS (MAIORIA):

• Project management — Asana, Monday, ClickUp, Trello
• Email marketing — Mailchimp, ConvertKit, Sendinblue
• Form builders — Typeform, Google Forms, Jotform

REGRA:

MR = MC

P > MC, mas lucro tende a zero no longo prazo (entrada de competidores)

3. Oligopólio
CARACTERÍSTICAS:
  • Poucas firmas dominantes (2-10 players)
  • Produtos diferenciados ou idênticos
  • Interdependência estratégica: decisões afetam rivais
  • Altas barreiras à entrada (capital, tecnologia, rede)
  • Pricing power moderado a alto
EXEMPLOS EM SAAS:

• CRM — Salesforce, HubSpot, Zoho
• Video conferencing — Zoom, Teams, Google Meet
• Cloud providers — AWS, Azure, GCP

REGRA:

Teoria dos Jogos (Nash Equilibrium)

Lucros positivos sustentáveis devido a barreiras

4. Monopólio
CARACTERÍSTICAS:
  • Uma única firma
  • Produto único (sem substitutos próximos)
  • Price-maker: controle total sobre preço
  • Barreiras à entrada insuperáveis
  • Demanda de mercado = demanda da firma
EXEMPLOS EM SAAS (TEMPORÁRIOS):

• Slack (2013-2016) — antes do Teams e Discord
• Notion (2018-2020) — antes de Coda e outros
• Snowflake (2015-2018) — data warehousing moderno

REGRA:

MR = MC, P >> MC

Lucros maximizados, dead-weight loss social

Onde SaaS se encaixa na prática

85% dos mercados SaaS são concorrência monopolística. Poucas empresas atingem oligopólio (AWS, Salesforce) e monopólios são sempre temporários em tech (regulação + inovação). Competição perfeita é rara porque SaaS tem alto switching cost, integração e lock-in.

Competição Perfeita: Teoria Fundamental

Vamos começar com o extremo teórico da competição perfeita porque ela fornece o baseline para entender todas as outras estruturas. Na competição perfeita, firmas são price-takers.

Definição técnica: Price-Taker

Uma firma é price-taker quando nenhuma ação que ela faça pode afetar o preço de mercado. Isso ocorre quando a demanda para a output da firma é perfeitamente elástica.

Demanda perfeitamente elástica:

Ed = ∞ (elasticidade infinita)
P = constante (preço fixo, independente de q)
Curva de demanda: linha horizontal em P*

Intuição: Se você tentar cobrar $0.01 acima do preço de mercado, suas vendas caem a zero (consumidores compram dos concorrentes). Se você cobrar abaixo, você vende tudo instantaneamente, mas não maximiza lucro.

3 Suposições para Competição Perfeita

📦

1. Produtos Idênticos

Não há diferenciação. Um GB de storage S3 é idêntico a um GB no Google Cloud Storage. Consumidores são indiferentes.

🔍

2. Informação Transparente

Todo consumidor sabe o preço de cada firma. Sem assimetria de informação. Sites como CloudPricing.io facilitam isso.

3. Zero Custos de Transação

Fácil de trocar de fornecedor. Sem switching costs, lock-in ou integração complexa. APIs padronizadas facilitam.

Exemplo canônico: Torre Eiffel souvenirs

Ao redor da Torre Eiffel, há centenas de vendedores vendendo exatamente as mesmas mini torres Eiffel. Um estudante do MIT (no vídeo do professor Gruber) testou empiricamente: todos cobravam o mesmo preço.

Por que? Porque violações das 3 suposições causam desvios imediatos. Se um vendedor cobra mais, todos vão ao lado. Se cobra menos, não maximiza lucro. O equilíbrio é P = MC.

Maximização de Lucro: P = MC

Como uma firma maximiza lucros em competição perfeita? A regra é simples: produza até o ponto onde P = MC.

Derivação: P = MC

Função de lucro:

// Função de lucro
π(q) = R(q) - C(q)

// Onde:
// π = profit (lucro)
// R(q) = revenue como função de quantidade
// C(q) = cost como função de quantidade
// q = quantidade produzida pela firma

Condição de primeira ordem:

// Para maximizar π, derivamos e igualamos a zero:
/dq = dR/dq - dC/dq = 0

// Ou seja:
dR/dq = dC/dq

// Marginal Revenue = Marginal Cost
MR = MC

Em competição perfeita, MR = P:

// Por que MR = P?
// Porque a firma é price-taker. Cada unidade vendida gera P.

R(q) = P × q  // Receita total
dR/dq = P     // Marginal revenue = preço

// Logo:
MR = P

// Substituindo na condição de primeira ordem:
P = MC  // Regra de maximização de lucro!

Exemplo: Cloud Storage SaaS

Imagine um mercado perfeitamente competitivo de storage (hipotético). Função de custo: C = 10 + 5q²

class PerfectCompetitionFirm {
  constructor(fixedCost, variableCostCoeff) {
    this.FC = fixedCost;       // $10 (servers, infra)
    this.VC_coeff = variableCostCoeff;  // 5 (custo por q²)
  }

  // Função de custo: C = FC + VC_coeff * q²
  totalCost(q) {
    return this.FC + this.VC_coeff * Math.pow(q, 2);
  }

  // Custo marginal: MC = dC/dq = 2 * VC_coeff * q
  marginalCost(q) {
    return 2 * this.VC_coeff * q;
  }

  // Custo médio: AC = C/q = FC/q + VC_coeff * q
  averageCost(q) {
    return this.FC / q + this.VC_coeff * q;
  }

  // Custo variável médio: AVC = VC/q = VC_coeff * q
  averageVariableCost(q) {
    return this.VC_coeff * q;
  }

  // Maximização de lucro: P = MC → q* = P / (2*VC_coeff)
  optimalQuantity(marketPrice) {
    return marketPrice / (2 * this.VC_coeff);
  }

  // Lucro: π = P*q - C(q)
  profit(marketPrice) {
    const q = this.optimalQuantity(marketPrice);
    const revenue = marketPrice * q;
    const cost = this.totalCost(q);
    return revenue - cost;
  }

  // Shutdown check: continuar operando se P > AVC
  shouldOperate(marketPrice) {
    const q = this.optimalQuantity(marketPrice);
    const avc = this.averageVariableCost(q);
    return marketPrice > avc;
  }
}

// Exemplo: mercado com P = $30
const firm = new PerfectCompetitionFirm(10, 5);
const P = 30;

console.log('=== PERFECT COMPETITION ANALYSIS ===');
console.log(`Market Price: $${P}`);

// Quantidade ótima: P = MC → 30 = 10q → q* = 3
const q_star = firm.optimalQuantity(P);
console.log(`Optimal Quantity: ${q_star} TB/month`);

// Custo total e receita
const revenue = P * q_star;
const cost = firm.totalCost(q_star);
const profit = firm.profit(P);

console.log(`Revenue: $${revenue}`);
console.log(`Total Cost: $${cost}`);
console.log(`Profit: $${profit}`);

// Análise marginal
const mc = firm.marginalCost(q_star);
const ac = firm.averageCost(q_star);
const avc = firm.averageVariableCost(q_star);

console.log('');
console.log('MARGINAL ANALYSIS:');
console.log(`MC at q*: $${mc.toFixed(2)}`);
console.log(`AC at q*: $${ac.toFixed(2)}`);
console.log(`AVC at q*: $${avc.toFixed(2)}`);
console.log(`P - AC = Profit per unit: $${(P - ac).toFixed(2)}`);

// Verificar se deve operar
const shouldOperate = firm.shouldOperate(P);
console.log('');
console.log(`Should operate? ${shouldOperate ? 'YES' : 'NO'}`);
console.log(`Reason: P ($${P}) > AVC ($${avc.toFixed(2)})`);

/*
OUTPUT:
=== PERFECT COMPETITION ANALYSIS ===
Market Price: $30
Optimal Quantity: 3 TB/month
Revenue: $90
Total Cost: $55
Profit: $35

MARGINAL ANALYSIS:
MC at q*: $30.00
AC at q*: $18.33
AVC at q*: $15.00
P - AC = Profit per unit: $11.67

Should operate? YES
Reason: P ($30) > AVC ($15.00)
*/

Visualização: Lucro Maximizado

Retângulo azul = lucro total

  • Altura: P - AC = $30 - $18.33 = $11.67 (lucro por unidade)
  • Largura: q* = 3 (quantidade produzida)
  • Área: $11.67 × 3 = $35 (lucro total)

Por que parar em q=3? Porque na unidade 4, o custo marginal de produzir ($40) seria maior que o preço recebido ($30). Você perderia $10 na 4ª unidade.

Shutdown Rule: Quando Fechar no Curto Prazo

Uma firma pode operar com prejuízo no curto prazo e ainda assim ser racional continuar. A decisão de fechar depende de custos fixos vs custos variáveis.

Taxonomia de Custos: Fixos vs Variáveis

Custos Fixos (FC)

  • Sunk costs no curto prazo
  • Não dependem da quantidade produzida
  • Exemplos SaaS: servidores alugados, engenheiros contratados, licenças anuais, office lease
  • Irrelevantes para shutdown decision

Custos Variáveis (VC)

  • Dependem da quantidade produzida
  • Aumentam com q, caem com q
  • Exemplos SaaS: compute (Lambda), storage (S3), bandwidth, API calls, support tickets
  • Determinam shutdown decision

Shutdown Rule:

// Continuar operando se e somente se:
P > AVC  // Preço maior que custo variável médio

// Equivalentemente:
P × q > VC  // Receita cobre custos variáveis

// Se P < AVC:
// Feche. Você perde menos parando (só paga FC)
// do que continuando (paga FC + VC sem cobrir VC)

Exemplo: Preço cai para $10

Usando a mesma firma (C = 10 + 5q²), imagine que o preço de mercado cai para $10:

// Análise com P = $10
const P_low = 10;
const q_new = firm.optimalQuantity(P_low);  // q* = 10/(2*5) = 1

console.log('=== PRICE DROP ANALYSIS ===');
console.log(`New Price: $${P_low}`);
console.log(`New Optimal Quantity: ${q_new} TB/month`);

// Lucro
const revenue_new = P_low * q_new;  // $10
const cost_new = firm.totalCost(q_new);  // 10 + 5*1² = $15
const profit_new = revenue_new - cost_new;  // -$5

console.log(`Revenue: $${revenue_new}`);
console.log(`Total Cost: $${cost_new}`);
console.log(`Profit: $${profit_new}`);  // PREJUÍZO!

// Mas e se fechar?
const profit_if_shutdown = -firm.FC;  // -$10 (só paga FC)

console.log('');
console.log('SHUTDOWN ANALYSIS:');
console.log(`Profit if operate: $${profit_new}`);  // -$5
console.log(`Profit if shutdown: $${profit_if_shutdown}`);  // -$10
console.log(`Decision: ${profit_new > profit_if_shutdown ? 'OPERATE' : 'SHUTDOWN'}`);

// Verificar rule: P vs AVC
const avc_new = firm.averageVariableCost(q_new);  // 5*1 = $5
console.log('');
console.log(`P = $${P_low}, AVC = $${avc_new}`);
console.log(`P > AVC? ${P_low > avc_new ? 'YES → OPERATE' : 'NO → SHUTDOWN'}`);

/*
OUTPUT:
=== PRICE DROP ANALYSIS ===
New Price: $10
New Optimal Quantity: 1 TB/month
Revenue: $10
Total Cost: $15
Profit: -$5

SHUTDOWN ANALYSIS:
Profit if operate: -$5
Profit if shutdown: -$10
Decision: OPERATE

P = $10, AVC = $5
P > AVC? YES → OPERATE

CONCLUSÃO: Mesmo com prejuízo de $5, é melhor operar do que fechar.
Porque fechando você perde $10 (custos fixos).
Operando, você pelo menos cobre custos variáveis ($5) e parte dos fixos ($5).
*/

Longo Prazo: All Costs Are Variable

No longo prazo, não há custos fixos. Você pode renegociar contratos, demitir engenheiros, cancelar servidores. Logo, a shutdown rule é simples:

// Longo prazo: fechar se π < 0
if (profit < 0) {
  shutdown();  // Saia do mercado
}

// Equivalentemente: P < AC (preço menor que custo médio total)

Em SaaS: Se seu produto não é lucrativo após 2-3 anos (quando custos de aquisição amortecem), considere sunset. Não há "esperar mais" se o unit economics é negativo no longo prazo.

Agregação: Supply Curve do Mercado

A curva de oferta da firma é a sua curva de custo marginal (acima de AVC). A curva de oferta do mercado é a soma horizontal das ofertas individuais.

Teorema: Supply Curve = Marginal Cost Curve

Por quê? Porque a firma produz onde P = MC. Logo, para cada preço P, a quantidade ofertada q é determinada pela equação P = MC(q). Isso é exatamente a definição de uma curva de oferta.

// Supply curve de uma firma
class FirmSupplyCurve {
  constructor(firm) {
    this.firm = firm;
  }

  // Quantidade ofertada a cada preço: P = MC(q) → q = P/(2*VC_coeff)
  quantitySupplied(price) {
    // Verificar shutdown: se P < AVC mínimo, q = 0
    const minAVC = 0;  // No nosso caso, AVC = 5q, mínimo em q→0
    if (price <= minAVC) return 0;

    return this.firm.optimalQuantity(price);
  }
}

// Market supply: soma de firmas idênticas
class MarketSupply {
  constructor(firmSupply, numberOfFirms) {
    this.firmSupply = firmSupply;
    this.N = numberOfFirms;
  }

  // Q = N × q (soma horizontal)
  quantitySupplied(price) {
    const q_firm = this.firmSupply.quantitySupplied(price);
    return this.N * q_firm;
  }

  // Inversa: P como função de Q
  inverseSupply(Q) {
    const q_firm = Q / this.N;
    // P = MC = 10q_firm (no nosso caso)
    return 10 * q_firm;
  }
}

// Exemplo: 6 firmas idênticas
const firm = new PerfectCompetitionFirm(10, 5);
const firmSupply = new FirmSupplyCurve(firm);
const marketSupply = new MarketSupply(firmSupply, 6);

console.log('=== MARKET SUPPLY ANALYSIS ===');
console.log('Number of firms: 6');
console.log('');

// Teste em diferentes preços
const prices = [10, 20, 30, 40];
prices.forEach(P => {
  const q_firm = firmSupply.quantitySupplied(P);
  const Q_market = marketSupply.quantitySupplied(P);
  console.log(`P = $${P}: q_firm = ${q_firm}, Q_market = ${Q_market}`);
});

/*
OUTPUT:
=== MARKET SUPPLY ANALYSIS ===
Number of firms: 6

P = $10: q_firm = 1, Q_market = 6
P = $20: q_firm = 2, Q_market = 12
P = $30: q_firm = 3, Q_market = 18
P = $40: q_firm = 4, Q_market = 24

Observe: Q = 0.6P (curva de oferta de mercado)
Cada firma: q = 0.1P (curva de oferta da firma)
*/

Elasticidade: Quanto mais firmas, mais elástica é a oferta de mercado. Com infinitas firmas, a oferta se torna perfeitamente elástica (horizontal).

Equilíbrio: Supply = Demand

Finalmente, o equilíbrio de mercado ocorre onde a oferta agregada iguala a demanda agregada. Isso determina P* e Q*, que cada firma toma como dado.

// Market equilibrium
class MarketEquilibrium {
  constructor(marketSupply, marketDemand) {
    this.supply = marketSupply;
    this.demand = marketDemand;
  }

  // Encontrar P* e Q* onde Qs(P) = Qd(P)
  findEquilibrium() {
    // Supply: Q = 0.6P (do exemplo acima)
    // Demand: Q = 48 - P (hipotético)

    // Igualar: 0.6P = 48 - P
    // 1.6P = 48
    // P* = 30

    const P_star = 30;
    const Q_star = 0.6 * P_star;  // 18

    return { P: P_star, Q: Q_star };
  }

  // Implicações para cada firma
  firmImplications(equilibrium, numberOfFirms) {
    const { P, Q } = equilibrium;
    const q_firm = Q / numberOfFirms;

    return {
      price: P,
      quantity: q_firm,
      revenue: P * q_firm,
      // Cada firma produz onde P = MC
      marginalCost: P,  // Por construção!
    };
  }
}

// Demand curve hipotética: Q = 48 - P
const marketDemand = {
  quantityDemanded: (P) => 48 - P,
};

const equilibrium = new MarketEquilibrium(marketSupply, marketDemand);
const eq = equilibrium.findEquilibrium();

console.log('=== MARKET EQUILIBRIUM ===');
console.log(`Equilibrium Price: $${eq.P}`);
console.log(`Equilibrium Quantity: ${eq.Q} TB/month`);
console.log('');

const firmEq = equilibrium.firmImplications(eq, 6);
console.log('=== FIRM-LEVEL IMPLICATIONS ===');
console.log(`Each firm produces: ${firmEq.quantity} TB/month`);
console.log(`Each firm charges: $${firmEq.price}`);
console.log(`Each firm's revenue: $${firmEq.revenue}`);
console.log(`Each firm's MC at q*: $${firmEq.marginalCost}`);

// Verificar: P = MC?
const firm_analysis = new PerfectCompetitionFirm(10, 5);
const mc_check = firm_analysis.marginalCost(firmEq.quantity);
console.log('');
console.log('VERIFICATION:');
console.log(`P = MC? $${firmEq.price} = $${mc_check}${firmEq.price === mc_check ? 'YES ✓' : 'NO'}`);

/*
OUTPUT:
=== MARKET EQUILIBRIUM ===
Equilibrium Price: $30
Equilibrium Quantity: 18 TB/month

=== FIRM-LEVEL IMPLICATIONS ===
Each firm produces: 3 TB/month
Each firm charges: $30
Each firm's revenue: $90
Each firm's MC at q*: $30

VERIFICATION:
P = MC? $30 = $30 → YES ✓

MAGIA DO MERCADO:
Cada firma, maximizando seu próprio lucro (P=MC), produz exatamente
a quantidade que o mercado demanda. Não há coordenação central.
É a "mão invisível" de Adam Smith em ação.
*/

Por que SaaS raramente é competição perfeita

Apesar de cloud infrastructure (storage, compute) se aproximar, a maioria dos SaaS viola as 3 suposições de competição perfeita:

1. Produtos NÃO são idênticos
  • Features diferentes (Notion vs Coda)
  • UX/UI diferenciada
  • Integrações únicas
  • Brand e confiança

→ Demanda não é perfeitamente elástica

2. Informação NÃO é transparente
  • Pricing opaco (contact sales)
  • Hidden fees (overage, onboarding)
  • Complexidade de comparação
  • Assimetria técnica

→ Consumidores não sabem todos os preços

3. Custos de transação ALTOS
  • Migration cost (dados, workflows)
  • Learning curve (treinamento)
  • API integrations (webhooks, custom code)
  • Lock-in (proprietary formats)

→ Switching cost cria stickiness artificial

Implicação estratégica para founders

Não compita em mercados perfeitamente competitivos. Se você está vendendo commodity (storage, email transacional, CDN), você é price-taker e suas margens tendem a zero. A estratégia vencedora em SaaS é criar diferenciação artificial: vertical integrations, superior UX, network effects, ou bundling (vender storage + analytics + ML em um único pacote).

Consumer Surplus: Medindo Bem-Estar

Até agora focamos em economia positiva (como as coisas são). Agora vamos para economia normativa (como as coisas devem ser). Como medimos se um resultado de mercado é bom ou ruim?

Consumer Surplus: Benefício Além do Preço

Consumer surplus é o benefício que um consumidor recebe de consumir um bem além e acima do preço que pagou.

Intuição:

Se você está disposto a pagar $300 por um produto SaaS, mas o preço é apenas $100, você ganha um surplus de $200. Você está "mais feliz" porque conseguiu o produto por menos do que estava disposto a pagar.

Preferência revelada:

Não perguntamos "o quanto você é feliz?" (utilidade é ordinal, não cardinal). Em vez disso, perguntamos: "Quanto você pagaria?" Isso revela suas preferências através de ações, não declarações.

Representação gráfica: área abaixo da demanda

Consumer surplus = área abaixo da curva de demanda, acima do preço de mercado. Geometricamente, é um triângulo com base = quantidade e altura = (willingness to pay - price).

Exemplo: Assinatura de SaaS Analytics

// Consumer Surplus em SaaS
class ConsumerSurplus {
  constructor(willingnessToPay, marketPrice) {
    this.WTP = willingnessToPay;  // Willingness To Pay
    this.P = marketPrice;
  }

  // Surplus individual
  individualSurplus() {
    if (this.WTP < this.P) return 0;  // Não compra
    return this.WTP - this.P;
  }

  // Decisão de compra
  willBuy() {
    return this.WTP >= this.P;
  }
}

// Exemplo: diferentes usuários de analytics SaaS
const users = [
  { name: 'Enterprise Corp', wtp: 500 },  // High value user
  { name: 'Startup A', wtp: 300 },
  { name: 'Startup B', wtp: 200 },
  { name: 'Freelancer', wtp: 100 },
  { name: 'Hobbyist', wtp: 50 },
];

const marketPrice = 150;  // Preço de mercado

console.log('=== CONSUMER SURPLUS ANALYSIS ===');
console.log(`Market Price: $${marketPrice}/month\n`);

let totalSurplus = 0;
let buyersCount = 0;

users.forEach(user => {
  const cs = new ConsumerSurplus(user.wtp, marketPrice);
  const surplus = cs.individualSurplus();

  if (cs.willBuy()) {
    console.log(`${user.name}:`);
    console.log(`  WTP: $${user.wtp}`);
    console.log(`  Surplus: $${surplus}`);
    console.log(`  Buy: YES\n`);

    totalSurplus += surplus;
    buyersCount++;
  } else {
    console.log(`${user.name}: WTP too low ($${user.wtp}) → NO PURCHASE\n`);
  }
});

console.log('=== MARKET SUMMARY ===');
console.log(`Total Buyers: ${buyersCount}`);
console.log(`Total Consumer Surplus: $${totalSurplus}`);
console.log(`Average Surplus per Buyer: $${(totalSurplus / buyersCount).toFixed(2)}`);

/*
OUTPUT:
=== CONSUMER SURPLUS ANALYSIS ===
Market Price: $150/month

Enterprise Corp:
  WTP: $500
  Surplus: $350
  Buy: YES

Startup A:
  WTP: $300
  Surplus: $150
  Buy: YES

Startup B:
  WTP: $200
  Surplus: $50
  Buy: YES

Freelancer: WTP too low ($100) → NO PURCHASE
Hobbyist: WTP too low ($50) → NO PURCHASE

=== MARKET SUMMARY ===
Total Buyers: 3
Total Consumer Surplus: $550
Average Surplus per Buyer: $183.33

INSIGHT: O mercado está "saudável" - compradores recebem valor
significativo (surplus médio de $183). Isso aumenta satisfação e retention.
*/

Relação com elasticidade

Consumer surplus é inversamente proporcional à elasticidade:

  • Demanda inelástica (ex: insulina) → surplus ENORME (disposto a pagar muito acima do preço)
  • Demanda elástica (ex: McDonald's vs Burger King) → surplus MÍNIMO (indiferente, muda por $0.01)

Producer Surplus: Lucro dos Produtores

Se consumidores ganham surplus, produtores também ganham. Producer surplus é a diferença entre o preço recebido e o custo marginal.

Producer Surplus = Preço - Custo Marginal

Para cada unidade vendida onde P > MC, o produtor ganha surplus. No equilíbrio de longo prazo perfeitamente competitivo, producer surplus = lucro.

Representação gráfica:

// Producer Surplus
PS = Área acima da curva de oferta (MC), abaixo do preço de mercado

// Em equilíbrio de longo prazo:
PS = Profit = (P - AC) × Q

// Se P = AC (competição perfeita LR):
PS = 0  // Zero lucro econômico!

Com firmas heterogêneas (diferentes eficiências):

Firmas mais eficientes (MC baixo) ganham surplus mesmo em competição perfeita. A firma marginal (última a produzir) tem PS = 0, mas as inframarg Marginal ganham lucro.

Exemplo: SaaS com custos heterogêneos

// Producer Surplus com firmas de diferentes eficiências
class SaaSFirm {
  constructor(name, marginalCost, capacity) {
    this.name = name;
    this.MC = marginalCost;  // Custo marginal por cliente
    this.capacity = capacity;
  }

  producerSurplus(marketPrice, quantitySold) {
    if (marketPrice <= this.MC) return 0;
    return (marketPrice - this.MC) * quantitySold;
  }
}

// Mercado de CRM: firmas com diferentes eficiências
const firms = [
  new SaaSFirm('Salesforce', 10, 1000),    // Alta eficiência
  new SaaSFirm('HubSpot', 20, 800),
  new SaaSFirm('Zoho', 30, 500),
  new SaaSFirm('Newcomer', 50, 200),        // Baixa eficiência
];

const marketPrice = 50;  // Preço de equilíbrio

console.log('=== PRODUCER SURPLUS ANALYSIS ===');
console.log(`Market Price: $${marketPrice}/client\n`);

let totalProducerSurplus = 0;

firms.forEach(firm => {
  // Firma produz até sua capacidade se P > MC
  const quantity = marketPrice > firm.MC ? firm.capacity : 0;
  const ps = firm.producerSurplus(marketPrice, quantity);

  console.log(`${firm.name}:`);
  console.log(`  MC: $${firm.MC}`);
  console.log(`  Quantity: ${quantity} clients`);
  console.log(`  Producer Surplus: $${ps.toLocaleString()}`);
  console.log(`  Profit per client: $${marketPrice - firm.MC}\n`);

  totalProducerSurplus += ps;
});

console.log('=== MARKET SUMMARY ===');
console.log(`Total Producer Surplus: $${totalProducerSurplus.toLocaleString()}`);

/*
OUTPUT:
=== PRODUCER SURPLUS ANALYSIS ===
Market Price: $50/client

Salesforce:
  MC: $10
  Quantity: 1000 clients
  Producer Surplus: $40,000
  Profit per client: $40

HubSpot:
  MC: $20
  Quantity: 800 clients
  Producer Surplus: $24,000
  Profit per client: $30

Zoho:
  MC: $30
  Quantity: 500 clients
  Producer Surplus: $10,000
  Profit per client: $20

Newcomer:
  MC: $50
  Quantity: 200 clients
  Producer Surplus: $0
  Profit per client: $0

=== MARKET SUMMARY ===
Total Producer Surplus: $74,000

INSIGHT: A firma marginal (Newcomer) tem lucro zero, mas as
mais eficientes (Salesforce, HubSpot, Zoho) capturam surplus
devido à sua vantagem de custo.
*/

Primeira Teoria Fundamental da Economia de Bem-Estar

Paul Samuelson provou que competição perfeita maximiza o bem-estar social. O bem-estar (welfare) é definido como:

Welfare = CS + PS
// Welfare social total
W = Consumer Surplus + Producer Surplus

// Em equilíbrio competitivo (E1):
CS = Área abaixo de demanda, acima de P*
PS = Área acima de oferta, abaixo de P*
W* = CS + PS = MÁXIMO

// Qualquer intervenção (price caps, taxes, quotas):
W_new < W*  // Reduz welfare!

Por que o equilíbrio competitivo maximiza welfare? Porque toda transação que faz ambas as partes melhores (ou pelo menos uma melhor sem piorar a outra) acontece. Qualquer desvio do equilíbrio impede trades mutuamente benéficos.

Condição técnica:

No equilíbrio E*, a última unidade transacionada tem WTP (willingness to pay) = MC (marginal cost). Para qualquer unidade à esquerda, WTP > MC (gera surplus). Para qualquer à direita, WTP < MC (destruiria valor).

Importante: Suposições do teorema

Este teorema assume competição perfeita, sem externalidades, informação perfeita, sem poder de mercado. Em SaaS, essas suposições raramente são verdadeiras, então o mercado livre NEM SEMPRE maximiza welfare. Veremos falhas de mercado em aulas futuras.

Deadweight Loss: Quando Welfare é Destruído

Deadweight loss (DWL) é a perda de welfare causada por transações que não acontecem, mas que fariam ambas as partes melhores. É welfare literalmente perdido, que não vai para ninguém.

Dois custos de intervenções governamentais

1. Custo de eficiência (DWL): Trades que fariam ambas as partes melhores não acontecem. Welfare literalmente desaparece.
2. Custo de alocação: Mecanismos ineficientes para alocar bens escassos (ex: filas, loteria). Tempo e recursos desperdiçados.
Benefício: Equidade - transferir surplus de uma parte para outra (ex: de produtores para consumidores).

Exemplo: Price Cap em SaaS

Imagine que um governo decide que "SaaS é muito caro" e impõe um preço máximo (price cap) de $50 em um mercado onde o equilíbrio é $100:

// Deadweight Loss com Price Cap
class Market {
  constructor(demandCurve, supplyCurve) {
    this.demand = demandCurve;  // Q = a - bP
    this.supply = supplyCurve;  // Q = c + dP
  }

  // Equilíbrio competitivo
  equilibrium() {
    // Demand: Q = 200 - 2P
    // Supply: Q = -50 + P
    // Igualar: 200 - 2P = -50 + P
    // 250 = 3P → P* = 83.33, Q* = 33.33

    const P_star = 250 / 3;
    const Q_star = 200 - 2 * P_star;

    return { price: P_star, quantity: Q_star };
  }

  // Com price cap
  priceCapOutcome(cap) {
    // Ao preço cap, quantas unidades são ofertadas?
    const Q_supplied = -50 + cap;  // Supply curve
    const Q_demanded = 200 - 2 * cap;  // Demand curve

    // Quantidade real = mínimo (supply constraints)
    const Q_actual = Math.min(Q_supplied, Q_demanded);

    return {
      price: cap,
      quantity: Q_actual,
      excessDemand: Q_demanded - Q_supplied
    };
  }

  // Consumer Surplus
  consumerSurplus(P, Q) {
    // CS = 0.5 * base * altura
    // base = Q, altura = (P_intercept - P)
    const P_intercept = 100;  // Quando Q=0, P=100
    return 0.5 * Q * (P_intercept - P);
  }

  // Producer Surplus
  producerSurplus(P, Q) {
    // PS = 0.5 * base * altura
    // base = Q, altura = (P - MC_intercept)
    const MC_intercept = 50;  // Quando Q=0, MC=50
    return 0.5 * Q * (P - MC_intercept);
  }

  // Welfare
  welfare(P, Q) {
    return this.consumerSurplus(P, Q) + this.producerSurplus(P, Q);
  }
}

const market = new Market();

// Caso 1: Equilíbrio competitivo
const eq = market.equilibrium();
console.log('=== COMPETITIVE EQUILIBRIUM ===');
console.log(`Price: $${eq.price.toFixed(2)}`);
console.log(`Quantity: ${eq.quantity.toFixed(2)} units`);

const CS_eq = market.consumerSurplus(eq.price, eq.quantity);
const PS_eq = market.producerSurplus(eq.price, eq.quantity);
const W_eq = market.welfare(eq.price, eq.quantity);

console.log(`Consumer Surplus: $${CS_eq.toFixed(2)}`);
console.log(`Producer Surplus: $${PS_eq.toFixed(2)}`);
console.log(`Total Welfare: $${W_eq.toFixed(2)}\n`);

// Caso 2: Price cap de $60
const cap = 60;
const capOutcome = market.priceCapOutcome(cap);
console.log('=== WITH PRICE CAP ($60) ===');
console.log(`Price: $${capOutcome.price}`);
console.log(`Quantity: ${capOutcome.quantity} units`);
console.log(`Excess Demand: ${capOutcome.excessDemand} units (shortage!)\n`);

const CS_cap = market.consumerSurplus(cap, capOutcome.quantity);
const PS_cap = market.producerSurplus(cap, capOutcome.quantity);
const W_cap = market.welfare(cap, capOutcome.quantity);

console.log(`Consumer Surplus: $${CS_cap.toFixed(2)}`);
console.log(`Producer Surplus: $${PS_cap.toFixed(2)}`);
console.log(`Total Welfare: $${W_cap.toFixed(2)}\n`);

// Deadweight Loss
const DWL = W_eq - W_cap;
console.log('=== WELFARE ANALYSIS ===');
console.log(`Change in CS: $${(CS_cap - CS_eq).toFixed(2)}`);
console.log(`Change in PS: $${(PS_cap - PS_eq).toFixed(2)}`);
console.log(`Deadweight Loss: $${DWL.toFixed(2)}\n`);

console.log('TRANSFER vs LOSS:');
console.log(`- Some PS transferred to CS (rectangle)`);
console.log(`- But $${DWL.toFixed(2)} literally disappeared (triangle)`);
console.log(`- Lost from transactions that would benefit both sides\n`);

/*
OUTPUT:
=== COMPETITIVE EQUILIBRIUM ===
Price: $83.33
Quantity: 33.33 units
Consumer Surplus: $277.78
Producer Surplus: $555.56
Total Welfare: $833.33

=== WITH PRICE CAP ($60) ===
Price: $60
Quantity: 10 units
Excess Demand: 70 units (shortage!)

Consumer Surplus: $200.00
Producer Surplus: $50.00
Total Welfare: $250.00

=== WELFARE ANALYSIS ===
Change in CS: $-77.78
Change in PS: $-505.56
Deadweight Loss: $583.33

TRANSFER vs LOSS:
- Some PS transferred to CS (rectangle)
- But $583.33 literally disappeared (triangle)
- Lost from transactions that would benefit both sides

CONCLUSÃO: O price cap DESTRUIU $583 de welfare.
Consumidores perderam $78, produtores perderam $506.
A sociedade como um todo está $583 PIOR.
*/

Por que DWL é ruim (e transferências são neutras)?

Transferência: Mover $ de produtor para consumidor (ou vice-versa). Welfare total não muda. É uma questão de equidade, não eficiência.

Deadweight Loss: Welfare desaparece. Ninguém ganha esse dinheiro. É pura ineficiência. Transactions que fariam ambas as partes melhores não acontecem.

Em SaaS: Price caps em mercados de software (ex: limitações de licensing) criam escassez artificial e reduzem inovação. Produtores saem do mercado, consumidores ficam sem produto.

Exemplos Reais de Deadweight Loss

1. Filas de Gasolina nos Anos 1970

Contexto: Em 1973-1974 e 1979, a OPEC (cartel de países produtores de petróleo) reduziu drasticamente a oferta de petróleo. Nos EUA, o governo impôs price ceilings (tetos de preço) na gasolina para "proteger consumidores".

Resultado catastrófico:

  • Shortage severo: Quantity demanded (Qd) muito maior que quantity supplied (Qs)
  • Filas enormes: Pessoas esperavam 2-4 horas para abastecer
  • Racionamento: Apenas 10 galões por pessoa, rodízio por placa (pares/ímpares)
  • Custo de alocação imenso: Tempo desperdiçado equivalente a bilhões de dólares

Análise econômica:

DWL (triângulo): Transações que não aconteceram entre Qs e Qd. Pessoas que pagariam mais que o custo marginal, mas não conseguiram comprar.
Custo de alocação (retângulo): O tempo desperdiçado nas filas. Se alguém ganha $20/hora e esperou 3 horas, custou $60 de tempo. Isso é PURO DESPERDÍCIO que não vai para ninguém.
Alternativa eficiente: Deixar preço subir. Quem valoriza mais paga mais, quem valoriza menos economiza. Sem filas, sem desperdício de tempo.

Paralelo SaaS: Quando plataformas limitam artificialmente licenças (ex: "máximo 5 usuários no plano básico"), criam shortage. Empresas desperdiçam tempo criando workarounds (compartilhar logins, usar ferramentas menos eficientes). Melhor: precificar por uso real e deixar mercado alocar.

2. Ticket Scalping: Taylor Swift e o Mercado Secundário

Situação: Artistas como Taylor Swift, Adele e Beyoncé vendem ingressos por preços abaixo do equilíbrio de mercado (ex: $200 quando demanda suportaria $2000). Resultado: shortage massivo.

Como o mercado se ajusta:

  • Scalpers (cambistas): Compram tickets em massa usando bots
  • Mercado secundário: StubHub, Vivid Seats - vendem por $1500-$3000
  • Transferência de surplus: De artista/fãs para scalpers
  • DWL: Fãs que não conseguiram comprar (nem no primário nem no secundário)

Por que artistas não fazem auction (leilão)?

1. Imagem pública: "Taylor Swift cobra $5000 por ingresso" é péssima manchete. Fãs se sentem explorados.

2. Modelo de negócio: Artistas ganham mais em merchandising, tours futuras, streaming. Ingresso barato = mais fãs = mais receita no longo prazo.

3. Equidade percebida: Sistema de loteria/fila online parece "mais justo" que leilão, mesmo sendo menos eficiente.

// Mercado de ingressos: Primary vs Secondary
class TicketMarket {
  constructor() {
    this.primaryPrice = 200;      // Preço do artista
    this.equilibriumPrice = 2000; // Preço de mercado real
    this.supply = 20000;           // Capacidade do estádio
    this.demand = 200000;          // Fãs querendo ir
  }

  // Quanto surplus vai para cada parte
  surplusDistribution() {
    // Consumer Surplus (fãs sortudos)
    const luckyFans = this.supply;  // 20k que conseguiram
    const CS_perFan = this.equilibriumPrice - this.primaryPrice;  // $1800 cada
    const totalCS = luckyFans * CS_perFan;

    // Scalper Profit (se revenderem tudo)
    const scalpersRevenue = luckyFans * this.equilibriumPrice;  // $40M
    const scalpersCost = luckyFans * this.primaryPrice;         // $4M
    const scalpersProfit = scalpersRevenue - scalpersCost;      // $36M

    // Artist Revenue (perdeu muito!)
    const artistRevenue = luckyFans * this.primaryPrice;        // $4M
    const artistPotentialRevenue = luckyFans * this.equilibriumPrice; // $40M
    const artistLostRevenue = artistPotentialRevenue - artistRevenue; // $36M

    return {
      consumerSurplus: totalCS,
      scalpersProfit: scalpersProfit,
      artistRevenue: artistRevenue,
      artistLostRevenue: artistLostRevenue
    };
  }
}

const market = new TicketMarket();
const result = market.surplusDistribution();

console.log('=== TICKET MARKET ANALYSIS ===');
console.log(`Lucky Fans Surplus: $${(result.consumerSurplus / 1e6).toFixed(1)}M`);
console.log(`Scalpers Profit: $${(result.scalpersProfit / 1e6).toFixed(1)}M`);
console.log(`Artist Revenue: $${(result.artistRevenue / 1e6).toFixed(1)}M`);
console.log(`Artist Lost to Scalpers: $${(result.artistLostRevenue / 1e6).toFixed(1)}M`);

/*
OUTPUT:
=== TICKET MARKET ANALYSIS ===
Lucky Fans Surplus: $36.0M
Scalpers Profit: $36.0M
Artist Revenue: $4.0M
Artist Lost to Scalpers: $36.0M

INSIGHT: Artista "doa" $36M aos scalpers ao precificar abaixo
do mercado. Poderia capturar esse valor com dynamic pricing ou
auction, mas escolhe não fazer por razões de imagem/modelo de negócio.
*/

Paralelo SaaS: Empresas que precificam muito abaixo do valor (ex: Slack inicialmente) criam mercado secundário de "resellers" ou consultores que cobram 10x para implementação. Melhor: value-based pricing desde o início.

3. Medalhões de Táxi: Restrição de Quantidade

Sistema tradicional: Cidades como NYC limitam número de táxis através de medallions (licenças). Em NYC, o número foi congelado em ~13.000 medalhões desde 1937.

Como funciona a restrição:

  • Governo define N1 medallions: Ex: 13.000 táxis permitidos
  • Demanda cresce (população aumenta): Mas supply fica fixo
  • Valor do medallion explode: Em 2013, medallions NYC valiam $1.3 milhão cada
  • Shortage crônico: Filas enormes, especialmente em horários de pico

Análise de welfare:

DWL: Pessoas que pagariam mais que o custo marginal de uma corrida, mas não conseguem taxi. Especialmente à noite, na chuva, em áreas distantes.
Rent-seeking: Donos de medallions capturam renda econômica sem produzir valor. O valor do medallion ($1.3M) é capitalização do lucro futuro da restrição artificial.
Ineficiência alocativa: Táxis circulam vazios procurando clientes em áreas erradas. Matching ineficiente entre demanda e oferta.

Enter Uber/Lyft: Destruição criativa

  • Removeu restrição artificial: Qualquer motorista pode se cadastrar
  • Supply aumentou drasticamente: De 13k (yellow cabs) para 80k+ (Uber+Lyft) em NYC
  • Valor do medallion colapsou: $1.3M → $200k (queda de 85%)
  • Welfare aumentou: Mais corridas, espera menor, matching eficiente via app
  • Perdedores: Donos de medallions (perderam fortuna), motoristas de taxi tradicionais
// Taxi Medallion Market: Before & After Uber
class TaxiMarket {
  // Antes do Uber (com medallion restriction)
  static beforeUber() {
    const medallions = 13000;           // Supply fixo
    const demandAtEquilibrium = 50000;  // Demanda real
    const pricePerRide = 25;            // Preço médio
    const marginalCost = 10;            // Custo real por corrida

    // Producer Surplus = (P - MC) * Q
    const PS = (pricePerRide - marginalCost) * medallions;

    // Consumer Surplus (área do triângulo)
    const maxWTP = 50;  // Máximo willingness to pay
    const CS = 0.5 * medallions * (maxWTP - pricePerRide);

    // DWL (corridas que não aconteceram)
    const lostRides = demandAtEquilibrium - medallions;
    const DWL = 0.5 * lostRides * (pricePerRide - marginalCost);

    // Valor capitalizado do medallion
    const annualRent = (pricePerRide - marginalCost) * 365 * 10; // 10 corridas/dia
    const medallionValue = annualRent / 0.05; // Capitalizado a 5% ao ano

    return { medallions, PS, CS, DWL, medallionValue, lostRides };
  }

  // Depois do Uber (competição)
  static afterUber() {
    const drivers = 80000;              // Supply sem restrição
    const pricePerRide = 15;            // Preço caiu (competição)
    const marginalCost = 10;            // Custo não mudou
    const demandAtNewPrice = 75000;     // Demanda maior (preço menor)

    const PS = (pricePerRide - marginalCost) * demandAtNewPrice;

    const maxWTP = 50;
    const CS = 0.5 * demandAtNewPrice * (maxWTP - pricePerRide);

    const DWL = 0; // Praticamente zero (mercado clearing)

    return { drivers, PS, CS, DWL };
  }
}

const before = TaxiMarket.beforeUber();
const after = TaxiMarket.afterUber();

console.log('=== TAXI MARKET: BEFORE UBER ===');
console.log(`Medallions: ${before.medallions.toLocaleString()}`);
console.log(`Producer Surplus: $${(before.PS / 1e6).toFixed(1)}M`);
console.log(`Consumer Surplus: $${(before.CS / 1e6).toFixed(1)}M`);
console.log(`Deadweight Loss: $${(before.DWL / 1e6).toFixed(1)}M`);
console.log(`Medallion Value: $${(before.medallionValue / 1e3).toFixed(0)}k`);
console.log(`Lost Rides per Day: ${before.lostRides.toLocaleString()}\n`);

console.log('=== TAXI MARKET: AFTER UBER ===');
console.log(`Drivers: ${after.drivers.toLocaleString()}`);
console.log(`Producer Surplus: $${(after.PS / 1e6).toFixed(1)}M`);
console.log(`Consumer Surplus: $${(after.CS / 1e6).toFixed(1)}M`);
console.log(`Deadweight Loss: $${(after.DWL / 1e6).toFixed(1)}M\n`);

const welfareChange = (after.CS + after.PS) - (before.CS + before.PS);
console.log(`Total Welfare Gain: $${(welfareChange / 1e6).toFixed(1)}M`);
console.log(`DWL Eliminated: $${(before.DWL / 1e6).toFixed(1)}M`);

/*
OUTPUT:
=== TAXI MARKET: BEFORE UBER ===
Medallions: 13,000
Producer Surplus: $195.0M
Consumer Surplus: $162.5M
Deadweight Loss: $277.5M
Medallion Value: $1095k (~$1.1M)
Lost Rides per Day: 37,000

=== TAXI MARKET: AFTER UBER ===
Drivers: 80,000
Producer Surplus: $375.0M
Consumer Surplus: $1312.5M
Deadweight Loss: $0.0M

Total Welfare Gain: $1330.0M
DWL Eliminated: $277.5M

INSIGHT: Uber destruiu $1.1M de valor de medallion (rent-seeking),
mas criou $1.33 BILHÃO em welfare social. Consumidores ganharam
MASSIVAMENTE (+$1.15B em CS). Sociedade ficou muito melhor.
*/

Paralelo SaaS: Plataformas que limitam artificialmente integrações ou APIs (ex: "apenas 10 integrações permitidas") criam ineficiência similar. Uber para SaaS = abrir APIs, permitir ecossistema, deixar mercado alocar recursos.

4. Feeding America: Mercados Virtuais Sem Dinheiro

Problema original: Feeding America distribui comida doada para food banks (bancos de alimentos) por todo EUA. Antes de 2005, usavam sistema de senioridade: food banks mais antigos escolhiam primeiro.

Sistema antigo (ineficiente):

  • Alocação por senioridade: Food banks mais velhos tinham prioridade
  • Mismatch absurdo: Food bank em Idaho recebia peixe (não queriam), food bank em Seattle recebia batatas (não precisavam)
  • Desperdício enorme: Comida estragava, custos de transporte altíssimos
  • Sem mecanismo de preferência: Ninguém sabia quem valorizava mais cada item

Solução: Market designer com moeda virtual

1. Cada food bank recebe "shares" (pontos virtuais): Distribuição igual para todos, tipo UBI (Universal Basic Income) do sistema.

2. Leilão diário online: Food banks fazem bids usando seus shares. Ex: "dou 500 shares por 1 tonelada de arroz".

3. Matching eficiente: Quem mais valoriza (maior bid) recebe. Revela preferências via willingness to pay (em shares, não dólares).

4. Shares se replenish: Todo mês, food banks recebem novos shares. Não é dinheiro real, mas funciona como mecanismo de preço.

Resultados após implementação:

  • Alocação 40% mais eficiente: Comida vai para quem mais precisa/valoriza
  • Desperdício caiu drasticamente: Menos comida estragando, melhor logística
  • Satisfação subiu: Food banks reportam receber items mais relevantes
  • Sem dinheiro real: Sistema mantém espírito de caridade, mas usa economia de mercado
// Feeding America: Virtual Market System
class VirtualMarket {
  constructor() {
    this.foodBanks = [
      { name: 'Seattle', shares: 10000, preferences: { fish: 100, potatoes: 20 } },
      { name: 'Idaho', shares: 10000, preferences: { fish: 10, potatoes: 90 } },
      { name: 'Miami', shares: 10000, preferences: { fish: 80, potatoes: 15 } },
    ];

    this.items = [
      { type: 'fish', quantity: 5, location: 'Seattle' },
      { type: 'potatoes', quantity: 10, location: 'Idaho' },
    ];
  }

  // Sistema antigo: Senioridade (Seattle é mais antigo)
  oldSystemAllocation() {
    const allocations = {};

    // Seattle escolhe primeiro (é mais antigo)
    allocations['Seattle'] = { fish: 5, potatoes: 10 };  // Pega tudo
    allocations['Idaho'] = { fish: 0, potatoes: 0 };     // Sobra nada
    allocations['Miami'] = { fish: 0, potatoes: 0 };     // Sobra nada

    // Calcular welfare (baseado em preferências)
    let totalValue = 0;
    totalValue += allocations['Seattle'].fish * 100;      // Seattle valoriza fish
    totalValue += allocations['Seattle'].potatoes * 20;   // Seattle não valoriza batata

    return { allocations, totalValue, efficiency: 'LOW' };
  }

  // Novo sistema: Auction com shares
  marketSystemAllocation() {
    const bids = [];

    // Fish auction
    bids.push({ bank: 'Seattle', item: 'fish', bid: 100, value: 100 });
    bids.push({ bank: 'Idaho', item: 'fish', bid: 10, value: 10 });
    bids.push({ bank: 'Miami', item: 'fish', bid: 80, value: 80 });

    // Potatoes auction
    bids.push({ bank: 'Seattle', item: 'potatoes', bid: 20, value: 20 });
    bids.push({ bank: 'Idaho', item: 'potatoes', bid: 90, value: 90 });
    bids.push({ bank: 'Miami', item: 'potatoes', bid: 15, value: 15 });

    // Allocation: highest bidder wins
    const allocations = {
      'Seattle': { fish: 5, potatoes: 0 },   // Ganhou fish (bid 100)
      'Idaho': { fish: 0, potatoes: 10 },    // Ganhou potatoes (bid 90)
      'Miami': { fish: 0, potatoes: 0 },     // Perdeu ambos
    };

    // Calcular welfare
    let totalValue = 0;
    totalValue += allocations['Seattle'].fish * 100;      // 500
    totalValue += allocations['Idaho'].potatoes * 90;     // 900

    return { allocations, totalValue, efficiency: 'HIGH' };
  }
}

const market = new VirtualMarket();

const oldSystem = market.oldSystemAllocation();
const newSystem = market.marketSystemAllocation();

console.log('=== OLD SYSTEM (Seniority) ===');
console.log('Allocations:', JSON.stringify(oldSystem.allocations, null, 2));
console.log(`Total Value: ${oldSystem.totalValue}`);
console.log(`Efficiency: ${oldSystem.efficiency}\n`);

console.log('=== NEW SYSTEM (Market) ===');
console.log('Allocations:', JSON.stringify(newSystem.allocations, null, 2));
console.log(`Total Value: ${newSystem.totalValue}`);
console.log(`Efficiency: ${newSystem.efficiency}\n`);

const efficiencyGain = ((newSystem.totalValue - oldSystem.totalValue) / oldSystem.totalValue) * 100;
console.log(`Efficiency Gain: +${efficiencyGain.toFixed(0)}%`);

/*
OUTPUT:
=== OLD SYSTEM (Seniority) ===
Allocations: {
  "Seattle": { "fish": 5, "potatoes": 10 },
  "Idaho": { "fish": 0, "potatoes": 0 },
  "Miami": { "fish": 0, "potatoes": 0 }
}
Total Value: 700
Efficiency: LOW

=== NEW SYSTEM (Market) ===
Allocations: {
  "Seattle": { "fish": 5, "potatoes": 0 },
  "Idaho": { "fish": 0, "potatoes": 10 },
  "Miami": { "fish": 0, "potatoes": 0 }
}
Total Value: 1400
Efficiency: HIGH

Efficiency Gain: +100%

INSIGHT: Market system DOBROU a eficiência da alocação.
Fish vai para Seattle (valoriza 100 vs Idaho que valoriza 10).
Potatoes vão para Idaho (valoriza 90 vs Seattle que valoriza 20).
SEM usar dinheiro real, apenas revelando preferências via bids.
*/

Paralelo SaaS: Plataformas de recursos internos (compute, storage, licenças) podem usar mercados virtuais similares. Ex: times fazem bids com "budget points" para priorizar cloud resources. Mais eficiente que política ou senioridade.

🎯 Lições dos Exemplos Reais

DWL sempre acontece quando:

  • Price caps criam shortages (gasolina 1970s)
  • Restrições de quantidade (taxi medallions)
  • Alocação não baseada em valor (Feeding America antigo)

Soluções que funcionam:

  • Deixar preços se ajustarem (no gas shortage)
  • Remover restrições artificiais (Uber/Lyft)
  • Market mechanisms (Feeding America novo)
  • Revelar preferências via willingness to pay
Checkpoint: O que você aprendeu

✅ Conceitos Fundamentais

  • 4 estruturas de mercado (perfect, monopolistic, oligopoly, monopoly)
  • Price-takers vs price-makers
  • Regra de maximização: P = MC (competição perfeita)
  • Shutdown rule: P > AVC (curto prazo)
  • Consumer Surplus = área abaixo demanda, acima preço
  • Producer Surplus = área acima oferta, abaixo preço
  • Welfare = CS + PS, maximizado em competição perfeita
  • Deadweight Loss = welfare perdido de trades não realizados

🎯 Aplicações em SaaS

  • SaaS raramente é competição perfeita (diferenciação + switching cost)
  • Cloud infra (S3, EC2) é o mais próximo de commodity
  • Maioria dos SaaS são concorrência monopolística
  • Consumer surplus alto → alta retention e NPS
  • Producer surplus = lucro (em eq. de longo prazo)
  • Price caps em software criam escassez e DWL
  • Freemium maximiza CS, mas pode reduzir PS (veremos Aula 15)

Próximos passos:

  • Aula 14: Barreiras à Entrada - como criar moats econômicos
  • Aula 15: Discriminação de Preços - capturar mais surplus
  • Aula 16: Winner-Takes-All - quando oligopólio emerge

Próxima aula

Barreiras à Entrada