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.searchebr.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 atendedestinations[]— onde cumprir (endereço, localização da loja)groups[]— pacotes gerados por negócios, cada um comoptions[]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 $5options[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 lojaoptions[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
descriptionestiver ausente
Para options[].description:
- NÃO DEVE repetir
titleoutotal— 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,descriptionetotal - 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[].descriptionpara 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 estoque
json { "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 campodescriptionpermite 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.
Descoberta de catálogo¶
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 emlocationDEVE aceitar o mesmo ID comoselected_destination_idpara 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 relataravailability. 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 idlocation— 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 — normalmentelocation. Ele restringe os resultados ao que podem ser cumpridas aí e sementes métodoavailability, podendo diferir decontext(por exemplo, um presente).filters.methodsrestringe 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[]comgroups.length === 1A 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
}
]
}
]
}
]
}
]
}
}