Pular para conteúdo

Extensão de Cumprimento

Visão geral

A extensão de atendimento permite que as empresas anunciem suporte para serviços físicos atendimento de mercadorias (envio, coleta, etc).

Esta extensão adiciona um campo fulfillment ao Checkout e/ou Catálogo:

  • Checkout (br.dev.bcp.shopping.checkout) — seleção e custo: qual os itens vão para onde, por qual método, a que preço e ETA.
  • Catálogo (br.dev.bcp.shopping.catalog.search e br.dev.bcp.shopping.catalog.lookup) — descoberta: uma variante anuncia o opções de atendimento disponíveis para ele, com base no comprador fornecido contexto. Consulte Descoberta de catálogo.

No Checkout, o campo fulfillment contém:

  • methods[] — métodos de atendimento aplicáveis aos itens do carrinho (envio, retirada, etc.)
    • line_item_ids — quais itens esse método atende
    • destinations[] — onde cumprir (endereço, localização da loja)
    • groups[] — pacotes gerados por negócios, cada um com options[] selecionável
  • available_methods[] — disponibilidade de estoque por item (opcional)

Modelo mental:

  • methods[0] Envio *line_item_ids👕👖
    • selected_destination_id = destinations[0].id 🔘✅ 123 Fake St *groups[0]📦👕👖
      • selected_option_id = options[0].id 🔘✅ Padrão $5
      • options[1] 🔘 Expresso $10
  • methods[1] Retirada na loja *line_item_ids👞
    • selected_destination_id = destinations[0].id 🔘✅ Loja Uptown *groups[0]📦👞
      • selected_option_id = options[0].id 🔘✅ Retirada na loja
      • options[1] 🔘 Retirada na calçada

Esquema

O cumprimento se aplica apenas a itens que exigem entrega física. Itens não que exigem atendimento (por exemplo, bens digitais) não precisam ser atribuídos a um método.

Propriedades

Name Type Required Description
fulfillment Fulfillment No Fulfillment details.

Entidades

Cumprimento

Name Type Required Description
methods Array[Fulfillment Method] No Fulfillment methods for cart items.
available_methods Array[Fulfillment Available Method] No Inventory availability hints.

Método de Cumprimento

Name Type Required Description
id string Yes Unique fulfillment method identifier.
type string Yes Fulfillment method type.
Enum: shipping, pickup
line_item_ids Array[string] Yes Line item IDs fulfilled via this method.
destinations Array[Fulfillment Destination] No Available destinations. For shipping: addresses. For pickup: retail locations.
selected_destination_id ['string', 'null'] No ID of the selected destination.
groups Array[Fulfillment Group] No Fulfillment groups for selecting options. Agent sets selected_option_id on groups to choose shipping method.

Destino de Cumprimento

This object MUST be one of the following types: Shipping Destination, Retail Location.

Destino de Envio

Name Type Required Description
extended_address string No An address extension such as an apartment number, C/O or alternative name.
street_address string No The street address.
address_locality string No The locality in which the street address is, and which is in the region. For example, Mountain View.
address_region string No The region in which the locality is, and which is in the country. Required for applicable countries (i.e. state in US, province in CA). For example, California or another appropriate first-level Administrative division.
address_country string No The country. Recommended to be in 2-letter ISO 3166-1 alpha-2 format, for example "US". For backward compatibility, a 3-letter ISO 3166-1 alpha-3 country code such as "SGP" or a full country name such as "Singapore" can also be used.
postal_code string No The postal code. For example, 94043.
first_name string No Optional. First name of the contact associated with the address.
last_name string No Optional. Last name of the contact associated with the address.
phone_number string No Optional. Phone number of the contact associated with the address.
id string Yes ID specific to this shipping destination.

Localização de varejo

Name Type Required Description
id string Yes Unique location identifier.
name string Yes Location name (e.g., store name).
address Postal Address No Physical address of the location.

Grupo de Cumprimento

Name Type Required Description
id string Yes Group identifier for referencing merchant-generated groups in updates.
line_item_ids Array[string] Yes Line item IDs included in this group/package.
options Array[Fulfillment Option] No Available fulfillment options for this group.
selected_option_id ['string', 'null'] No ID of the selected fulfillment option for this group.

