Pickup silently dropped at Shopify merchants — is `pickup` supported, and can the CLI warn on unsupported method types?
Nobody has claimed this yet.
- Dominant language
- TypeScript
- Stars
- 75
- Forks
- 10
- Avg merge
- 2d 24m
- Merged PRs (30d)
- 17
Description
Two things bundled: a question about expected behavior, and a small CLI ask that falls out of it.
What I hit
A Shopify merchant (nomenaroasters.com) offers free local pickup on its own checkout, but I can't select it over UCP. Sending a pickup fulfillment method returns fulfillment.methods: [] — no error, no message naming pickup. It's silently discarded.
The merchant's profile declares:
"dev.ucp.shopping.fulfillment": [{ "config": {
"allows_multi_destination": { "shipping": false },
"allows_method_combinations": [["shipping"]]
}}]
So the shipping-only declaration is consistent with the behavior. What surprised me is that it's every Shopify store I checked, including ones with retail locations and in-store pickup — allbirds, gymshark, keychron, brooklinen, glossier, mejuri, drinkolipop, deathwishcoffee all return [["shipping"]].
Meanwhile pickup is genuinely available on the storefront:
curl -s 'https://nomenaroasters.com/variants/52743261028663/?section_id=pickup-availability'
# -> "איסוף זמין, מוכן בתוך 24 שעות" (pickup available, ready in 24h), Allenby 54, Tel Aviv
Questions
- Is
pickupcurrently unimplemented in Shopify's UCP surface, or is it a merchant-side opt-in? If it's a setting the merchant controls, which one — I'd like to tell this merchant what to enable. - If it's platform-side, is it on the roadmap, and is it gated on the Locations capability (
Universal-Commerce-Protocol/ucp#589, merged Aug 25) or RFC #375? - Is
continue_urlhandoff the intended path for pickup in the meantime? The fulfillment spec says the platform SHOULD hand off when it can't process the buyer's chosen option, which is what I've settled on — just confirming that's the sanctioned answer rather than something I'm working around.
CLI ask
When a requested fulfillment.methods[].type isn't in the merchant's declared allows_method_combinations, could the CLI surface that? Discovery already has the config, so it's knowable before dispatch — a warning, or a message on the response, would have saved a long debugging session.
Two things made this hard to diagnose from the CLI alone:
- The drop is silent.
methods: []with no message mentioning pickup reads as "my payload shape is wrong," so I kept trying new shapes. - Fulfillment updates are full-replace, so a dropped method takes buyer state with it. Sending pickup to a checkout that already had an address wiped both the address and the buyer email and moved status from
ready_for_completeback toincomplete, re-raisingdelivery_address_requiredanddelivery_no_delivery_available. Every retry failed with different-looking errors that were all the same underlying drop.
--dry-run confirms "type": "pickup" goes out on the wire intact, and allows_method_combinations appears nowhere in the CLI dist, so this is server-side behavior — the CLI just has no way to tell me about it today.
Repro
ucp discover --business https://nomenaroasters.com \
--view 'result.profile.ucp.capabilities."dev.ucp.shopping.fulfillment"[0].config'
VAR='gid://shopify/ProductVariant/52743261028663'
CART=$(ucp cart create --business https://nomenaroasters.com \
--set /line_items/0/item/id="$VAR" \
--set /line_items/0/quantity=1 --set /context/address_country=IL | jq -r '.result.id')
CO=$(ucp checkout create --business https://nomenaroasters.com \
--input "{\"cart_id\":\"$CART\",\"line_items\":[]}" | jq -r '.result.id')
LINE=$(ucp checkout get "$CO" --business https://nomenaroasters.com | jq -r '.result.line_items[0].id')
ucp checkout update "$CO" --business https://nomenaroasters.com --input "{
\"line_items\": [{\"id\":\"$LINE\",\"item\":{\"id\":\"$VAR\"},\"quantity\":1}],
\"fulfillment\": {\"methods\":[{\"type\":\"pickup\",\"line_item_ids\":[\"$LINE\"]}]}
}" | jq '.result.fulfillment'
# -> { "methods": [] }
Swapping pickup for shipping with a destination returns one option and ready_for_complete, so the rest of the flow is fine.
Env: @shopify/ucp-cli 0.7.0, node 24.5.0, macOS. UCP profile version 2026-04-08.
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the ucp discover output and the ucp checkout update flow in the reproduction, then compare allows_method_combinations with the requested fulfillment.methods[].type. Use --dry-run and the supplied Shopify checkout sequence to trace where the response is handled. Done means an unsupported method is surfaced clearly by the CLI without silently presenting an empty fulfillment result.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- cli, developer-experience
- Issue type
- Feature
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100