Cotações e propostas B2B
Como o cliente pede um preço especial a um seller, negocia e fecha, ou aprova por link sem login.
Em vendas B2B o preço raramente é o de tabela: o comprador pede uma cotação (em inglês, RFQ, request for quotation), o seller responde com preços e prazos, e só depois o pedido nasce. Esta seção cobre o lado do cliente nesse fluxo, incluindo a negociação em rodadas e a proposta por link, que deixa uma pessoa sem conta aprovar a compra.
Como funciona
O ciclo de uma cotação:
status | Significado | Quem move |
|---|---|---|
pending | O cliente pediu; o seller ainda não respondeu. | Cliente (cria) |
quoted | O seller respondeu com preços e, em geral, uma validade (valid_until). | Seller |
negotiating | Há rodadas de contraproposta em andamento (módulo enhanced-rfq). | Cliente ou seller |
accepted | O cliente (ou quem aprovou pelo link) aceitou os preços. | Cliente |
converted | Os itens foram para o carrinho. Fim do caminho da cotação. | Cliente |
rejected | Recusada pelo cliente ou pelo seller. | Cliente ou seller |
expired | Passou do valid_until sem decisão. | Automático, na leitura |
O fluxo de integração típico:
- Pedir a cotação
O cliente escolhe um seller e produtos dele: Pedir cotação.
- Esperar a resposta do seller
Consulte a cotação até o
statusvirarquoted. Se a loja envia a proposta por link, o cliente também recebe o link por e-mail. - Decidir ou negociar
Aceite ou recuse direto, ou negocie em rodadas.
- Levar ao carrinho e fechar
A cotação aceita vai ao carrinho com os preços acordados; o cliente segue pelo checkout normal da loja.
Conceitos-chave
Uma cotação, um seller
Uma cotação sempre pertence a um seller (lojista) e só aceita produtos dele. Para comprar de dois sellers, abra duas cotações.
Preço oferecido x preço de tabela
Cada linha tem product_price (tabela hoje), requested_price_cents (o que o cliente sugeriu) e offered_price_cents (o que o seller topou). Ao ir para o carrinho vale o oferecido; se o seller não definiu preço na linha, vale o de tabela.
Validade e expiração
O seller pode fixar valid_until. Não existe tarefa agendada: a cotação é marcada expired na primeira leitura depois do prazo, e accept e conversão recusam cotação vencida.
Aprovação por conta ou por link
Quem tem conta usa as rotas autenticadas (accept, convert-to-order). Quem não tem usa a proposta por link. As duas levam a cotação a accepted.
Endpoints
| Método e caminho | Para quê | Autenticação | Página |
|---|---|---|---|
POST /api/v1/storefront/quotes | Cria uma cotação | Token do cliente | Pedir e consultar cotações |
GET /api/v1/storefront/quotes | Lista as cotações do cliente | Token do cliente | Pedir e consultar cotações |
GET /api/v1/storefront/quotes/{id} | Detalhe de uma cotação | Token do cliente | Pedir e consultar cotações |
POST /api/v1/storefront/quotes/{id}/accept | Aceita a cotação | Token do cliente | Decidir uma cotação |
POST /api/v1/storefront/quotes/{id}/reject | Recusa a cotação | Token do cliente | Decidir uma cotação |
POST /api/v1/storefront/quotes/{id}/convert-to-order | Aceita e leva ao carrinho em um passo | Token do cliente | Decidir uma cotação |
POST /api/v1/storefront/quotes/{id}/counter | Contraproposta do cliente | Token do cliente | Negociar em rodadas |
GET /api/v1/storefront/quotes/{id}/negotiations | Histórico de rodadas | Token do cliente | Negociar em rodadas |
POST /api/v1/storefront/quotes/{id}/accept-round/{roundId} | Aceita uma rodada | Token do cliente | Negociar em rodadas |
POST /api/v1/storefront/quotes/{id}/reject-round/{roundId} | Recusa uma rodada | Token do cliente | Negociar em rodadas |
POST /api/v1/storefront/quotes/{id}/convert-to-cart | Leva a cotação aceita ao carrinho | Token do cliente | Negociar em rodadas |
GET /api/v1/storefront/quote-proposals/{token} | Abre a proposta pelo link | Pública | Proposta por link (sem login) |
GET /api/v1/storefront/quote-proposals/{token}/pdf | Baixa o PDF da proposta | Pública | Proposta por link (sem login) |
POST /api/v1/storefront/quote-proposals/{token}/approve | Aprova a proposta | Pública | Proposta por link (sem login) |
POST /api/v1/storefront/quote-proposals/{token}/reject | Recusa a proposta | Pública | Proposta por link (sem login) |
POST /api/v1/storefront/quote-proposals/{token}/comment | Comenta a proposta | Pública | Proposta por link (sem login) |