Opção de atendimento

Name Type Required Description
id string Yes Unique fulfillment option identifier.
title string Yes Short label (e.g., 'Express Shipping', 'Curbside Pickup').
description string No Complete context for buyer decision (e.g., 'Arrives Dec 12-15 via FedEx').
carrier string No Carrier name (for shipping).
earliest_fulfillment_time string No Earliest fulfillment date.
latest_fulfillment_time string No Latest fulfillment date.
totals Array[Total] Yes Fulfillment option totals breakdown.

Método disponível de atendimento

Name Type Required Description
type string Yes Fulfillment method type this availability applies to.
Enum: shipping, pickup
line_item_ids Array[string] Yes Line items available for this fulfillment method.
fulfillable_on ['string', 'null'] No 'now' for immediate availability, or ISO 8601 date for future (preorders, transfers).
description string No Human-readable availability info (e.g., 'Available for pickup at Downtown Store today').

Total

Name Type Required Description
type string Yes Cost category. Well-known values: subtotal, items_discount, discount, fulfillment, tax, fee, total. Businesses MAY use additional values.
display_text string No Text to display against the amount. Should reflect appropriate method (e.g., 'Shipping', 'Delivery').
amount Signed Amount Yes Monetary amount in the currency's minor unit as defined by ISO 4217. Refer to the currency's exponent to determine minor-to-major ratio (e.g., 2 for USD, 0 for JPY, 3 for KWD). May be negative — the sign is intrinsic to the value (e.g., discounts are negative, charges are positive).

Endereço Postal

Name Type Required Description
extended_address string No An address extension such as an apartment number, C/O or alternative name.
street_address string No The street address.
address_locality string No The locality in which the street address is, and which is in the region. For example, Mountain View.
address_region string No The region in which the locality is, and which is in the country. Required for applicable countries (i.e. state in US, province in CA). For example, California or another appropriate first-level Administrative division.
address_country string No The country. Recommended to be in 2-letter ISO 3166-1 alpha-2 format, for example "US". For backward compatibility, a 3-letter ISO 3166-1 alpha-3 country code such as "SGP" or a full country name such as "Singapore" can also be used.
postal_code string No The postal code. For example, 94043.
first_name string No Optional. First name of the contact associated with the address.
last_name string No Optional. Last name of the contact associated with the address.
phone_number string No Optional. Phone number of the contact associated with the address.

Exemplo```json

{ "ucp": { ... }, "id": "...", "status": "...", "currency": "...", "line_items": [ ... ], "totals": [ ... ], "links": [ ... ], "fulfillment": { "methods": [ { "id": "method_1", "type": "shipping", "line_item_ids": ["shirt", "pants"], "selected_destination_id": "dest_1", "destinations": [ { "id": "dest_1", "street_address": "123 Main St", "address_locality": "Springfield", "address_region": "IL", "postal_code": "62701", "address_country": "US" } ], "groups": [ { "id": "package_1", "line_item_ids": ["shirt", "pants"], "selected_option_id": "standard", "options": [ { "id": "standard", "title": "Standard Shipping", "description": { "plain": "Arrives Dec 12-15 via USPS" }, "totals": [ { "type": "total", "amount": 500 } ] }, { "id": "express", "title": "Express Shipping", "description": { "plain": "Arrives Dec 10-11 via FedEx" }, "totals": [ { "type": "total", "amount": 1000 } ] } ] } ] } ] } } ```## Renderização

As opções de atendimento foram projetadas para renderização independente de método. Plataformas não precisa entender tipos de métodos específicos (envio, coleta, etc.) para apresentar opções de forma significativa. A empresa fornece dados pré-computados, campos legíveis por humanos que as plataformas renderizam diretamente.

Campos legíveis por humanos

Localização Campo Obrigatório Finalidade
groups[].options[] title Sim Rótulo primário que distingue dos irmãos
groups[].options[] description Não Contexto complementar ao título
groups[].options[] totals Sim Detalhamento de custos: um array de objetos total
available_methods[] description Não Explicação independente da disponibilidade alternativa

Responsabilidades Empresariais

