RouteNest put the Pro payment form on the pricing page. A Dutch buyer chose iDEAL, and the browser still left for the bank. After the buyer authorized and came back, membership did not turn on, because the payment webhook had not arrived. Nothing was broken: where the form lives, whether the payment leaves the page, and whether payment is confirmed are three different jobs.

If the provider’s full checkout page already covers the required payment methods and fields, start with hosted checkout. Keep a hosted embedded form only when the product configuration before payment cannot be abandoned. Split into hosted components when a prebuilt form cannot hold seats, add-ons, or a live quote. Generating the card number field in your own page jumps the security and compliance work; that is usually the wrong starting point for SaaS.

Before the page design, the payment account has to work and the price has to be sellable. If Product, Plan, Price, and the processor price still share one record, finish catalog modeling first. If the seller, product, or settlement account still has no usable processor, finish eligibility first. RouteNest, amounts, and the business scenes are synthetic; they do not describe a live merchant.

Start with who provides the payment page and the card fields

Hosted checkout vs embedded checkout is not a question of whether the form “looks on-site.” Four jobs have different owners: who provides the payment page, whether card data enters the merchant system, who confirms the payment result, and who grants entitlement. Taking over more of the page also takes over more work: page scripts, Content-Security-Policy, browser behavior, accessibility, recovery, SDK upgrades, and a processor switch.

SurfaceWho provides the payment pageTypical card-data pathWhat you still ownTypical extra work
Provider-hosted pageComplete payment page on the provider originCard number stays with the providerAmount due, order, webhook, returnLeast page work
Provider-managed embedProvider form on your pageSensitive fields still come from the providerParent page, container, CSP, returnParent-page scripts, size, load failures, off-page actions
Composable hosted componentsYou arrange fields and steps; the provider hosts sensitive inputsCard number still stays with the providerField order, error system, page a11ySDK, browsers, responsive layout, component upgrades
Merchant-built checkoutYour page elements collect card dataRecheck whether card data enters your systemsPayment fields, data transport, PCI evidenceHighest security, monitoring, and migration cost
Four checkout surfaces, from a provider-hosted page to a merchant-built form, with rising page control and upkeep
The more of the page you take over, the more page security, accessibility, recovery, and upgrades you keep.

Stripe currently lists Checkout as Full page, Embedded form, and Elements. Full page can redirect to a Stripe-hosted page or embed Stripe’s complete page on the merchant site. Embedded form is still marked Public preview. Stripe Checkout(opens in a new tab) puts Full page in the Recommended column. Stripe’s comparison of Embedded Checkout and Stripe-hosted Checkout(opens in a new tab) says both versions support the same payment methods and almost all of the same features; the hosted version still has no built-in success state on Checkout itself.

Airwallex currently lists a pre-built payment page, a pre-built Checkout Element, individual payment Elements, and a Payments API UI. Airwallex Web Checkout(opens in a new tab) currently labels the first three as PCI-DSS SAQ A, and the Payments API UI as a ROC path.

Paddle Overlay Checkout is a complete overlay. The overlay already includes items, totals, and payment options; unlike inline checkout, your page does not render those pieces separately. Paddle Overlay Checkout(opens in a new tab) is the fastest Paddle integration: a few lines of code turn any element into a checkout button, and the buyer does not leave the site.

Adyen currently lists Hosted Checkout, Drop-in, and Components. Adyen Drop-in(opens in a new tab) is a prebuilt checkout UI: adding payment methods usually requires no extra development. Components are used to compose each method into your own UI. Hosted Checkout still redirects the shopper to an Adyen-hosted page; after payment, you show the session outcome on your page.

These names are not four industry-standard products. They are four current snapshots of how much page a merchant takes over. RouteNest only needs to pick the lowest control that still covers the required payment methods and fields.

Hosted checkout vs embedded checkout starts with constraints you cannot drop

If the provider’s full page already covers every hard requirement, stay there. Take over more of the page only when a required capability is missing.

ConstraintIf it is missingDo not use this as the reason to upgrade
Required payment methods cannot completeDrop the option, or allow that method to leave the pageWanting the form to stay on your domain
Web or mobile WebView cannot finishDrop the optionPreferring a particular layout
Subscriptions, setup, or tax fields cannot be collectedDrop the optionWanting to restyle the form
Required business fields cannot be placed or syncedSplit payment fields from product fields, or take over more of the pagePutting every field into the payment form
Return, cancel, and pending cannot restore the orderDrop the optionTreating the success URL as payment success
Decision tree that first asks whether a hosted page covers every hard requirement, then whether to keep an embed, split into components, or build a custom checkout
Stop when the current option covers every hard requirement. Continue only when a required capability is missing.

