When the payment sheet opens, Apple validates the domain of the top-level
page the buyer is on. On hosted surfaces, that’s our domain, which we
register and maintain. On embedded checkout, it’s yours — so you register
it, and the button renders in your page, above the frame, never inside it.
Enabling Apple Pay
Apple Pay is enabled per account — request it during onboarding or through support. On hosted surfaces you’re done; buyers on capable devices see the button immediately.Embedded checkout requirements
PassapplePay: true to mountSession (see the
embedded checkout guide). The button
stays hidden until all of these hold:
1
Register your domain for Apple Pay
Apple Pay registration is separate from the web-domain registration that
allows framing — it happens against Apple’s systems, and we run it for
each domain you tell us. One registration per domain, per mode.
2
Serve the domain-association file
We provide a file that must be reachable at exactly:It must return
200 directly — no redirect. Apple fetches it during
registration and re-checks it over time; if your deploy process wipes
static files, make sure this one survives every deploy.3
HTTPS everywhere
Your page and every ancestor frame must be HTTPS. Safari refuses
Apple Pay in any frame tree with an insecure ancestor.
How payment completes
An Apple Pay payment is the same payment: the session completes, youronComplete fires (on embedded), and the same
checkout.session.completed webhook drives fulfillment.
There is no wallet-specific handling to build.
Testing
A real Apple device is required — there is no simulator path to a completed payment sheet.localhost can never be Apple Pay-registered, so for
embedded checkout, wallet testing needs your page deployed on a registered
HTTPS domain. Card flows test everywhere — see
test cards.
