checkout-datetime (re-enabled, no longer excluded): - api_version was declared as "2025-10" but @shopify/ui-extensions-react has no release for that channel at all (jumps 2025.7.4 -> 2026.0.0 directly) — downgraded to "2025-07" to match what's actually installed and what the code was written/typed against. Verified all three targets (purchase.checkout.block.render, purchase.thank-you.block.render, customer-account.order-status.block.render) exist in that package version before making the change. - [extensions.capabilities] network_access was missing entirely (dropped during the multi-pin-pickup rewrite) despite Checkout.jsx's authedFetch() genuinely needing it — the checkout sandbox would have silently blocked every fetch() call at runtime even though it deployed fine. - OrderStatus.jsx imported reactExtension/BlockStack/Heading/Text/ useTranslate from the *checkout* surface behind a "might not be in the type definition" @ts-ignore, for a *customer-account* target. Verified @shopify/ui-extensions-react/customer-account re-exports the same component names for real and switched the import, removing the @ts-ignore entirely — it now typechecks for real instead of being suppressed. - lib.js's shared useConfirmationText() hardcoded useTranslate/ useAttributes from the checkout surface, but was called from both ThankYou.jsx (checkout) and OrderStatus.jsx (customer-account) — hooks are bound to their surface's React context, so calling checkout-bound hooks from a customer-account extension would break at runtime even though nothing caught it statically. Changed it to a plain function (confirmationText) taking translate/attributes as parameters; each caller now calls its own surface's hooks and passes the results in. payment-customization: schema.graphql never existed (not gitignored, just never fetched/committed when this extension was added — HANDOVER.md's note that this was "by design" was wrong). Fetched via `shopify app function schema` and committed, matching the pattern already used by validation-slot/delivery-customization. Together these three issues were silently failing every single `shopify app deploy` for the whole app, which is why shopify.app.toml's App Proxy URL fix never actually reached Shopify's servers. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
checkout-datetime
Checkout UI Extension. Three targets in one extension:
| Module | Target | Plans |
|---|---|---|
src/Checkout.jsx |
purchase.checkout.block.render |
Plus only — native in-checkout date/time picker |
src/ThankYou.jsx |
purchase.thank-you.block.render |
all plans |
src/OrderStatus.jsx |
customer-account.order-status.block.render |
all plans |
The picker calls this app's own checkout.scheduling.availability /
checkout.scheduling.hold routes (session-token auth) and draws from the
same capacity pool as the storefront widget and POS. It only collects a
selection into checkout attributes — the validation-slot Function is still
what enforces it, so the extension is not a security boundary.
The all-plan confirmation is also covered by the theme block
extensions/datetime-widget/blocks/order-confirmation.liquid; the Thank you
/ Order status modules here are the Plus-native version of the same thing.
Before deploy
npm --prefix extensions/checkout-datetime install(pulls@shopify/ui-extensions+preact).- In the extension's settings (Partners dashboard or
shopify.extension.tomldefaults), set App backend URL to the same value asapplication_urlinshopify.app.toml— the extension runs on a different origin and needs the absolute URL to reach the backend. shopify app deploy.
The previous build output under
dist/is gitignored and regenerated on deploy — thissrc/tree is the source of record.
Type checking
tsconfig.json ships with checkJs: false because this source hasn't yet
been iterated against the live @shopify/ui-extensions checkout component
types (that needs the extension's deps installed and, ideally, a real
checkout to verify runtime shapes — same caveat pos-datetime carries).
Before deploying: npm install in this folder, flip checkJs back to
true, run npm run typecheck, and reconcile the <s-*> component props
against the real typings. The decision logic it depends on
(resolveAvailabilityRequest, resolveHoldRequest) is already fully
tested on the server side.