Stripe payment method support(opens in a new tab) varies by product, country, currency, and Checkout mode. Cards, Link, Apple Pay, and Google Pay cover more Checkout and Payment Element combinations; many local methods work only in specific countries and currencies. Adyen Hosted Checkout is faster to integrate, but the comparison with Drop-in and Components(opens in a new tab) currently shows that updating the amount after the session starts, and Apple Pay with your own certificate, are on Drop-in or Components.

On 4 September 2026, Stripe Checkout Studio’s default demo was a $68 Lumario order: card, Link, and Klarna were available, and a CAPTCHA appeared before Pay. Airwallex’s sandbox checkout demo could switch among Hosted Payment Page, Drop-in Element, Card Element, Split Card Element, Apple Pay, Google Pay, and Native API. Those two screens are observations of those demos on that day, not a feature matrix for every merchant.

PCI scope follows the real page and the card data

PCI DSS does not score a product name. It looks at the payment page and the card-data path.

PCI FAQ 1291(opens in a new tab) currently requires every payment-page element delivered to the cardholder browser to originate only and directly from a PCI DSS validated third-party service provider. FAQ 1438(opens in a new tab) treats a standalone page and an iframe embed as payment pages. When the merchant site embeds the payment page in an iframe, all fields and page elements that capture card data must sit inside that iframe to stay eligible for SAQ A. If any element involved in collecting or processing card data is present on, or provided by, the merchant site, the merchant is not eligible for SAQ A.

FAQ 1588(opens in a new tab) currently limits the SAQ A script-eligibility criterion to merchant pages that include a TPSP embedded payment page or form, such as one or more iframes. It does not apply to an HTTP 30x, meta, or JavaScript redirect to the TPSP, or to a fully outsourced payment. For an embed, the merchant currently confirms the page is not susceptible to script attacks in one of two ways: using techniques such as PCI DSS 6.4.3 and 11.6.1, deployed by the merchant or a third party; or obtaining confirmation from the PCI DSS compliant TPSP that, when implemented according to its instructions, the solution includes techniques that protect the merchant payment page from script attacks. FAQ 1604(opens in a new tab) currently says SAQ A still includes ASV external vulnerability scanning, including pages that redirect to a TPSP and pages that include a TPSP iframe.

What you observeDo not concludeConfirm this first
The form sits on your domainSAQ A, or a smaller questionnaireWho supplies every card-capture element, and whether merchant scripts take part
The product is named Checkout, Drop-in, or ElementsThe same PCI scopeThe real page, iframe, and data path
The provider says PCI is includedYour questionnaire is doneThe current SAQ, the TPSP Attestation of Compliance, and the entity that accepts it
You only generate the card number fieldThis is still an embedWhether card data enters your page, scripts, or servers

Airwallex currently maps hosted page, Drop-in, and Elements to SAQ A, and the Payments API UI to ROC. That is Airwallex’s current public grouping, not a PCI SSC conclusion. A self-generated card number field usually leaves SAQ A; do not assume SAQ A-EP either. Direct Post, merchant JavaScript that sends card data, or servers that receive card numbers typically belong to a heavier questionnaire. If a custom UI is required, freeze the data-flow diagram first, then confirm the questionnaire with the acquirer or QSA.

Embedded checkout can still send the buyer to a bank or a wallet

A form on your domain does not mean the payment stays on that page. Many local methods, wallets, and 3D Secure complete on another site or in another app.

Adyen Drop-in(opens in a new tab) still handles extra actions. When action.type is redirect, the shopper goes to another site or app. Stripe Checkout and Payment Element also differ by method: iDEAL, wallets, and 3DS commonly leave the original page. Paddle Overlay keeps the buyer on the site, but PayPal, Apple Pay, Google Pay, and other local methods can still open another window or sheet.

Payment methodCommon extra actionIf you ignore it
Cards with 3DSChallenge page, app, or extra iframeThe return is treated as a failure, or the pending state is left hanging
iDEAL, Pay by Bank, and similarBank site or banking appThe embed is blamed, even though the method requires leaving
Apple Pay / Google PaySystem sheet or extra domain verificationThe method never appears, or it fails in WebView
Southeast Asian wallets and QR methodsApp, QR code, or poll-for-resultThe success page is shown too early, or the wait is abandoned