Para options[].title:

  • DEVE distinguir esta opção de suas irmãs
  • DEVE incluir método e velocidade (por exemplo, "Envio expresso", "Retirada na calçada")
  • DEVE ser suficiente para a decisão do comprador se description estiver ausente

Para options[].description:

  • NÃO DEVE repetir title ou total — fornece apenas contexto suplementar
  • DEVE incluir horário, transportadora ou outros detalhes relevantes para a decisão
  • DEVE ser uma frase completa (por exemplo, "Chega de 12 a 15 de dezembro via FedEx")
  • PODE ser omitido se o título for autoexplicativo

Para available_methods[].description:

  • DEVE ser uma frase independente explicando o que, quando e onde
  • DEVE ser utilizável literalmente no diálogo da plataforma (por exemplo, "Calças disponíveis para retirada na Downtown Store hoje às 14h")

Para encomendar:

  • As empresas DEVERÃO devolver options[] em um pedido significativo (por exemplo, o mais barato primeiro, mais rápido primeiro)
  • As plataformas DEVEM preservar essa ordem, mas PODEM reordená-la (por exemplo, para corresponder às preferências conhecidas do comprador ou à classificação específica da superfície); eles DEVEM preservar o agrupamento de métodos/opções

Responsabilidades da plataforma

As plataformas DEVERÃO tratar o cumprimento como uma estrutura genérica e renderizável:

  • Renderize cada opção como um cartão usando title, description e total
  • Apresentar todos os métodos retornados – a seleção do método é uma decisão do comprador
  • Preservar a estrutura de métodos e opções – não mesclar ou desduplicar; a plataforma escolhe o pedido
  • Use available_methods[].description para apresentar alternativas ao comprador

As plataformas PODEM fornecer UX aprimorada para tipos de métodos reconhecidos (armazenar seletores para retirada, logotipos da transportadora para envio), mas isso é opcional. A linha de base contrato é: title + description + total é suficiente para renderizar qualquer opção.

Quando um comprador seleciona uma opção que a plataforma não consegue processar totalmente, o plataforma DEVE usar continue_url para entregar no caixa da empresa.

Métodos Disponíveis

Os métodos disponíveis indicam se um item pode ser atendido com um determinado método e quando. Casos de uso:

  • Métodos alternativos: "Essas calças também estão disponíveis para retirada na Downtown Store"
  • Atendimento mais tarde: encomendas, envio de itens de um armazém distante, retirada quando a loja obtém estoquejson { "ucp": { ... }, "id": "...", "status": "...", "currency": "...", "line_items": [ ... ], "totals": [ ... ], "links": [ ... ], "fulfillment": { "methods": [ { "id": "shipping", "type": "shipping", "line_item_ids": ["shirt", "pants"] }, { "id": "pickup", "type": "pickup", "line_item_ids": [] } ], "available_methods": [ { "type": "shipping", "line_item_ids": ["shirt", "pants"], "fulfillable_on": "now" }, { "type": "pickup", "line_item_ids": ["pants"], "fulfillable_on": "2026-12-01T10:00:00Z", "description": "Available for pickup at Downtown Store today at 2pm" } ] } }O campo description permite que as plataformas apresentem alternativas aos compradores:

🤖 A camisa e a calça são enviadas por US$ 5, chegando em 5 a 8 dias. Ou as calças podem ser retirado na Downtown Store em 4 horas.

Se o comprador optar pela retirada, mas a plataforma não suportar split cumprimento, a plataforma DEVE usar continue_url para entregar ao check-out da empresa.

Quando a extensão de atendimento estende a capacidade do Catálogo, cada variante em uma resposta de catálogo carrega um objeto fulfillment listando o atendimento métodos disponíveis para essa variante e sua disponibilidade – portanto, um comprador navegando no catálogo pode ver como um item pode ser atendido.

Métodos

fulfillment.methods[] lista os métodos disponíveis para uma variante. Cada método tem:

  • type — o método de atendimento (por exemplo, shipping, pickup); veja Tipos de métodos.
  • description — breve resumo voltado para o comprador sobre como é a variante cumprido através deste método (por exemplo, "Enviado em 2 a 4 dias úteis"). Diretamente renderizável; veja Renderização.
  • availability — se a variante está disponível através deste método no localização especificada ou inferida.
  • location — para métodos baseados em local (por exemplo, pickup), o valor resolvido ID do local e o identificador estável da empresa para esse local. Um empresa que anuncia retirada em location DEVE aceitar o mesmo ID como selected_destination_id para esse método, portanto, um local descoberto pode ser usado no carrinho e na finalização da compra.
  • options — escolhas concretas de atendimento dentro deste método (por exemplo Padrão, Expresso); veja Opções. Opcional.

