Skip to content

Commit e5990c8

Browse files
committed
refactor(return): add behavior specifications and policy_url terms link
1 parent 87a7de0 commit e5990c8

2 files changed

Lines changed: 38 additions & 0 deletions

File tree

docs/specification/return.md

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,16 @@ This extension adds a `return_policies` registry to Checkout and a reference on
3636
- `methods[]` — permitted physical methods (in-store, by-mail, etc.)
3737
- `fee` — the cost structure for that specific method.
3838
- `reason` — human-readable explanation of why this policy applies.
39+
- `policy_url` — URL to the merchant's full return policy document.
40+
41+
### Relationship to Other Extensions
42+
43+
The Return Extension is independent of the Fulfillment Extension. Businesses MAY use information from `fulfillment` to compute return options (e.g., in-store return locations may correlate with fulfillment retail locations), but this extension does NOT model that relationship. Platforms MUST NOT assume any structural correlation between return methods and fulfillment methods.
44+
45+
### Scope and Future Directions
46+
47+
- **Pre-Purchase Disclosure Only**: This extension addresses pre-purchase disclosure of return policy only. Post-purchase return initiation, label generation, refund processing, and exchange execution are out of scope. A future `dev.ucp.shopping.return_action` extension may address these workflows; implementers MUST NOT extend this schema for those purposes.
48+
- **Product-Level Returns**: A return policy is fundamentally a property of a product (or its category), not a property of a checkout. A separate Product or Catalog capability could expose return policies at the catalog level in the future. For v1, checkout-time exposure is used for simplicity.
3949

4050
**Mental model:**
4151

@@ -114,12 +124,17 @@ requirements of a purchase before completion.
114124
| ------------------- | ----------------------- | -------- | -------------------------------------------------- |
115125
| `return_policy` | `return_period_in_days` | No | Quantitative window for the return. |
116126
| `return_policy` | `reason` | No | Human-readable explanation of policy application. |
127+
| `return_policy` | `policy_url` | No | URL to the merchant's full return policy document. |
117128
| `return_policy` | `supported_resolutions` | No | Allowed outcomes (refund, exchange, etc.). |
118129
| `return_method.fee` | `display_text` | No | Context for the fee (e.g., "Restocking Fee"). |
119130
| `return_method.fee` | `amount` | No | Price in minor units for fixed fees. |
120131

121132
### Business Responsibilities
122133

134+
**For Policy Locking:**
135+
136+
- **MUST** honor the return policy that was in effect at the time of order placement; that policy MUST be sourced from the Order resource (when available) rather than recomputed from current merchant rules. The return policy returned at checkout response time is the policy in effect for the buyer at that moment.
137+
123138
**For `return_period_in_days`:**
124139

125140
- **MUST** accurately reflect the merchant's legal and commercial return window
@@ -147,6 +162,23 @@ assurance:
147162
- Use `return_period_in_days` to calculate and display the specific return
148163
deadline based on the delivery date.
149164

165+
**For Partial Quantity Returns:**
166+
167+
- **SHOULD** assume return policies apply to individual units within a line item. Unless specified otherwise (e.g., for bundled items), any subset of quantities is subject to the same return policy.
168+
169+
**For Absent Policy Data:**
170+
171+
- **MUST NOT** infer items are non-returnable if the Return capability is advertised in discovery but `return_policies` is absent or empty in a checkout response. Platforms SHOULD fall back to general merchant return info (e.g., via the merchant's profile URL).
172+
173+
**Interpretation of Policy States:**
174+
175+
Platforms MUST interpret combinations of `methods` and `return_period_in_days` as follows:
176+
177+
- `methods` absent or empty (`[]`): Treat as "no return methods supported" (i.e., non-returnable/final sale).
178+
- `return_period_in_days` is `0`: Treat as "non-returnable" (final sale).
179+
- `return_period_in_days` absent, but `methods` present: Treat as "no time limit on returns".
180+
- `return_period_in_days` present, but `methods` absent/empty: Ambiguous. Interpret as returnable, but client/buyer must arrange their own return shipment, or consult the full policy link if provided.
181+
150182
## Examples
151183

152184
### Mixed Cart
@@ -172,6 +204,7 @@ In this example, apparel items reference a standard policy, while a custom item
172204
"return_policies": {
173205
"rp_standard": {
174206
"return_period_in_days": 30,
207+
"policy_url": "https://example.com/returns",
175208
"supported_resolutions": ["original_payment_method", "exchange"],
176209
"methods": [
177210
{

source/schemas/shopping/return.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@
3232
"reason": {
3333
"type": "string",
3434
"description": "Human-readable explanation of why this return policy applies. Helps platforms and agents explain policy provenance to buyers (e.g., 'Custom engraved items are non-returnable per our personalization policy'). Optional."
35+
},
36+
"policy_url": {
37+
"type": "string",
38+
"format": "uri",
39+
"description": "URL to the merchant's full return policy document. Platforms SHOULD surface this link alongside the structured policy data so buyers can review complete terms."
3540
}
3641
}
3742
},

0 commit comments

Comments
 (0)