Apostila · Engenharia de Software

E-commerce
técnico: entre
o clique e a devolução

Montar a loja resolve-se numa tarde. O difícil é tudo o resto: modelar o catálogo, contar existências sem vender o que não há, autorizar e capturar sem cobrar duas vezes, e cumprir as obrigações europeias que o material norte-americano nem menciona.

12 capítulosdo catálogo às devoluções
1 demo ao vivo60 segundos de Black Friday, 5 avarias
6 fontesverificadas, com o que cada uma não cobre

↓ role para começar

Capítulo 01 Fundamento

O que é realmente difícil no comércio digital

Não é montar uma loja — isso resolve-se numa tarde. É tudo o que acontece entre o clique e a devolução.

1.1 A ilusão da facilidade

Pôr um catálogo online nunca foi tão barato. É por isso que quase toda a gente subestima o resto — e o resto é onde os sistemas se partem:

PareceÉ
Mostrar produtosModelar produto, variante e unidade de venda sem se enganar (cap. 2)
Ter stockContar concorrentemente sem vender o que não existe (cap. 3)
Receber o pagamentoAutorizar, capturar, reconciliar e sobreviver a repetições (cap. 5)
Guardar a encomendaRepresentar um ciclo de vida que dura semanas (cap. 8)
EnviarFísica, com custo, atraso e prova (cap. 10)
Aceitar devoluçõesUm direito, não uma política (cap. 11)

Repare que a coluna da direita é quase toda sobre tempo e concorrência. Uma loja é um sistema onde muita gente age ao mesmo tempo sobre recursos finitos, e onde o processo de cada compra continua vivo durante semanas depois de o cliente ter fechado o separador.

1.2 As constantes, e porque a apostila se organiza à volta delas

A prospectiva sobre o Futuro do Comércio Digital fecha com uma lista do que não muda. Quatro dessas constantes decidem a arquitectura de qualquer loja:

ConstanteO que impõe ao sistema
Preço, disponibilidade e confiança decidem a compraOs três têm de estar certos ao mesmo tempo; um stock errado destrói os outros dois
Entregar é físicaHá um piso de custo e de tempo que nenhum software remove
Devolução faz parteO fluxo inverso não é excepção — é metade do desenho
A relação directa é o único activo que não é alugadoVer Email, CRM e Retenção
A diferença que separa isto de qualquer outro sistema

Num sistema comum, um erro mostra dados errados e corrige-se. Aqui, um erro move dinheiro — e mover dinheiro de volta não é a operação inversa de o mover, é um processo novo, com custo, prazo e obrigações próprias.

É por isso que a palavra que atravessa esta apostila é idempotência: fazer duas vezes a mesma coisa tem de ter o mesmo efeito que fazê-la uma vez. Num painel de administração, isso é higiene. Aqui, é a diferença entre cobrar 89 € e cobrar 178 €.

1.3 O que esta apostila é

É o «como fazer» que faltava ao lado da prospectiva. Não é um manual de nenhuma plataforma: quase tudo o que aqui está aplica-se tanto a quem constrói de raiz como a quem configura uma solução pronta — porque as decisões difíceis são as mesmas, e uma plataforma tomou-as por si sem lhe dizer quais.

Pressupõe conforto com bases de dados e APIs. API Design e Arquitetura e System Design são os vizinhos naturais, e esta apostila assume-os em vez de os repetir.

1.4 Uma advertência sobre o que se lê por aí

A maior parte do material técnico sobre comércio digital é norte-americano, e há duas áreas em que isso o torna não apenas incompleto, mas errado para quem vende na Europa: a autenticação do pagamento (cap. 6) e o direito de devolução (cap. 11). Nas duas, o que lá é opcional aqui é obrigatório — e numa delas a obrigação é de Junho de 2026.

Exercício 1.1 — Onde é que o seu sistema move dinheiro

Liste todos os pontos do seu sistema (ou do que planeia) em que uma operação move dinheiro: cobrar, reembolsar, capturar, anular. Para cada um, responda: o que acontece se esta operação for executada duas vezes? Se não souber responder a algum, encontrou o trabalho da semana.

Capítulo 02 Modelo

O catálogo: produto, variante, unidade de venda

A decisão de modelação mais cara de mudar, tomada quase sempre na primeira semana e quase sempre mal.

2.1 Três coisas que toda a gente chama «produto»

PRODUTO «Camisola de lã» o que o cliente procura e compara tem nome, descricao, fotografias │ ├── VARIANTE azul / M │ o que o cliente escolhe │ tem preco e existencias PROPRIOS │ └── VARIANTE azul / L SKU CAM-LA-AZ-M a unidade que o armazem conta 1 SKU = 1 sitio na prateleira

Confundir os três é a origem de metade dos problemas de catálogo. Existências pertencem à variante, nunca ao produto — «temos 40 camisolas» não é informação acionável se 38 forem tamanho XS.

O erro que só aparece no segundo ano

Modelar variantes como colunas — cor, tamanho — funciona até chegar o produto que tem voltagem, ou o que não tem variante nenhuma, ou o que tem três eixos. Aí acrescenta-se atributo_1, atributo_2, e ao fim de um ano ninguém sabe o que está em atributo_3.

Modele os eixos como dados, não como esquema: um produto tem N eixos de variação, cada eixo tem valores, e uma variante é uma combinação. Custa mais no primeiro dia e é a diferença entre acrescentar uma categoria nova numa tarde ou num trimestre.

