Skip to main content

Two paths to checkout

Henry supports two checkout modes. Pick the one that fits your needs:

Hosted Checkout

The checkoutUrl returned by cart.create is a fully hosted checkout page. Redirect, iframe, or popup. Henry collects shipping, payment, and tax.

Headless Checkout

Call checkout.purchase from your server with card token and shipping info. Henry processes payment and places the order with the merchant. You own the UI completely.

Hosted Checkout

Overview

Henry’s Hosted Checkout is the fastest way to add commerce capabilities to your application. With our hosted checkout solution, you can accept payments without handling sensitive payment data or building complex UI components. Simply embed our checkout experience via iframe, webview, or redirect.
Perfect for: Startups and businesses that want to move fast and launch quickly.

Why Choose Hosted Checkout?

Launch in Minutes

Pre-built UI components and hosted pages get you live fast

Zero PCI Burden

We handle all payment security and compliance requirements

Mobile Ready

Responsive design works seamlessly across all devices

How It Works

Hosted Checkout uses a simple redirect or embedded iframe approach:

Embed options

The simplest integration - just redirect the user to the checkout URL.
// Server-side (e.g. Next.js API route)
const cart = await henry.cart.create({ items });
res.redirect(cart.data.checkoutUrl);

// Client-side
window.location.href = checkoutUrl;

Headless Checkout

Overview

Headless Checkout gives you full control over the buyer experience. You collect shipping and payment info in your own UI, then call Henry’s API server-side to process payment and place the order.
Headless checkout requires special enablement. Contact us to get set up.

Why Choose Headless Checkout?

Full UI Control

Own every pixel of the checkout experience - no iframes, no redirects

Your Brand

Seamlessly match your existing design system and user flows

Server-Side

All payment processing happens on your server - no client-side exposure

How It Works

Call cart.checkout.purchase from your server with the buyer’s shipping and card info.
const purchase = await henry.cart.checkout.purchase({
  cartId: 'your-cart-uuid',
  buyer: {
    name: { firstName: 'Jane', lastName: 'Doe' },
    email: 'jane@example.com',
    phone: '+19175551234',
    shippingAddress: {
      line1: '350 5th Ave',
      line2: 'Floor 21',
      city: 'New York',
      province: 'NY',
      postalCode: '10118',
      countryCode: 'US',
    },
    card: {
      nameOnCard: { firstName: 'Jane', lastName: 'Doe' },
      details: {
        cardToken: '...',
      },
      // billingAddress optional - defaults to shippingAddress if omitted
    },
  },
});

console.log(purchase.refId, purchase.status);
// → "ckp-ref_38lb3..." "pending"

Next steps

Order Management

List and track orders after checkout - filter by status, cartId, and more

Universal Cart

Learn how to build and manage the cart before checkout