If a method must leave the page, write that into the product copy. Do not force every method into one iframe. Hosted Checkout is often clearer here: the buyer already expects to complete payment on another page. An embed has to explain why this method still opens a bank. Custom checkout must handle every extra action itself.

Addresses and product fields cannot all live in the payment form

The payment form is not a dumping ground for every field. Tax, invoices, and risk may need an address. Seats, add-ons, coupon codes, and a live quote belong to the product. Putting them in the same form creates two failures: the payment object cannot store them, or changing a seat count recreates the payment object and loses the card fields.

FieldTypical ownerIf you force it into the payment form
Amount due, currency, taxServer, written into Session or PaymentThe browser can rewrite the payable amount
Card number, CVCProvider-hosted fieldPCI scope expands at once
Billing addressHosted page, or an address component plus your pageTax and invoices lose their source
Seat count, add-ons, couponProduct configuration, synced to the amount dueA change wipes the card fields, or the amount due goes stale
Return URLServer-setThe browser can send the buyer to the wrong page

RouteNest’s Pro plan can stay on Hosted Checkout: $24 a month, one Price, no extra configuration. Team needs seat count and add-ons, so the amount due has to change before payment; a prebuilt form usually cannot hold that. Enterprise quotes need a quote number and a billing profile, which should stay on the merchant page; the payment step only takes a server-confirmed amount.

If product fields and payment fields must appear together, split the page: the left side owns configuration, the right side mounts hosted components, and the server writes the latest amount due. Do not let the browser patch the payment object.

Different failures need different recovery

A payment is not only success or failure. Each state has a different owner, and mixing them creates duplicate charges or lost orders.

What you observeTypical ownerRecovery
Payment page or iframe does not renderYour page, CSP, or SDK loadKeep the order; reload the payment container; do not create a new payment
Card declined, with a reasonProcessorKeep the order and amount due; let the buyer change the method
3DS or bank completed, buyer did not returnOff-page actionWebhook or an active query confirms; the return page may show processing
Buyer canceled or closed the pageBuyerClose this attempt; keep the order; the server creates the next payment
Webhook delayed, return page already openProcessor eventThe page queries; entitlement waits for a confirmed result
Duplicate click, refresh, or extra tabYour pageOne purchase id; one-time entitlement

Adyen result codes(opens in a new tab) currently say resultCode tells you the current payment state and can still change; do not use it to update the order system. Pending and Received mean wait for the shopper-facing copy, then wait for the AUTHORISATION webhook. Stripe Checkout fulfillment also says you cannot rely on the landing page alone, because the customer may lose the connection after paying. Custom checkout has to classify these failures itself. Hosted Checkout and hosted embeds usually return a complete enough state; you still map it onto your own purchase, processing, and failed states.

An accessible payment component is not an accessible checkout

A payment SDK can pass WCAG and still leave the checkout unusable. Adyen currently publishes a VPAT for Web Drop-in and Components, and says v5.49.0 or later meets WCAG 2.1 Level AA. Adyen accessibility(opens in a new tab) still asks merchants to upgrade if they need those improvements. Stripe Checkout Studio currently exposes keyboard navigation, screen-reader labels, and color-contrast options. Those statements cover the provider component, not your parent page.

What must workCommon missWhat to verify
KeyboardFocus does not enter the iframe, or never returns after 3DSTab, Shift+Tab, and Enter can finish pay, cancel, and return
Screen readerParent-page title, errors, and processing are not announcedThe reader can hear amount due, errors, and the current state
FocusAfter an extra window or app, focus is lostFocus lands back on the result or the retry
Contrast and motionYour overlay covers the form, or a loading animation has no stopThe form is still readable; reduced motion is respected
Window and WebViewwindow.opener is missing, or the WebView blocks a methodThe required client can finish; otherwise do not offer that method

The more of the page you take over, the more of this you test. Hosted Checkout still needs an accessible entry and return. An embed also needs the parent page. Custom checkout includes the payment fields themselves.

Returning to the success page does not prove the payment succeeded

The return URL only means the browser came back. Stripe currently requires Checkout fulfillment(opens in a new tab) to use a verified checkout.session.completed webhook; delayed methods also need checkout.session.async_payment_succeeded. The landing page can query so the buyer sees the result, but it cannot be the only switch that grants access. Adyen currently uses resultCode for the shopper-facing state; the order system waits for a webhook, or for a server query of the existing payment object.