2.2 Preço não é uma coluna

PerguntaPorque parte um preço único
Em que moeda?Converter no momento da compra dá preços que dançam ao sabor do câmbio
Com ou sem imposto?Em B2C europeu mostra-se com; em B2B, sem (cap. 7)
Para quem?Preço de campanha, de cliente com contrato, por quantidade
Quando?Uma promoção tem início e fim, e o histórico tem de sobreviver a ela
A regra que evita o pior dos processos

O preço que a encomenda regista é uma cópia, não uma referência. Se a linha de encomenda apontar para o preço actual do produto, uma alteração de preço amanhã reescreve o histórico de vendas de ontem — e a factura deixa de corresponder ao que foi cobrado.

Copie para a linha de encomenda o preço, a taxa de imposto e a descrição, no momento da compra. É duplicação deliberada, e é obrigatória: a factura é um documento sobre o passado.

2.3 Estados, não apagar

Um produto que deixa de ser vendido não pode desaparecer — está em encomendas antigas, em facturas, em devoluções ainda por chegar. Nunca apague; mude o estado: rascunho, activo, descontinuado, arquivado. Só o segundo aparece na loja; todos continuam a existir para o histórico.

2.4 O que torna um catálogo encontrável

Três coisas que valem mais do que qualquer motor de busca sofisticado: atributos estruturados (não escondidos na descrição), vocabulário do cliente em vez do interno — quem procura «casaco» não procura «outerwear» —, e sinónimos com registo do que não teve resultados. A lista de pesquisas sem resultado é o documento mais útil de uma loja, e quase ninguém a lê.

Exercício 2.1 — O teste dos três eixos

Pegue no seu modelo de catálogo e tente acrescentar um produto com três eixos de variação — por exemplo cor, tamanho e material. Se precisar de alterar o esquema da base de dados, o modelo é rígido, e vai voltar a doer de cada vez que o negócio crescer para o lado.

Capítulo 03 Crítica

Existências: a corrida que vende o que não há

Funciona em desenvolvimento, funciona em testes, e parte-se exactamente no minuto em que a loja tem procura a sério.

3.1 O código que toda a gente escreve primeiro

// ler, decidir, escrever — três passos separados
var stock = repo.stockDe(sku);        // lê 3
if (stock >= quantidade) {            // decide: pode
  repo.definirStock(sku, stock - 1);  // escreve 2
  criarEncomenda(...);
}

Com um cliente de cada vez, está correcto. Com sete a carregar no mesmo segundo, os sete leem 3 antes de qualquer um escrever, os sete decidem que podem, e os sete recebem confirmação. Vendeu sete unidades de três.

t=0 cliente A le stock ....... 3 t=0 cliente B le stock ....... 3 t=0 cliente C le stock ....... 3 ... (7 clientes) t=1 todos decidem: "ha stock" t=2 todos escrevem ───────────────────────────── stock final ............. 2 encomendas confirmadas .. 7 unidades reais .......... 3 4 clientes vao receber um email a dizer que afinal nao ha

3.2 A correcção, que cabe numa linha

-- ler, decidir e escrever numa só operação atómica
UPDATE variantes
   SET stock = stock - :qtd
 WHERE sku = :sku
   AND stock >= :qtd;

-- 1 linha afectada → reservado. 0 linhas → não havia.

A base de dados decide, e decide uma vez de cada vez. O número de linhas afectadas é a resposta — não é preciso ler antes nem confiar no que se leu.

A regra geral, que serve para muito mais do que stock

Sempre que uma decisão dependa de um valor que outra pessoa pode estar a mudar, a leitura e a escrita têm de ser a mesma operação. Ler, pensar e escrever em três passos é correcto apenas enquanto ninguém mais estiver a trabalhar — e é por isso que estes erros nunca aparecem em desenvolvimento.

O mesmo mecanismo aparece em Java e Spring a propósito de reservatórios de ligações: recursos finitos disputados em paralelo é o mesmo problema com outra roupa.

3.3 Reservar não é vender

Entre pôr no cesto e pagar passam minutos. Se o stock só descer no fim, dois clientes chegam ao pagamento com a mesma unidade. Se descer no início, um cesto abandonado bloqueia stock para sempre.

Momento de reservarRisco
Ao pôr no cestoCestos abandonados bloqueiam stock que existe
Ao iniciar o pagamentoBom equilíbrio — com prazo de validade
Só ao confirmarFalha depois de o cliente já ter pago

A reserva tem de ter prazo — tipicamente 15 a 30 minutos — e alguém tem de a libertar quando expira. Uma reserva sem prazo é uma fuga: o stock desaparece do sistema sem sair do armazém, e ninguém liga a rotura ao carrinho que alguém abandonou há três semanas.

3.4 Sobrevender de propósito

Nem sempre é erro. Uma loja que reabastece depressa pode aceitar mais do que tem para não perder vendas. A diferença entre estratégia e avaria é uma só: o cliente sabe? «Envio em 3 a 5 dias» é uma promessa diferente de «em stock», e prometer a segunda para entregar a primeira é o que gasta a confiança que o capítulo 1 dizia decidir a compra.

Exercício 3.1 — A corrida, ao vivo