O catálogo informa a disponibilidade de um único local por método — aquele especificado via fulfills_to ou inferido de context; descobrindo e a comparação de outros locais é tratada separadamente.

O nível de variante availability indica se a variante é obtido através de qualquer método; o próprio availability de um método é oficial para esse método. Quando um método indicar availability, os consumidores DEVEM usar para esse método e NÃO DEVE inferir a disponibilidade por método a partir do valor no nível da variante.

Opções

Um método PODE carregar options[], um subconjunto representativo de seu cumprimento opções - não é uma lista exaustiva. Sem destino ou carrinho cheio, O catálogo DEVE visualizar opções de limites significativas para o comprador (por exemplo, mais barato, mais rápido); o conjunto completo e em alta resolução é negociado no carrinho e finalize a compra assim que eles forem conhecidos.

Cada opção traz um id e um title (uma pequena etiqueta que o distingue de irmãos), além de um description renderizável opcional para contexto. Estes são uma base compartilhada: no checkout a mesma opção é composta com custo e timing (totals, transportadora, prazos de atendimento). A opção está aberta, então um a empresa PODE anotá-lo com campos adicionais. Um método também PODE levar nenhum, trazendo à tona apenas type, description e availability; as opções são aninhado diretamente sob o método, sem camada de grupo (ao contrário de checkout methods[].groups[].options[]).

Uma opção descoberta id permite que a escolha do comprador seja levada adiante: um negócio DEVE aceitar o mesmo id de selected_option_id no carrinho e finalização da compra. O id é um identificador de melhor esforço, não uma correspondência garantida – uma opção descobertos para um único produto podem diferir em um carrinho, onde outros produtos, quantidades e atendimento combinado modificam as opções.

Formas

Contêiner de Cumprimento

Container for fulfillment methods and availability.

Name Type Required Description
methods Array[object] No Fulfillment methods for cart items.
available_methods Array[object] No Inventory availability hints.

Método de Cumprimento

A fulfillment method (shipping or pickup) with destinations and groups.

Name Type Required Description
id string Yes Unique fulfillment method identifier.
type string Yes Fulfillment method type.
Enum: shipping, pickup
line_item_ids Array[string] Yes Line item IDs fulfilled via this method.
destinations Array[object] No Available destinations. For shipping: addresses. For pickup: retail locations.
selected_destination_id ['string', 'null'] No ID of the selected destination.
groups Array[object] No Fulfillment groups for selecting options. Agent sets selected_option_id on groups to choose shipping method.

Grupo de Cumprimento

A merchant-generated package/group of line items with fulfillment options.

Name Type Required Description
id string Yes Group identifier for referencing merchant-generated groups in updates.
line_item_ids Array[string] Yes Line item IDs included in this group/package.
options Array[object] No Available fulfillment options for this group.
selected_option_id ['string', 'null'] No ID of the selected fulfillment option for this group.

Opção de atendimentoA fulfillment option within a group (e.g., Standard Shipping $5, Express $15).

Name Type Required Description
id string Yes Unique fulfillment option identifier.
title string Yes Short label (e.g., 'Express Shipping', 'Curbside Pickup').
description string No Complete context for buyer decision (e.g., 'Arrives Dec 12-15 via FedEx').
carrier string No Carrier name (for shipping).
earliest_fulfillment_time string No Earliest fulfillment date.
latest_fulfillment_time string No Latest fulfillment date.
totals Array[object] Yes Fulfillment option totals breakdown.

Método disponível de atendimento

Inventory availability hint for a fulfillment method type.

Name Type Required Description
type string Yes Fulfillment method type this availability applies to.
Enum: shipping, pickup
line_item_ids Array[string] Yes Line items available for this fulfillment method.
fulfillable_on ['string', 'null'] No 'now' for immediate availability, or ISO 8601 date for future (preorders, transfers).
description string No Human-readable availability info (e.g., 'Available for pickup at Downtown Store today').