Sequence from creating a Session through an optional off-page action, return navigation, webhooks, and server queries, ending in confirmed, processing, or failed
The return restores the page. A verified webhook or a server query of the existing payment object confirms the result. Entitlement is granted once.

The return URL is created on the server and bound to this purchase. The page may show processing first. Duplicate clicks, refreshes, extra tabs, and concurrent queries write back to the same purchase. After payment is confirmed, the subscription service grants entitlement once per payment id. Access copy appears only after that write succeeds. Processor vs merchant of record only changes who issues the invoice; it does not change this sequence.

Conversion has to be measured on the same purchase

Do not assume that staying on your domain converts better. Compare hosted checkout vs embedded checkout only on the same purchase, the same Price, and the same methods.

MetricWhat it countsDo not use it this way
Checkout startThe buyer enters this purchaseCounting a pricing-page view as a start
Extra-page hopBank, wallet, 3DS, or another windowTreating every hop as a conversion loss
Return failureThe buyer does not return, or the return loses the orderCounting it as a payment failure
Paid and not activatedPayment is confirmed, entitlement is not grantedCounting it as checkout conversion
Paid and activatedPayment confirmed, and this purchase is entitledMixing it with other plans or other methods

If a method must leave the page, count the extra-page hop separately. If entitlement is late, count paid-and-not-activated separately. Changing only the button color, or avoiding a redirect, is not a reason to take over more of the page. Upgrade the UI only when a required method cannot finish, a required field cannot be placed, recovery cannot restore the order, or the same purchase shows a stable conversion gap.

Three SaaS products pick three different checkouts

The same company can keep three checkouts, as long as each one maps to a different Price and a different field set.

ProductHard requirementsLowest optionDo not do this
RouteNest ProOne Price, cards and iDEAL, no extra configurationHosted CheckoutBuilding an on-site form to look more native
RouteNest TeamSeats and add-ons change the amount due; the configuration must stay visibleHosted components plus a configuration panelPutting seats into the card iframe
RouteNest EnterpriseQuote number, billing profile, and a handoff to salesMerchant page plus a hosted payment stepGenerating card number fields to look like a custom CRM

Pro can lose the on-site form. After the buyer confirms $24, sending them to the provider page is enough; the return comes back to this purchase. Team cannot lose the configuration: changing seats must keep the amount due and the payment fields in sync, so the left side stays yours and the right side mounts hosted components. Enterprise is not a public self-serve checkout; after the quote is confirmed, the payment step only takes a server-confirmed amount. If a later method, client, or field appears, re-run the same constraints; do not copy another product’s UI.

Upgrades and failures after launch are the real cost

The first integration is not the expensive part. The longer bill is SDK upgrades, browser changes, new payment methods, and incident recovery.

Adyen Web v6(opens in a new tab) currently splits two import styles. Importing all payment methods in one bundle means new methods can be added from account configuration. Importing individual components still requires frontend code changes. onPaymentCompleted no longer fires for failed payments; Cancelled, Error, and Refused go to onPaymentFailed. Stripe Embedded form is still Public preview, and its feature list is not identical to Full page. Airwallex currently asks you to compare Hosted Payment Page, Drop-in, Elements, and Native API in sandbox first.

ChangeHosted CheckoutHosted embed / componentsCustom checkout
New payment methodOften account configuration plus return testingMay need extra actions, domains, or component importsYou add the action, polling, and failure copy
SDK breaking changeUsually no frontend rewriteYou change initialization, events, and stylesYou change the data path and the UI together
CSP, iframe, or browser changeEntry and returnParent page, iframe, and third-party scriptsAll payment fields and extra windows
Incident recoveryQuery Session or PaymentAlso inspect container load and extra actionsYou reconstruct the full path

If the team cannot own those upgrades, do not take over more of the page. Hosted Checkout leaves the provider to update the payment page. You still keep webhooks, idempotency, and one-time entitlement.

Keep the data you will need if you change the UI or the processor

Changing the page is cheap. Changing the processor is not, unless the order, entitlement, and customer records already live in your system.

Keep the sellable Price, purchase id, amount due, customer id, and entitlement state. Keep payment id only as an external reference. Hosted Checkout, embeds, components, and custom checkout can all be replaced, as long as the next processor can still reconstruct this purchase. If the browser holds the only amount due, or the provider object is the only subscription record, the next UI change has to migrate live orders.

When the checkout can restore this purchase, and webhooks can still grant entitlement once, stop. The next job is to check whether each required payment method can actually finish for this Price, in this region, on this client.