Ponha um artigo com stock 1 e dispare dois pedidos de compra em paralelo — dois terminais, dois curl ao mesmo tempo. Se as duas encomendas forem confirmadas, tem o problema deste capítulo, e leva menos de um minuto a descobrir.

Capítulo 04 Modelo

O checkout como máquina de estados

Tratado como formulário, é onde se perde a maior parte das compras já decididas.

4.1 Porque não é um formulário

Um formulário submete-se e acaba. Um checkout é interrompido: o cliente fecha o separador, muda de dispositivo, é levado ao banco para se autenticar (cap. 6), volta vinte minutos depois. Cada uma dessas interrupções tem de encontrar o processo onde ficou.

cesto → dados → envio → pagamento → confirmado │ │ │ │ │ │ │ └→ a autenticar (cap. 6) │ │ │ └→ recusado → volta atras │ │ └→ morada invalida → volta atras │ └→ abandonado (recuperavel) └→ expirado cada estado tem de ser RETOMAVEL e o stock reservado tem prazo (cap. 3.3)

4.2 O campo que não existe é o campo que não falha

CampoVeredicto
Criar conta antes de comprarTirar. É a maior causa isolada de abandono
Confirmar o email escrevendo-o outra vezTirar. Duplica o erro em vez de o apanhar
Código postalManter — e preencher a morada a partir dele
TelefoneManter se a transportadora o exigir; explicar porquê
«Como nos conheceu?»Tirar do checkout. Pergunte depois da compra
Compra sem conta, e a conta depois

Deixe comprar sem conta e ofereça a criação depois da confirmação, quando já tem o email e a morada e basta uma palavra-passe. Ganha a venda e ganha a conta — pela ordem inversa da habitual, que é a ordem que funciona.

4.3 As três coisas que têm de estar visíveis antes do botão

  1. O custo total. Portes que aparecem no último passo são a segunda maior causa de abandono, e a mais irritante porque é evitável.
  2. Quando chega. Uma data estimada vale mais do que o nome do serviço de transporte.
  3. Como se devolve. Não é letra pequena — é um argumento de venda, e a partir do capítulo 11 é também uma obrigação legal.

4.4 Erros que não expulsam

Validar no lado do cliente e no servidor, mostrar o erro ao lado do campo, e nunca perder o que já foi preenchido. Um checkout que devolve a página em branco depois de um erro perdeu a venda — e a irritação é lembrada muito depois de o erro ser corrigido. UX Writing e Microcopia trata do texto destas mensagens, que é onde a diferença se joga.

Exercício 4.1 — Interromper de propósito

Comece uma compra na sua loja e, a meio do pagamento, feche o separador. Volte cinco minutos depois. Encontra o processo onde ficou, ou tem de começar do princípio? E o stock que estava reservado — foi libertado?

Capítulo 05 Técnica

Pagamentos: autorizar não é cobrar

Dois passos que quase toda a gente trata como um, e o mecanismo que impede que uma repetição custe o dobro.

5.1 Os dois momentos

AutorizaçãoCaptura
O que fazReserva o valor no cartãoMove o dinheiro
QuandoNo checkoutIdealmente ao expedir
Se correr malAnula-se sem custoExige reembolso, que é outro processo
ValidadeDias — e expira
Capturar ao expedir, e o que isso obriga

Cobrar só quando o produto sai evita reembolsar tudo o que se cancela — e em muitas jurisdições cobrar antes de expedir é discutível.

Mas obriga a duas coisas: vigiar a validade da autorização, porque expira ao fim de dias, e ter um caminho para quando a captura falha depois de o cliente já ter recebido confirmação. Quem captura logo troca este problema por outro — reembolsos frequentes, que custam dinheiro e reputação junto do banco.

5.2 A chave de idempotência

O cliente carrega duas vezes. A rede repete o pedido. O seu código tenta outra vez porque não recebeu resposta. Em qualquer destes casos, sem protecção, cobra duas vezes.

POST /pagamentos
Idempotency-Key: enc_8f4c2a91-checkout   // gerada UMA vez, no início

// 1ª vez  → processa e guarda o resultado sob esta chave
// 2ª vez  → devolve o MESMO resultado, sem cobrar de novo
O erro que anula a protecção inteira

Gerar a chave no momento do envio em vez de no início do processo. Assim, cada tentativa produz uma chave nova, e o sistema de pagamentos vê duas operações legitimamente diferentes.

A chave tem de nascer com a tentativa de compra e sobreviver a todas as repetições dela. Guarde-a na sessão do checkout, não a recalcule.

5.3 O webhook é a fonte de verdade, não o regresso do cliente

O padrão errado, e é o mais comum: criar a encomenda quando o cliente volta à página de sucesso. Basta o cliente fechar o separador ao voltar do banco para o dinheiro ter sido cobrado e a encomenda não existir.

ERRADO cliente volta → cria encomenda → fechou o separador? dinheiro cobrado, sem encomenda CERTO webhook do fornecedor → cria/confirma cliente volta → so MOSTRA o estado → e o webhook pode chegar ANTES do cliente voltar, ou DUAS vezes, ou fora de ordem
Regra do webhookPorquê
Verificar a assinaturaSem isso, qualquer pessoa confirma encomendas por si
Tratar repetiçõesSão garantidos «pelo menos uma vez», nunca «exactamente uma»
Aceitar fora de ordemA captura pode chegar antes da autorização
Responder depressa e processar depoisUma resposta lenta faz o fornecedor repetir

