The SDK says an explicit base URL is required
SetNEXT_PUBLIC_CRAVEUP_API_URL to the API origin and rebuild. Do not append /api/v1/storefront; the SDK owns that path.
Browser requests fail CORS
Add the exact storefront origin, including scheme and host, to the API service’sCORS_ALLOWED_ORIGINS. Avoid wildcard origins. Confirm the preflight allows the headers used by the failed request.
Published data returns 404
Public catalog routes deliberately hide unpublished, inactive, or cross-tenant resources as not found. Verify the merchant/location is published and that the location belongs to the requested merchant.Cart request returns 401
The cart capability is absent, invalid, or belongs to another cart/location. Start a new ordering session if the saved capability is stale. Never substitute a private API key.Cart request returns CART_CONFLICT
Another mutation changed the cart revision. Fetch the cart, update the saved revision from ETag, present the current state, and let the shopper retry. Do not silently replay the mutation.
Cart request returns CART_IMMUTABLE
The cart is locked, completed, or expired. Preserve terminal checkout handling when applicable; otherwise clear the stale session and create a new cart.
Customer request returns 401
Confirm login and OTP requests used the samemerchantSlug, and that getAuthToken returns the current customer JWT. Clear the JWT and restart login when the session is expired or revoked.
Checkout appears stuck
Pollcheckout.getOrderResult with bounded backoff. payment_pending and order_pending are not failures or success. Render success only for completed; render the supplied code for failed. Surface timeouts rather than manufacturing an order.
Receipt is unavailable
Receipt access requires either the authorized customer JWT or the receipt capability. For email/SMS links, capturereceiptToken from the fragment, remove the fragment immediately, and send the token through the SDK. A missing, wrong, or expired token intentionally looks like not found.
PaymentIntent errors
Check cart revision first, then confirm the API service has matching provider credentials for the selected environment. The browser receives only the PaymentIntent client secret and Stripe publishable key.Useful error fields
StorefrontApiError provides status, code, message, requestId, details, method, and routeTemplate without retaining URLs, bodies, or credentials. Include requestId in support reports.