Agent-Ready Checkout: Hosted, Embedded, or Payment Elements?
You do not necessarily need a new storefront to add a payment path for AI-assisted purchases. You need a payment entry point that fits your existing purchase flow, a way for the intended agent to use it with the buyer's authority, and a backend connection between payment completion and delivery.
The visual choice comes first: send the buyer to a hosted page, place a complete payment block inside your site, or add a payment-only element to a checkout you already control. These options delegate different amounts of interface work. None, by itself, establishes compatibility with a particular agent.
For an existing store, the useful comparison is therefore both visual and operational. What interface do you want to retain? Which integration is actually available for your deployment? And can your order system safely handle the result? GOAT Flow provides a concrete example of these distinctions, including release and Card conditions that affect the choice.
What Your Existing Store Keeps
Your storefront can remain the place where customers browse products, build a cart, and review the purchase. Your business-order system remains responsible for what was ordered, by whom, at what price, and how it will be delivered. Delegating payment presentation does not move those responsibilities automatically.
GOAT Flow Checkout is designed to connect payment to an existing website, application, or order flow. Your application still owns its products, cart, pricing, and fulfillment. For a physical-goods store, the relevant inventory, shipping, tax, and returns processes must remain accounted for in the systems that handle them. A payment component is not evidence that those retail functions have been supplied.
That separation gives you a practical starting point. Keep the authoritative purchase in your backend, associate it with the payment session, and decide which payment interface to expose. The browser can display a price, but your backend must know which saved purchase and terms the payment belongs to.
For example, a store selling access to a digital report could retain its report catalog, customer accounts, and entitlement records while replacing only the payment interaction. Successful payment would still need to resolve to the correct report purchase before access is granted. The same UI choice would not tell a physical-goods store whether stock was reserved or where an item should ship. Those are different business responsibilities behind a similar payment screen.
The labels need care. In GOAT Flow, Hosted Checkout is an umbrella containing the hosted page, embedded checkout, and payment element. In the comparison below, “hosted page” means the option reached through a returned checkout URL. It does not mean that the other two sit outside the Hosted Checkout product family.
Other providers use overlapping terminology. Stripe Checkout supports different UI configurations, while Stripe's Payment Element can work with different payment APIs. An element name does not specify one universal backend architecture.
Consequently, compare responsibilities rather than assuming three standardized product categories. A complete payment block and a payment-only element can both appear inside your page while leaving different surrounding interface work to you. Neither tells you, from appearance alone, how an agent discovers the purchase or obtains permission to pay.
This also changes what “without rebuilding” can honestly mean: preserving your store does not guarantee a plugin-only installation, no server changes, or unchanged operational processes. It means payment integration can be evaluated separately from replacing the storefront.
Compare the Three Payment Surfaces
GOAT Flow's three ready-made surfaces address different amounts of payment UI. The React examples for QuickPayEmbeddedCheckout and QuickPayPaymentElement use @goatx402/quickpay-react, currently documented as draft and unpublished to npm. Treat package access as an implementation prerequisite, not something an example import proves.
Surface | Entry and supplied UI | UI your application retains | React dependency | Card placement | Conditional fit |
|---|---|---|---|---|---|
Hosted page | Open the returned checkout URL; payment interface is on that page | Existing storefront and purchase flow outside the payment page | Does not require the draft React package | Page handoff; Card still needs enablement | You accept leaving your page for payment |
| Render a complete payment block in your page | Store interface around that block | Draft package; unpublished to npm | In-page or hosted handoff, depending on deployment | You want the complete block and can confirm access and configuration |
| Render payment-only UI in your page | Your surrounding checkout interface | Same draft, unpublished package | In-page or hosted handoff, depending on deployment | You already own the surrounding checkout and need the payment surface |
The hosted page delegates payment presentation through the URL your server receives. It avoids making the draft React package part of your frontend dependency chain. That distinction can matter when maintaining an existing site whose framework or release process should not change just to render payment UI.
It does not remove session creation, purchase association, or fulfillment integration. An SDK helper that opens a page is not the authoritative order record. You still need to know which purchase generated that URL and what result should authorize delivery.
The complete embedded checkout is a different fit when your application should retain the surrounding page but delegate the payment block. The visitor can remain within your site's layout while interacting with that block. Your application is still responsible for the surrounding purchase experience and the backend order connection.
The deployment requirements are concrete. Embedded components on a third-party merchant site need the correct environment's API base and an API configuration that allows the site's origin through CORS, or an appropriate proxy arrangement. CORS is the browser permission governing calls to another origin. Public connection configuration belongs in the frontend; merchant API secrets do not.
The payment element supplies the payment-only part while your application owns the surrounding checkout UI. This is useful when that surrounding experience already exists and you want to preserve it. It also means you retain responsibility for presenting the purchase coherently around the element: the element does not become your catalog, cart, or business-order system.
GOAT's QuickPayPaymentElement is not Stripe's Payment Element. Nor should it be confused with a custom GOAT Card form built using Stripe Elements. Similar terminology does not make their setup instructions or responsibilities interchangeable.
For both React surfaces, embedded does not guarantee in-page Card payment. Depending on the deployment, Card can render in-page or use a hosted handoff. Merchant approval, Stripe/Card configuration, and deployment enablement still apply. If remaining inside your page is a requirement, confirm that exact Card behavior before selecting an embed.
The practical tradeoff is how much interface responsibility to delegate, subject to what you can actually obtain and configure. The documentation does not justify ranking these choices by implementation hours, conversion improvement, or total cost. More control over surrounding UI is a responsibility difference, not proof of a better commercial outcome.
One way to make the distinction concrete is to ask what would remain on your page if the payment UI were removed. With the complete block, your page surrounds a supplied payment experience. With the payment-only element, more of the checkout around that payment surface is explicitly yours. With the hosted page, the payment interaction moves to the returned destination. All three still need a coherent relationship to the same saved purchase; none warrants trusting a price or product reference merely because it came from the browser.
The Interface and Authority an Agent Still Needs
An agent-ready checkout needs an accessible purchase path and permission to use it. Rendering a component answers neither question completely.
Start with the intended interaction. Can the agent receive current purchase terms, identify the available actions, and determine what action commits payment? Can it return to the same purchase after an interruption? Is the buyer's authorization tied to the intended seller, amount, currency, and permitted action?
A browser-based agent and an API client may answer those questions differently. It is not necessary to remove visual checkout to support every possible agent interaction, but it is necessary to verify the particular interaction you intend to support.
Stripe's experimental WebMCP browser-payment tooling illustrates the browser path. Structured tools can expose actions for supported Stripe payment interfaces. Available tools must be discovered again as the runtime changes, and consequential submission requires user confirmation. This is an experimental, provider-specific capability, not evidence that any agent can safely operate any embedded checkout. It does not establish GOAT WebMCP support.
Authority is another layer. Stripe's Shared Payment Tokens provide an example of payment access constrained to a seller and usage limits such as currency, maximum amount, and expiry. The referenced agent flow uses the 2026-09-30.preview API version, with country and payment-method restrictions. Additional customer authentication or another action can still be necessary.
Those conditions are part of the mechanism, not exceptions to omit when describing autonomy. Discovering a payment tool is not permission to spend. If the applicable flow requires customer action, the integration must preserve that action rather than treating the agent's ability to call a tool as sufficient authorization.
For a different use case, GOAT Flow API Payments connects payment to API calls and resource delivery. Its deployment-enabled receipt flow can bind payment evidence to a registered route. That is a paid-resource integration, not a fourth visual checkout option or proof of a complete retail purchasing protocol.
The receipt mechanism also does not replace customer authentication, buyer-wallet ownership checks, or your application's access policy. Its trusted keys, matched resource terms, and durable replay/delivery handling belong to the relevant deployment's contract.
These examples support a useful evaluation rule, not a compatibility matrix. Establish the interface, purchase terms, authorized payer relationship, consequential-action controls, and recoverable result for the exact agent path. Do not infer GOAT support for Stripe's token or browser-tool mechanisms. Likewise, GOAT Flow, the broader x402 payment protocol, and AgentKit agent tooling are distinct entities, not interchangeable names for one checkout feature.
Sessions, Rails, and Recovery Across Every Surface
Once you have a candidate interface, examine the lifecycle it must connect to. A hosted URL does not simplify away purchase-state questions, and an embedded element does not answer them merely by staying on your page.
Keep the merchant business order, Checkout identifier, associated payment order, and provider reference distinct. They refer to different parts of the transaction. Your backend should save the intended purchase and its terms, then retain the identifiers needed to connect payment evidence back to it.
For GOAT Checkout Sessions, persist the returned checkoutId, url, and expiresAt with your internal purchase and reference before exposing the payment entry point. Reuse a valid, payable session rather than creating another whenever the page refreshes. Keep API credentials server-side. Treat session identifiers and URLs as bearer capabilities: possession can grant access to the session, so avoid indiscriminate logging or sharing.
Rail selection also needs to be explicit. Omitting paymentRails defaults to Crypto. A Card-only session uses paymentRails: ['fiat']; it does not require a Crypto receiving token or the Crypto-specific quickpay_enabled setting. The merchant setup guide likewise distinguishes Card-only setup from configuring a Crypto receiving wallet.
DIRECT sessions offering Crypto have their own receiving configuration and payer token/gas requirements, including the applicable session-based enablement. Those requirements must not be applied universally to Card-only merchants. Conversely, avoiding Crypto prerequisites does not waive Card approval, Stripe setup, or deployment configuration. Supported chains and tokens depend on runtime configuration, not a universal static list.
Card fiat quotes are independently specified terms, not automatic currency conversion from a Crypto quote. Save and validate the terms for the rail actually used.
Expiry creates another distinction. expiresIn requests a lifetime; the returned expiresAt gives the effective deadline. A new Card attempt currently requires more than 32 minutes remaining under GOAT's documented initialization rule. It can be too late to initialize Card even while the session itself has not expired. An expired payment window also does not establish that an already-submitted payment never happened.
The difference affects the purchase experience, not just a countdown label. A Crypto-only session defaults to 30 minutes, whereas a session offering Card has a minimum lifetime of 60 minutes; the backend raises a shorter request to that minimum. Your application should display the returned deadline and separately handle whether a new attempt can start. Extending the apparent time in the browser does not extend the platform's payment window or recover an existing payment.
Consider a lost response after session creation. Your server cannot tell whether the operation completed. Repeating a nonempty clientReferenceId returns a conflict while that reference is retained, even when the request parameters match. It does not return the original session, and expiration alone does not release the reference.
That duplicate-creation guard is not idempotent replay. Do not turn the conflict into a new reference and another payable purchase just to make the interface proceed. Reconcile the existing purchase and available provider state first. Unknown is different from failed.
A sound integration therefore needs two separate protections: recovery for uncertain session/payment outcomes, and durable control over delivery. Avoiding duplicate session creation does not, by itself, prevent duplicate fulfillment later.
Platform Completion and Merchant Delivery
The most consequential shared requirement is deciding when the payment result can enter your delivery workflow. A browser success screen, callback, redirect, or transaction hash is not sufficient authorization.
GOAT's API status and webhook contracts distinguish payment observation from platform completion. Order state INVOICED and Checkout Session state COMPLETED represent the completed-order relationship: the Checkout session completes when its associated order reaches INVOICED.
For Card, PAYMENT_CONFIRMED or a fiat.payment.succeeded event can occur while a platform hold still prevents fulfillment. Payment-level Card success is not Checkout completion. The completion notifications are withheld while the hold remains. A valid signature on a payment-success event does not change the meaning of that event.
Keep the state namespaces separate, too. An order status is not a Checkout session status, and the separate QuickPay Crypto session API has its own confirmation contract. A Crypto-only example's success check cannot simply become a universal rule for Card.
Your backend needs verified state or an authenticated event appropriate to the payment method, followed by your own purchase checks. Match the saved purchase, merchant, product or reference, amount, and currency. For Crypto, the relevant chain and token also matter. A Card notification need not contain a blockchain transaction hash.
A public session-status read is not proof that the requester owns the purchase or is entitled to its delivery. Payment evidence and purchase authorization answer different questions. For example, a completed payment attached to another customer's order must not grant the current requester access to that order's digital entitlement.
For webhook input, authenticate the exact raw body using the endpoint's configured secret and the documented HMAC-SHA256 signature. Do not parse and reserialize the JSON before verifying those bytes, or substitute the merchant API secret. Process the verified body's event, not an unauthenticated convenience header.
Authentication still leaves semantic checks. A notification might not contain every field needed to reconcile the purchase. Resolve its identifiers and obtain authoritative facts rather than silently skipping a missing amount, currency, or ownership check.
The same care applies when reading status. A Checkout session can remain OPEN while a Card payment is processing or held. That value is not sufficient evidence that the customer has never paid. EXPIRED means not starting another payment on that session, while reconciling any payment already submitted. Cancellation is not a refund. These distinctions prevent a generic “not completed, therefore retry payment” branch from creating the wrong next action.
Now consider a Card payment that reports success while its associated order remains held. Record the observation and keep delivery pending. Reconcile the platform state for that same purchase; do not classify the observation as a failed charge and offer another payable attempt automatically. Nor should the UI's return to your site override the hold.
Next, suppose a valid completion webhook and a status poll both observe the completed purchase. They may race. Your fulfillment process must make repeated or concurrent calls safe through a durable business-operation guard. For a digital product, that could mean one entitlement grant for the purchase; for physical delivery, one authorized dispatch operation. These are application design examples, not provider-managed guarantees.
Deduplicating only a notification is not enough. A different event can refer to the same delivery operation, and an envelope timestamp is not a stable delivery identifier. Preserve legitimate state progression while ensuring the same business operation cannot execute twice. Reject forged input and withhold delivery when purchase terms do not match.
Durability matters if your receiver crashes or a downstream delivery system is temporarily unavailable. Record accepted work so a retry can resume the authorized operation instead of forgetting whether it already ran. Acknowledge the webhook only after durable acceptance, and keep delivery progress separate from payment progress. A paid order awaiting a delivery retry should not be presented as needing another payment.
Stripe's fulfillment guidance independently illustrates the need for server-side delivery handling that tolerates repeated or concurrent calls. That does not impose Stripe's webhook requirements on GOAT; GOAT also documents backend status-based verification and recovery.
Finally, platform completion is not a guarantee against later refunds or disputes. It is the relevant platform milestone to combine with your business eligibility checks, not a substitute for every later commercial obligation.
Which Surface Fits Your Existing Store?
Apply the comparison to the interface you already have rather than selecting the most integrated-looking option.
A store that accepts a payment-page handoff can evaluate the hosted URL first. Imagine a functioning catalog and cart whose team wants payment UI outside the storefront's frontend dependency chain. The hosted page is a plausible fit because it does not require the draft React package. The tradeoff is the page transition, not surrender of the merchant order system. Session creation, agent-path verification, and trusted completion-to-delivery handling still need an owner.
A store that wants a complete payment block within its page can evaluate QuickPayEmbeddedCheckout. Imagine an existing order-review page with room for the payment block but no requirement to design its internal payment interface. The component addresses that UI boundary. Selection remains conditional on obtaining the draft, unpublished React package, configuring API connectivity and allowed origins, and confirming the required Card presentation. If the deployment hands Card off to a hosted page, it does not satisfy a strict in-page requirement just because the initial block is embedded.
A store that already controls the surrounding checkout can evaluate QuickPayPaymentElement. Imagine a purchase experience whose order summary and surrounding UI should remain application-owned. A payment-only component may match that division of responsibility. The application retains more surrounding UI work, while package access, API/origin configuration, and conditional Card behavior remain gates. It is not a workaround for an unavailable release or a missing authorization path.
These are fit scenarios, not measured launch results. They do not establish which integration is cheaper, faster, or available to a particular merchant. Before committing, resolve the specific package, payment-rail, deployment, and eligibility conditions on which your choice depends; treat unverified fees as a separate commercial question.
If the actual product is a machine-consumed API response, reevaluate the integration around paid resource access rather than selecting a different visual surface. API terms, authorization, receipt verification, and replay-safe delivery address that job more directly than the location of a checkout block.
For a store, the decision is complete when you can name the chosen surface, the purchase backend you retain, the authorized agent interaction, the configured payment rails, and the trusted route from completion to delivery. If one of those remains unsupported, defer the dependent integration choice rather than treating an attractive UI as proof that the rest is ready.