5.4 Reconciliar, porque os dois lados divergem sempre

Uma vez por dia, compare o que o sistema julga ter cobrado com o que o fornecedor diz ter cobrado. Vão divergir — um webhook perdido, uma captura falhada, um reembolso feito no painel do fornecedor e não no seu sistema. A pergunta não é se acontece; é se descobre no dia seguinte ou no fecho do trimestre.

Exercício 5.1 — Repetir o webhook

Reenvie manualmente um webhook de pagamento já processado, a partir do painel do seu fornecedor. O sistema cria uma segunda encomenda, ou reconhece que já a tinha? É o teste mais rápido de saber se está protegido.

Capítulo 06 Crítica

SCA: o passo que o material americano não menciona

Na Europa, autenticar o pagamento é obrigação legal desde 2019. Quem desenha o checkout a partir de exemplos norte-americanos descobre isto tarde.

6.1 O que a lei exige

A Directiva dos Serviços de Pagamento (PSD2, 2015/2366/UE) introduziu a autenticação forte do cliente — em inglês, Strong Customer Authentication —, em vigor desde 13 de Setembro de 2019. Exige que o pagamento seja confirmado com pelo menos dois de três factores independentes:

FactorExemplo
Algo que se sabeUm código, uma palavra-passe
Algo que se temO telemóvel, o cartão físico
Algo que se éImpressão digital, reconhecimento facial

Na prática, quase sempre uma passagem pela aplicação do banco, ou por um ecrã de autenticação intermédio, a meio do pagamento.

A consequência técnica que muda o desenho

O pagamento deixa de ser síncrono. O cliente sai do seu site, autentica-se noutro lado e volta — se voltar. Tudo o que o capítulo 4 diz sobre estados retomáveis e o capítulo 5 sobre o webhook ser a fonte de verdade existe por causa disto.

Um checkout desenhado a assumir que «carregar em pagar» devolve sucesso ou falha na mesma resposta não funciona na Europa. E o problema não aparece nos testes, porque em modo de teste quase nunca se dispara a autenticação real.

6.2 As isenções, e porque não se deve contar com elas

SituaçãoPode dispensar autenticação
Valor baixoAté certo montante, e com contagem — ao fim de várias, pede na mesma
Comerciante de confiançaSe o cliente o marcou como tal no banco
Pagamento recorrenteA primeira autentica-se; as seguintes, tipicamente não
Iniciado pelo comercianteRenovações e cobranças programadas

Quem decide é o banco emissor, não o comerciante. Pode pedir a isenção e ser recusada. Desenhe sempre para o caso em que a autenticação acontece e trate a isenção como um bónus — o inverso produz um sistema que funciona em testes e falha com clientes reais.

6.3 O que se ganha: a responsabilidade muda de lado

Numa compra autenticada, a responsabilidade por uma contestação fraudulenta desloca-se do comerciante para o emissor. É o contrapeso ao atrito: mais um passo no checkout, e menos exposição a fraude com cartão roubado — que é o tipo de fraude que, sem autenticação, o comerciante paga sozinho, com o produto já expedido.

Fraude: os três sinais que valem por si

Antes de qualquer sistema de pontuação: morada de entrega diferente da de facturação em compras de valor alto, vários cartões no mesmo cliente em pouco tempo, e compra grande numa conta criada há minutos. Não são provas — são motivos para uma verificação manual em vez de uma recusa automática, que custa vendas legítimas.

6.4 O que aí vem, e o cuidado a ter ao ler sobre isso

Há uma revisão em curso — uma terceira directiva e um regulamento de serviços de pagamento — com acordo político alcançado em Novembro de 2025. Não estava adoptada em definitivo à data desta apostila. Vai encontrar muito texto a descrevê-la como se já fosse lei; antes de mudar um sistema por causa disso, confirme o estado do processo legislativo na fonte do capítulo 12.

Exercício 6.1 — Forçar a autenticação

O seu fornecedor de pagamentos tem cartões de teste que obrigam à autenticação. Use um e percorra o checkout até ao fim. Depois repita e abandone no ecrã do banco. O que acontece à encomenda? E ao stock reservado? As duas respostas costumam ser desagradáveis.

Capítulo 07 Técnica

Dinheiro: o capítulo que evita processos

Três decisões pequenas que, tomadas mal, produzem diferenças de cêntimos — e cêntimos em contabilidade são um problema muito maior do que parecem.

7.1 Nunca em vírgula flutuante

// o clássico, e é verdade em quase todas as linguagens
0.1 + 0.2 === 0.3   // false
0.1 + 0.2           // 0.30000000000000004

Números de vírgula flutuante são aproximações em base dois. Aplicados a dinheiro, produzem diferenças minúsculas que se acumulam e aparecem no fecho de contas, na diferença entre a soma das linhas e o total, ou numa factura que não bate certo por um cêntimo.

A regra

Guarde dinheiro como inteiro, na unidade mínima da moeda — cêntimos —, e formate só na apresentação. 8990 é 89,90 €. Todas as contas em inteiros; a divisão só no fim, com regra de arredondamento explícita.

Guarde sempre a moeda ao lado do valor. Um inteiro sem moeda é ambíguo, e ienes não têm casas decimais — a suposição de que «são sempre dois dígitos» é falsa.

7.2 Arredondar: onde, e uma vez só