Localização e método: context e filters

  • context (address_country / address_region / postal_code) é onde está o comprador — uma dica não vinculativa que a empresa usa para relatar availability. Em um catálogo com escopo de mercado, PODE restringir os resultados; caso contrário, ele os anota em vez de removê-los.
  • filters.fulfills_to é onde o pedido é atendido — um único destino, nomeado por valor (um endereço aproximado: address_country / address_region / postal_code) ou por referência (um id location — um loja, ponto de coleta ou endereço salvo). As plataformas DEVERÃO fornecer um ou o outro, não ambos; se ambos estiverem presentes, uma empresa DEVE usar o mais específico — normalmente location. Ele restringe os resultados ao que podem ser cumpridas aí e sementes método availability, podendo diferir de context (por exemplo, um presente).
  • filters.methods restringe os resultados a tipos de métodos específicos (por exemplo, ["pickup"]).

Forneça a localização uma vez: context para onde o comprador está, fulfills_to para um destino explícito. Quando ambos estão presentes, fulfills_to substitui context.

Exemplo

Uma variante expõe dois métodos de atendimento: envio para o destinatário do comprador e retire hoje em uma loja nomeada. Cada método carrega sua própria disponibilidade, e pickup faz referência ao local resolvido por id.json { "ucp": { "version": "2026-07-14" }, "products": [ { "id": "prod_kettle", "title": "Electric Kettle", "description": { "plain": "1.7L electric kettle." }, "price_range": { "min": { "amount": 4999, "currency": "USD" }, "max": { "amount": 4999, "currency": "USD" } }, "variants": [ { "id": "var_ss", "title": "Stainless Steel", "description": { "plain": "Stainless steel finish." }, "price": { "amount": 4999, "currency": "USD" }, "availability": { "available": true, "status": "in_stock" }, "fulfillment": { "methods": [ { "type": "shipping", "description": { "plain": "Ships to your address in 1–4 business days" }, "availability": { "available": true, "status": "in_stock" }, "options": [ { "id": "std", "title": "Standard", "description": { "plain": "Arrives in 4 business days" } }, { "id": "exp", "title": "Express", "description": { "plain": "Next business day" } } ] }, { "type": "pickup", "description": { "plain": "Pickup today at Downtown Store" }, "location": "loc_downtown", "availability": { "available": true, "status": "in_stock" } } ] } } ] } ] }Cada método é uma maneira pela qual a variante pode ser cumprida, com seu próprio availability. O description de cada método pode ser renderizado diretamente, então um plataforma pode apresentá-lo sem reconhecer o type (ver Renderização). O description do método de envio visualiza o faixa de entrega, e seu options[] a refina (Standard, Express); coleta não carrega nenhum — options é opcional.

Configuração

Empresas e plataformas declaram restrições de cumprimento em seus perfis. As empresas buscam perfis de plataforma para adaptar as respostas de acordo.

A matriz extends lista os recursos que esta extensão adiciona de atendimento para. Checkout é a superfície transacional oficial; catálogo é para descoberta. Uma empresa lista os recursos do catálogo em extends para expor atendimento no catálogo ou os omite para definir o escopo apenas para finalização da compra.

Perfil da plataforma

As plataformas declaram suas capacidades de renderização usando platform_schema:

Name Type Required Description
supports_multi_group boolean No Enables multiple groups per method.

Plataformas que omitem configuração ou definem supports_multi_group: false recebem respostas de grupo único. A forma da resposta é sempre methods[].groups[] — a diferença é se groups.length pode exceder 1 dentro de cada método.

Declaração padrão (grupo único por método; cumprimento apareceu em check-out e na descoberta do catálogo):json { "br.dev.bcp.shopping.fulfillment": [ { "version": "2026-07-14", "spec": "https://bcp.dev.br/2026-07-14/specification/fulfillment", "schema": "https://bcp.dev.br/2026-07-14/schemas/shopping/fulfillment.json", "extends": [ "br.dev.bcp.shopping.checkout", "br.dev.bcp.shopping.catalog.search", "br.dev.bcp.shopping.catalog.lookup" ] } ] }Uma parte que não expõe a descoberta de catálogo PODE restringir extends a "br.dev.bcp.shopping.checkout" (formato de string) ou para uma matriz de elemento único.

