Go Live
The full path from a scaffolded Cartwright shop to a live store on your own domain.
You have a shop running on localhost. Going live is four steps: deploy it, point a domain at it, verify your email domain, then check it over. Each step has its own guide — this page is the map.
Brand new to GitHub + Vercel?
The "deploy it" step assumes you've put your code on GitHub and connected Vercel. If that's new to you, do From code to live first — a beginner, no-terminal walkthrough — then come back here for domain + email.
The admin setup runbook at /admin/integrations tracks the same checklist inside your shop, including a Deployment og domæne section, so you can tick it off as you go.
1. Deploy
Push the shop to a host. Vercel is the default — it auto-detects Next.js and wires cron jobs and the AI gateway into the deploy.
2. Add a custom domain
A fresh deploy lives on a *.vercel.app URL. Point your own domain at it (DNS records + automatic SSL), then update NEXT_PUBLIC_APP_URL so links, Open Graph tags and canonical URLs all resolve to the real host.
3. Verify your email domain
Transactional mail — receipts, magic-link sign-in, order updates — sends through Resend. Until the sending domain is verified (SPF + DKIM), production mail is rejected: the order completes but the customer never receives the receipt.
4. Verify the shop
Once the domain is live, walk the runbook at /admin/integrations — it flags any missing Stripe, email, monitoring or deployment step before real customers hit them.
- Hit
/api/mcpwith noAuthorizationheader — you should get the JSON tool-surface intro. - Place a test order end to end with the Stripe test card
4242 4242 4242 4242. - Confirm the receipt email arrives.
MobilePay: a Stripe setting, not a code change
The checkout already offers every payment method switched on in your Stripe account: the engine creates each storefront checkout payment with automatic_payment_methods: { enabled: true } (lib/stripe.ts) and shows Stripe's Payment Element, which the checkout form (components/CheckoutForm.tsx) renders through components/StripePaymentPanel.tsx (so does the AI assistant's panel, components/AIStylistPanel.tsx, for an order it places with aiStylist on and an AI provider configured); the old agent checkout (app/api/commerce/agent-checkout/route.ts) was card-only; v0.63.0 made it take no payment at all and answer 410 Gone (CW-2026-010), and v0.64.0 removes it, so the path answers 404 with code: "endpoint_not_found". No code change and no Cartwright flag is needed.
- To offer it: turn MobilePay on in the Stripe Dashboard under Settings → Payment methods. Whether your account can is Stripe's call — it depends on the country the account is registered in and the kind of business — and that settings page shows it.
- Who sees it: customers in Denmark and Finland, on an order charged in DKK, EUR, NOK or SEK. Stripe picks the methods it shows for each payment from its amount and currency.
- What it costs: Stripe's card fee for the transaction, MobilePay's own transaction fee, and a fixed 35 DKK a month for a business registered in Denmark.
- Dankort: Stripe does not support the Dankort network. A Dankort card is processed on the Visa or Mastercard network instead.
- Check it once: with test keys, choose MobilePay at checkout and pay. Stripe opens a test page where you approve or decline; approve, and you land back on the shop's order page. The order turns paid when Stripe's
payment_intent.succeededevent reaches the webhook (app/api/webhook/stripe/route.ts), exactly as a card payment does. In live mode the customer approves in the MobilePay app.
Source: Stripe — MobilePay payments.
That is a live Cartwright shop — on your own domain, owned end to end.