Três linhas a 33,33 € com 23% de imposto podem dar dois totais diferentes conforme se arredonde por linha ou no fim. Nenhum está errado; ter os dois no mesmo sistema, sim.

Escolha uma regra, escreva-a, e aplique-a em todos os sítios — incluindo no que a factura mostra. Um cliente que soma as linhas e não chega ao total escreve ao apoio, e tem razão.

7.3 O IVA transfronteiriço, que apanha quem vende para fora

Desde Julho de 2021, existe um limiar único de 10 000 € por ano para o conjunto das vendas à distância a consumidores noutros Estados-membros. Abaixo dele, aplica-se tipicamente a taxa do país de origem; acima, aplica-se a taxa do país do consumidor.

SituaçãoConsequência prática
Abaixo do limiarUma taxa. O sistema pode ser simples
Acima do limiarTaxa por país de destino — o preço final varia com a morada
DeclaraçãoO regime de balcão único (OSS) permite declarar tudo num só Estado-membro
A implicação de desenho que se descobre tarde

Se a taxa depende do destino, o preço com imposto não pode ser um valor fixo no catálogo — depende da morada, que só se conhece a meio do checkout. Uma loja que mostra preços com IVA (o que é a norma no B2C europeu) tem de decidir o que faz quando o total muda ao introduzir a morada.

A saída habitual é fixar o preço final e absorver a diferença de taxa na margem. É uma decisão de negócio com consequência técnica — e é muito mais barata de tomar antes de construir do que depois.

7.4 A factura é imutável

Emitida, uma factura não se altera. Corrige-se com outro documento — nota de crédito. Isto tem duas consequências no modelo do capítulo 2: os valores são copiados para o documento, e a numeração é sequencial e sem buracos. Um número reservado e não usado é um problema, e reciclá-lo é pior.

Exercício 7.1 — Somar as linhas

Pegue numa factura real da sua loja com várias linhas e some-as à mão. Bate certo com o total, ao cêntimo? Se não bater, tem duas regras de arredondamento a conviver no mesmo sistema, e o problema vai crescer com o volume.

Capítulo 08 Modelo

A encomenda é um ciclo, não uma linha

Uma coluna «estado» com cinco valores parece suficiente durante seis meses. Depois começa a haver linhas que a realidade não consegue descrever.

8.1 Os estados que faltam sempre

criada ├→ a aguardar pagamento │ ├→ a autenticar (cap. 6) ← esquecido │ ├→ recusada │ └→ expirada ← esquecido ├→ paga │ ├→ em preparacao │ ├→ parcialmente expedida ← esquecido │ └→ expedidaentregue ├→ cancelada (antes de expedir) └→ devolvida (cap. 11) ├→ parcialmente devolvida ← esquecido └→ reembolsada

Os quatro marcados são os que quase nunca estão no primeiro desenho, e cada um deles aparece na primeira semana de operação real.

O sintoma de que a máquina de estados é pobre

Alguém corrigir encomendas directamente na base de dados. Quando a realidade não cabe nos estados possíveis, é isso que acontece — e o histórico deixa de ser confiável exactamente nos casos que mais interessa auditar.

Se ouvir «esta encomenda está estranha, vou corrigir na base de dados», não é um problema de operação. É o modelo a dizer que não sabe representar o que aconteceu.

8.2 Transições, não atribuições

A diferença entre um sistema que se aguenta e um que não: as transições permitidas são explícitas. De entregue não se volta a a aguardar pagamento. De cancelada não se passa a expedida. Escrever a lista das transições legais — e recusar as outras — é meia hora de trabalho que impede uma categoria inteira de estados impossíveis.

É a mesma ideia dos tipos fechados que Java e Spring aplica com sealed: tornar o estado impossível inexprimível, em vez de confiar que ninguém o vai escrever.

8.3 Guardar o que aconteceu, não só o que é

Só o estado actualEstado actual e histórico
«Está devolvida»«Foi paga às 14:12, expedida a 3, entregue a 5, devolvida a 11»
Impossível responder ao apoioResponde sozinho
Impossível auditarAuditável

É o mesmo princípio dos acontecimentos contra atributos de Email, CRM e Retenção: um estado substituído apaga o passado, e em comércio o passado é o que se tem de conseguir provar.

8.4 A encomenda não é o pagamento

São dois ciclos com ritmos diferentes, e juntá-los numa tabela é o que torna impossível representar o reembolso parcial, a segunda tentativa de pagamento ou a captura que falha depois da expedição. A encomenda é o que o cliente comprou; o pagamento é uma sequência de operações de dinheiro associadas a ela. Um para muitos, sempre.

Exercício 8.1 — Os quatro casos difíceis

Tente representar, no seu modelo actual: (a) metade da encomenda expedida e a outra metade em rotura; (b) um artigo devolvido de três; (c) pagamento recusado, cliente tenta outra vez e resulta; (d) reembolso de 12 € de portes sem devolução de produto. Cada um que não conseguir representar é uma correcção manual à espera de acontecer.

Capítulo 09 Método aplicado · Demo

Sessenta segundos de Black Friday

Role devagar. Um minuto de tráfego real sobre um artigo com três unidades — e as cinco avarias que só existem quando há gente a sério.

14:00:00

Seis meses em produção sem um incidente