Declaração de aceitação (as empresas PODEM retornar vários grupos por método):json { "br.dev.bcp.shopping.fulfillment": [ { "version": "2026-07-14", "spec": "https://bcp.dev.br/2026-07-14/specification/fulfillment", "schema": "https://bcp.dev.br/2026-07-14/schemas/shopping/fulfillment.json", "extends": [ "br.dev.bcp.shopping.checkout", "br.dev.bcp.shopping.catalog.search", "br.dev.bcp.shopping.catalog.lookup" ], "config": { "supports_multi_group": true } } ] }### Perfil da empresa

As empresas declaram quais configurações de atendimento suportam usando merchant_config:

Name Type Required Description
allows_multi_destination object No Permits multiple destinations per method type.
allows_method_combinations Array[array] No Allowed method type combinations.
{
"br.dev.bcp.shopping.fulfillment": [
{
"version": "2026-07-14",
"spec": "https://bcp.dev.br/2026-07-14/specification/fulfillment",
"schema": "https://bcp.dev.br/2026-07-14/schemas/shopping/fulfillment.json",
"extends": [
"br.dev.bcp.shopping.checkout",
"br.dev.bcp.shopping.catalog.search",
"br.dev.bcp.shopping.catalog.lookup"
],
"config": {
"multi_destination": [
{ "method": "shipping" }
],
"method_combinations": [["shipping", "pickup"]]
}
}
]
}
```Este exemplo diz: a remessa pode ir para vários endereços e os carrinhos podem misturar
envio+retirada.

Comportamento de resposta comercial

Quando supports_multi_group: false (padrão):

  • A empresa DEVE consolidar todos os itens em um único grupo por método A resposta ainda utiliza estrutura array: methods[].groups[] com groups.length === 1 A empresa PODE ainda devolver vários métodos (por exemplo, frete + retirada) se itens do carrinho exigem isso

Quando supports_multi_group: true:

  • As empresas PODEM retornar vários grupos por método com base no inventário, embalagem ou lógica de armazém
  • A plataforma é responsável por renderizar a UI de seleção de grupo (por exemplo, escolher velocidade de envio por pacote)

Tipos de métodos

fulfillment_method.type (checkout) e catalog_fulfillment_method.type (catálogo) compartilham um vocabulário de corda aberta. A apresentação é independente de método: plataformas DEVERÃO apresentar todos os métodos, renderizando description e availability independentemente de seu type (veja Renderização), e NÃO DEVE omitir um método apenas porque não reconhece seu type. O reconhecimento de um type permite apenas UX opcional específico do tipo.

Um método é identificado por seu type e seu escopo de atendimento (o que ele cumpre e onde). Uma empresa DEVE modelar variações no mesmo escopo (por exemplo, Standard vs Express) como options, e NÃO DEVE emitir vários métodos que diferem apenas em detalhes de nível de opção. Os métodos Same-type são válidos quando seu escopo difere - por ex. checkout pode conter dois métodos shipping para destinos diferentes. No catálogo, um método cobre uma única variante de uma só vez. local resolvido, então isso se reduz para no máximo um método por type.

Valores conhecidos:

Valor Significado
shipping A transportadora envia para o endereço do comprador.
pickup O comprador retira em local determinado.
curbside O comprador retira no local sem sair do veículo (drive-up).

Adicionando tipos de métodos. Como type é uma string aberta, uma empresa PODE introduzir um novo valor a qualquer momento sem alteração do consumidor: anuncia o valor (e o filtra via filters.methods), e os consumidores o apresentam como qualquer outro método.

Exemplo — adicionando home_installation. Nenhuma alteração de esquema ou registro é necessário. Emitir o valor diretamente como type no catálogo e checkout, e filtro com filters.methods: ["home_installation"]. Para carrinho e checkout negociação, declare seu comportamento no perfil comercial config — ex. incluir ["shipping", "home_installation"] em method_combinations para que um carrinho possa misturar itens enviados e instalados (veja Perfil da empresa). No método de uma variante de catálogo:json { "type": "home_installation", "description": { "plain": "Delivered and installed in your home" }, "availability": { "available": true } }## Exemplos

Básico

Configuração: Nenhuma necessária (comportamento padrão)json { "ucp": { ... }, "id": "...", "status": "...", "currency": "...", "line_items": [ ... ], "totals": [ ... ], "links": [ ... ], "fulfillment": { "methods": [ { "id": "method_1", "type": "shipping", "line_item_ids": ["shirt", "pants"], "selected_destination_id": "dest_1", "destinations": [ { "id": "dest_1", "street_address": "123 Main St", "address_locality": "Springfield", "address_region": "IL", "postal_code": "62701", "address_country": "US" } ], "groups": [ { "id": "package_1", "line_item_ids": ["shirt", "pants"], "selected_option_id": "standard", "options": [ { "id": "standard", "title": "Standard Shipping", "description": { "plain": "Arrives Dec 12-15 via USPS" }, "totals": [ { "type": "total", "amount": 500 } ] }, { "id": "express", "title": "Express Shipping", "description": { "plain": "Arrives Dec 10-11 via FedEx" }, "totals": [ { "type": "total", "amount": 1000 } ] } ] } ] } ] } }### Dividir grupos

Configuração: O perfil da plataforma requer config.supports_multi_group: true

A empresa divide os itens em vários pacotes; o comprador seleciona a taxa de envio por pacote.json { "ucp": { ... }, "id": "...", "status": "...", "currency": "...", "line_items": [ ... ], "totals": [ ... ], "links": [ ... ], "fulfillment": { "methods": [ { "id": "method_1", "type": "shipping", "line_item_ids": ["shirt", "pants"], "selected_destination_id": "dest_1", "destinations": [ { "id": "dest_1", "street_address": "123 Main St", "address_locality": "Springfield", "address_region": "IL", "postal_code": "62701", "address_country": "US" } ], "groups": [ { "id": "package_1", "line_item_ids": ["shirt"], "selected_option_id": "standard", "options": [ { "id": "standard", "title": "Standard", "totals": [ {"type": "total", "amount": 500} ] }, { "id": "express", "title": "Express", "totals": [ {"type": "total", "amount": 1000} ] } ] }, { "id": "package_2", "line_item_ids": ["pants"], "selected_option_id": "express", "options": [ { "id": "standard", "title": "Standard", "totals": [ {"type": "total", "amount": 500} ] }, { "id": "express", "title": "Express", "totals": [ {"type": "total", "amount": 1000} ] } ] } ] } ] } }### Dividir destinos

Configuração: O perfil comercial lista shipping em config.multi_destination

A camisa é enviada para a mãe (EUA), as calças são enviadas para a avó (Hong Kong). Dois métodos do mesmo tipo, cada um com seu destino.json { "ucp": { ... }, "id": "...", "status": "...", "currency": "...", "line_items": [ ... ], "totals": [ ... ], "links": [ ... ], "fulfillment": { "methods": [ { "id": "method_1", "type": "shipping", "line_item_ids": ["shirt"], "selected_destination_id": "dest_mom", "destinations": [ { "id": "dest_mom", "street_address": "123 Mom St", "address_locality": "Springfield", "address_region": "IL", "postal_code": "62701", "address_country": "US" } ], "groups": [ { "id": "package_1", "line_item_ids": ["shirt"], "selected_option_id": "standard", "options": [ { "id": "standard", "title": "Standard", "totals": [ { "type": "total", "amount": 500 } ] }, { "id": "express", "title": "Express", "totals": [ { "type": "total", "amount": 1000 } ] } ] } ] }, { "id": "method_2", "type": "shipping", "line_item_ids": ["pants"], "selected_destination_id": "dest_grandma", "destinations": [ { "id": "dest_grandma", "street_address": "88 Queensway", "address_locality": "Hong Kong", "address_country": "HK" } ], "groups": [ { "id": "package_2", "line_item_ids": ["pants"], "selected_option_id": "standard", "options": [ { "id": "standard", "title": "Standard", "totals": [ { "type": "total", "amount": 500 } ] }, { "id": "express", "title": "Express", "totals": [ { "type": "total", "amount": 1000 } ] } ] } ] } ] } }