É a parte que interessa. Nenhuma das cinco avarias que se seguem é um erro de programação — são todas comportamentos correctos de código escrito para um mundo onde as coisas acontecem uma de cada vez. A Black Friday não introduz erros novos; revela os que já lá estavam.

14:00:04 · a corrida

Sete confirmações para três unidades

Sete pedidos leem 3 antes de qualquer um escrever. Não há excepção, não há registo de erro, não há alerta — sete clientes recebem confirmação e quatro vão receber, horas depois, um email a dizer que afinal não há. O custo não é o stock: é a confiança que o capítulo 1 dizia decidir a compra.

14:00:11 · o duplo clique

178 € cobrados por uma camisola de 89 €

A página demorou, o cliente carregou outra vez. Sem chave de idempotência, são duas operações legítimas e diferentes aos olhos do fornecedor de pagamentos. O reembolso não é a operação inversa da cobrança — tem custo, prazo, e uma conversa com o apoio ao cliente.

14:00:19 · a ordem

Um cliente pagou e não tem encomenda

O webhook chegou em 300 ms; o cliente, com rede lenta, voltou nove segundos depois. Como a encomenda só é criada no regresso, o webhook não encontrou nada e desistiu. A ordem de chegada nunca esteve garantida — apenas nunca tinha sido posta à prova.

14:02 · a autenticação

Duas unidades presas durante trinta minutos

Dois clientes foram levados ao banco pela autenticação obrigatória e desistiram lá. As reservas têm prazo de trinta minutos — e não há nada a libertá-las mais cedo. Durante a hora de maior procura do ano, duas unidades existem no armazém e não podem ser vendidas. Ninguém vê isto: o painel diz stock zero, e stock zero parece sucesso.

15:30 · a limpeza

Quatro cancelamentos, dois reembolsos, uma correcção manual

E, no meio disso, a descoberta de que a máquina de estados não tem caminho para «paga e reembolsada sem nunca ter sido expedida». Alguém abre a base de dados e corrige à mão — e a partir daí o histórico dessa encomenda deixa de ser confiável, precisamente naquela que mais interessaria auditar.

A correcção

Quatro decisões, nenhuma tecnologia nova

Decremento atómico, chave de idempotência gerada no início, webhook como fonte de verdade, e libertação de reservas expiradas. Todas conhecidas, todas baratas, todas adiadas pela mesma razão: durante seis meses, o sistema funcionou sem elas. É esse o argumento que parece razoável até ao minuto em que deixa de ser.

O padrão, para lá deste caso

As cinco avarias têm a mesma forma: uma suposição sobre ordem ou exclusividade que era verdadeira com pouco tráfego. Só uma pessoa de cada vez. O cliente volta antes do webhook. Ninguém carrega duas vezes. Ninguém desiste a meio.

Nenhuma dessas suposições está escrita em lado nenhum, e é por isso que não são revistas. Escrevê-las é o exercício mais útil que uma equipa pode fazer antes de uma campanha.

Exercício 9.1 — As suas suposições

Escreva as suposições de ordem e de exclusividade do seu sistema — o que é que este código assume que não acontece ao mesmo tempo? Para cada uma, responda: o que se parte se acontecer? É a lista de tudo o que a sua próxima campanha vai testar por si.

Capítulo 10 Operação

Entregar é física

A constante que a prospectiva identifica e que nenhum software remove: há um piso de custo e de tempo, e ele decide mais do negócio do que a tecnologia.

10.1 O custo de servir, decomposto

ParcelaOnde se esconde
TransporteA única que quase toda a gente conta
PreparaçãoTempo de pessoa a recolher, verificar e embalar
EmbalagemMaterial, e o volume que ele acrescenta ao preço do transporte
ArmazenamentoEspaço ocupado por tempo — o artigo que não roda paga renda
DevoluçõesA parcela mais subestimada — cap. 11
ApoioCada «onde está a minha encomenda?» tem custo real
Portes grátis não são grátis

São uma decisão de margem disfarçada de decisão de marketing. Funcionam — reduzem o abandono do capítulo 4 — e transferem o custo para dentro do preço ou para fora da margem.

O erro caro não é oferecer portes; é oferecê-los sem saber o custo médio por encomenda e sem reparar que ele varia com o peso, o volume e o destino. Uma loja que oferece portes acima de 50 € e vende sobretudo artigos volumosos e baratos está a perder dinheiro em cada encomenda que celebra.

10.2 A promessa é um contrato

«Entrega em 2 a 3 dias úteis» é uma promessa cujo cumprimento não controla — depende da transportadora. Duas regras que reduzem quase todo o atrito:

10.3 Seguimento: o email que evita o contacto

Cada «onde está a minha encomenda?» é tempo de pessoa. A maior parte evita-se com três mensagens automáticas — confirmada, expedida com código de seguimento, entregue — que são também as três de Email, CRM e Retenção que ninguém classifica como marketing e toda a gente lê.

Note a implicação do capítulo 4 da apostila de retenção: estas mensagens saem do domínio transaccional. Se partilhar domínio com as promoções, uma campanha infeliz impede o cliente de receber o código de seguimento — e aí o custo de apoio volta todo.

10.4 Onde está o stock não é onde está o número

O stock do sistema e o stock da prateleira divergem sempre: quebras, erros de contagem, artigos danificados, devoluções ainda por conferir. A pergunta não é como evitar a divergência — é com que frequência se mede.

Contagem cíclica, por amostragem contínua, em vez de um inventário anual que pára a operação. E uma regra clara sobre o que fazer quando falha: é preferível uma loja que diz «esgotado» a uma que aceita e cancela — a segunda gasta a confiança do capítulo 1 e o dinheiro do capítulo 5.

Exercício 10.1 — O custo real por encomenda

Some as seis parcelas da tabela 10.1 e divida pelo número de encomendas do último mês. Compare com o que cobra de portes. A diferença, multiplicada pelo volume, é um número que costuma mudar decisões — e quase nunca é calculado.

Capítulo 11 Crítica

Devoluções: um direito, não uma política

Na União Europeia não se decide se se aceitam devoluções. Decide-se como. E desde Junho de 2026 há uma obrigação nova que muita loja ainda não cumpre.

11.1 Os catorze dias

A Directiva dos Direitos dos Consumidores (2011/83/UE) dá ao consumidor 14 dias para se retractar de uma compra à distância, sem indicar motivo. O prazo conta a partir da recepção dos bens — não da encomenda.

Ideia comumO que a directiva estabelece
«A nossa política é 30 dias, somos generosos»14 dias são o mínimo legal. Oferecer mais é comercial; oferecer menos não é possível
«Só aceitamos com a embalagem intacta»O consumidor pode examinar o bem. Pode haver responsabilidade por uso além disso, não recusa liminar
«Tem de explicar porquê»Sem motivo é literal
«Devolvemos o valor do produto»Inclui o custo de envio normal pago inicialmente

Há excepções — bens personalizados, perecíveis, selados por razões de saúde já abertos, entre outras. São excepções específicas, não uma cláusula geral de escape.

A obrigação nova, e é recente

A Directiva (UE) 2023/2673 introduziu na Directiva dos Direitos dos Consumidores um novo artigo 11.º-A: quando o contrato é celebrado através de uma interface em linha, o comerciante tem de disponibilizar uma função de retractação — na prática, um botão — claramente identificado, visível e disponível durante todo o prazo de retractação.

Prazo de transposição: 19 de Dezembro de 2025. Aplicação: 19 de Junho de 2026. Já está a correr.

Uma ressalva honesta: o diploma tem por objecto principal os serviços financeiros à distância, mas o artigo 11.º-A foi inserido na parte geral da directiva, e é assim que a generalidade dos comentadores o lê — aplicável a contratos à distância celebrados em linha. A extensão exacta está a ser discutida. Se vende para a UE, confirme com quem possa assinar a interpretação, porque a data já passou.

11.2 O fluxo inverso é um fluxo, não uma excepção

pedido de devolucao │ (o botao do 11.1, ou o apoio) ▼ autorizacao + etiqueta │ ▼ em transito de volta │ ▼ recebido e conferido ├→ revendavel → volta ao stock ├→ danificado → abate └→ errado → decidir e registar │ ▼ reembolso ← ligado ao pagamento original (cap. 8.4)

Cada passo precisa de estado próprio, e o reembolso tem de saber a que operação de pagamento corresponde. É por isso que o capítulo 8.4 separa encomenda de pagamento — sem essa separação, um reembolso parcial não tem onde existir.

11.3 A economia, que decide mais do que a regra

Uma devolução custa o transporte de volta, o tempo de conferência, a perda de valor do artigo e, muitas vezes, o reembolso dos portes originais. Em várias categorias, é mais barato reembolsar sem pedir o artigo de volta — e é uma decisão racional, não generosidade.

A contradição que só é aparente

Facilitar a devolução aumenta as vendas e aumenta as devoluções. O saldo é quase sempre positivo, pela mesma razão do capítulo 4 da apostila de retenção: o atrito que se põe à saída aparece à entrada. Quem hesita em comprar por não saber se pode devolver, não compra — e essa venda perdida não aparece em relatório nenhum.

Mas há o outro lado: uma taxa de devolução muito acima da categoria não é sinal de política generosa. É sinal de que as fotografias, as medidas ou a descrição estão a prometer outra coisa — e isso corrige-se no capítulo 2, não aqui.

Exercício 11.1 — O botão

Abra a sua loja e procure a função de retractação do artigo 11.º-A: visível, identificada e disponível durante todo o prazo. Depois calcule o custo médio de uma devolução, com as quatro parcelas do 11.3. Se a segunda conta lhe der um número maior do que o valor do artigo, encontrou uma categoria em que reembolsar sem recolher é a decisão certa.

Capítulo 12 Ofício · Catálogo

O que fica, e onde verificar

Doze regras que sobrevivem a mudanças de plataforma, e as fontes primárias onde se confirma o que aqui está.

12.1 As doze regras

  1. Existências pertencem à variante, nunca ao produto.
  2. Modele os eixos de variação como dados, não como colunas do esquema.
  3. Copie o preço e a taxa para a linha de encomenda. A factura é um documento sobre o passado.
  4. Ler, decidir e escrever têm de ser uma só operação sempre que o valor for disputado.
  5. Reservas têm prazo, e alguém tem de as libertar.
  6. Autorizar não é capturar. Capture ao expedir e vigie a validade.
  7. A chave de idempotência nasce no início da compra, não no momento do envio.
  8. O webhook é a fonte de verdade; o regresso do cliente só mostra.
  9. Desenhe sempre para o caso em que a autenticação acontece. A isenção é bónus.
  10. Dinheiro em inteiros, com a moeda ao lado, e uma só regra de arredondamento.
  11. Transições explícitas. Correcções manuais na base de dados são o modelo a falhar.
  12. Devolução é fluxo, não excepção — e na UE é direito, não política.
O fio que atravessa as doze

Sete são sobre o que acontece ao mesmo tempo ou fora de ordem. Uma loja é um sistema onde muita gente disputa recursos finitos e onde cada compra continua viva durante semanas depois de o cliente ter fechado o separador.

É por isso que quase todas as avarias caras aparecem só com tráfego a sério, e é por isso que a lista de suposições do exercício 9.1 vale mais do que qualquer teste de carga: o teste mede o que aguenta; a lista diz o que se parte.

12.2 Catálogo: onde verificar

Directiva 2011/83/UE — Direitos dos Consumidores

Quem: União Europeia, via EUR-Lex. O quê: o texto que estabelece os 14 dias de retractação, a informação pré-contratual e as excepções.

A favor: é a fonte, e resolve num parágrafo discussões que se arrastam em fóruns; as excepções ao direito de retractação estão lá enumeradas, não são interpretáveis à vontade.
Contra: é uma directiva — cada Estado-membro transpõe, e o detalhe aplicável é o da lei nacional.

eur-lex.europa.eu — dir/2011/83

Directiva (UE) 2023/2673 — a função de retractação

Quem: União Europeia. O quê: o diploma que introduz o artigo 11.º-A e a obrigação do botão, aplicável desde 19 de Junho de 2026.

A favor: é obrigação em vigor e recente, e a maior parte do material sobre comércio digital ainda não a menciona.
Contra, e é importante: o objecto principal do diploma são os serviços financeiros à distância; a extensão exacta do artigo 11.º-A a todo o comércio em linha está a ser discutida. Leia-o antes de aceitar qualquer resumo, incluindo este.

eur-lex.europa.eu — dir/2023/2673

Serviços de pagamento — Comissão Europeia

Quem: Comissão Europeia. O quê: a página oficial sobre a PSD2 e a autenticação forte, e o estado do processo de revisão (PSD3 e regulamento).

A favor: é onde se confirma o que já é lei e o que ainda é proposta — a distinção que o capítulo 6.4 avisa que muito texto ignora.
Contra: descreve o quadro, não a implementação; não encontra aqui como integrar nada.

finance.ec.europa.eu — payment services

Balcão Único do IVA (OSS)

Quem: Comissão Europeia. O quê: o regime que permite declarar num só Estado-membro o IVA devido em vários, e as regras de vendas à distância.

A favor: responde directamente à decisão de desenho do capítulo 7.3 — se a taxa depende do destino, o preço com imposto não pode ser fixo.
Contra: é matéria fiscal com particularidades nacionais; a decisão final é de um contabilista, não de quem programa.

vat-one-stop-shop.ec.europa.eu

A Sua Europa — Empresas

Quem: União Europeia. O quê: a versão praticável das obrigações de quem vende para outros Estados-membros — IVA, consumidores, contratos.

A favor: escrita para quem tem de decidir, não para juristas, e existe em português; é o melhor ponto de partida antes de ir ao texto legal.
Contra: simplifica por desenho — para casos limite volta a precisar da fonte.

europa.eu/youreurope/business

Documentação de pagamentos da Stripe

Quem: Stripe. O quê: a referência prática de fluxos de pagamento — autorização e captura, chaves de idempotência, webhooks, autenticação.

A favor: explica os conceitos melhor do que quase toda a literatura neutra, e quase tudo se transpõe para outros fornecedores; é onde os capítulos 5 e 6 se aprofundam.
Contra: é de um fornecedor — os nomes das operações e alguns comportamentos são próprios, e convém separar o que é do domínio do que é da Stripe.

docs.stripe.com/payments

As seis ligações foram verificadas em Setembro de 2026.

12.3 O que vem a seguir

Se o problema é a forma do sistema

Arquitetura e System Design para as fronteiras, API Design para o contrato, e Java e Spring para transacções e recursos finitos — o mesmo problema do capítulo 3 noutra roupa.

Se o problema é a procura

O Futuro do Comércio Digital é a prospectiva que esta apostila completa. Para o lado da procura, Tráfego Pago Avançado e Email, CRM e Retenção — que é onde se constrói a relação directa que o capítulo 1 nomeia como o único activo não alugado.

Se o problema é o cliente perder-se

UX Writing e Microcopia para as mensagens do checkout e dos erros, e Pesquisa com Utilizadores para descobrir onde é que ele se perde de facto.

Se o problema é medir

Experimentação, Feature Flags e A/B para testar alterações ao checkout sem se enganar, e Estatística I — Ver os Dados para ler o que sair.

12.4 A última ideia

Quase tudo o que corre mal numa loja tem a mesma forma: alguma coisa aconteceu ao mesmo tempo que outra, ou fora da ordem esperada, e o código assumia que não. As suposições não estão escritas em lado nenhum — é por isso que ninguém as revê, e por isso que a primeira campanha a sério é sempre a primeira auditoria a sério.

O resto é a constante mais antiga do comércio, que a prospectiva já dizia: preço, disponibilidade e confiança decidem a compra. Um stock que mente destrói os três de uma só vez, e nenhuma das doze regras acima existe por outra razão.