Skip to content

Stripe Checkout Fresh

Create a payments page with prebuilt UIs using the Checkout Sessions API. Accept one-time and subscription payments from more than 125 local payment methods.

Three checkout modes

ModeHostingCustomizationComplexity
Full page (Recommended)Stripe-hosted or embedded15 settings via brand settingsLow
Embedded formYour domain70 settings via Appearance APIMedium
ElementsYour domainFull CSS via Appearance APIHigh

All three modes use the same Checkout Sessions API.

Full-page checkout (hosted)

Redirect customers to a Stripe-hosted payment page. Recommended for fastest implementation.

Features

  • Full order summary with subtotals, tax, shipping, discounts, promo codes
  • Built-in support for Billing, Tax, Adaptive Pricing, Link, dynamic payment methods
  • Cross-sells and upsells
  • Free trial support

Create a session

javascript
const session = await stripe.checkout.sessions.create({
  line_items: [
    {
      price_data: {
        currency: 'usd',
        product_data: { name: 'Pro Plan' },
        unit_amount: 2000,
      },
      quantity: 1,
    },
  ],
  mode: 'payment',
  success_url: 'https://example.com/success?session_id={CHECKOUT_SESSION_ID}',
  cancel_url: 'https://example.com/cancel',
});

// Redirect customer to session.url

Subscription mode

javascript
const session = await stripe.checkout.sessions.create({
  line_items: [{ price: 'price_monthly_plan', quantity: 1 }],
  mode: 'subscription',
  success_url: 'https://example.com/success',
  cancel_url: 'https://example.com/cancel',
});

Embedded checkout

Keep customers on your domain while Stripe renders the checkout UI in an iframe.

javascript
// Server
const session = await stripe.checkout.sessions.create({
  ui_mode: 'embedded',
  line_items: [{ price: 'price_1234', quantity: 1 }],
  mode: 'payment',
  return_url: 'https://example.com/return?session_id={CHECKOUT_SESSION_ID}',
});
// Return session.client_secret to client
javascript
// Client
const checkout = await stripe.initEmbeddedCheckout({ clientSecret });
checkout.mount('#checkout');

Customization

Branding (hosted checkout)

Configure in Dashboard → Settings → Branding:

  • Logo
  • Background color
  • Button color
  • Font (from 20 preset options)
  • Border radius (3 preset options)

Appearance API (embedded / Elements)

javascript
const elements = stripe.elements({
  clientSecret,
  appearance: {
    theme: 'stripe',
    variables: {
      colorPrimary: '#635bff',
      colorBackground: '#ffffff',
      colorText: '#30313d',
      borderRadius: '4px',
    },
  },
});

Collect additional information

javascript
const session = await stripe.checkout.sessions.create({
  // Collect phone number
  phone_number_collection: { enabled: true },
  // Collect billing address
  billing_address_collection: 'required',
  // Collect shipping address
  shipping_address_collection: {
    allowed_countries: ['US', 'CA', 'GB'],
  },
  line_items: [{ price: 'price_1234', quantity: 1 }],
  mode: 'payment',
  success_url: 'https://example.com/success',
  cancel_url: 'https://example.com/cancel',
});

Apply discounts and promotions

javascript
const session = await stripe.checkout.sessions.create({
  discounts: [{ coupon: 'coupon_id' }],
  // Or allow customers to enter promo codes
  allow_promotion_codes: true,
  line_items: [{ price: 'price_1234', quantity: 1 }],
  mode: 'payment',
  success_url: 'https://example.com/success',
  cancel_url: 'https://example.com/cancel',
});

Retrieve session details

After a successful payment, retrieve the session to access customer and payment data:

javascript
const session = await stripe.checkout.sessions.retrieve(
  req.query.session_id,
  { expand: ['line_items', 'customer'] }
);

console.log(session.customer_details.email);
console.log(session.amount_total);
console.log(session.payment_status); // 'paid'

Fulfill orders with webhooks

javascript
app.post('/webhook', express.raw({ type: 'application/json' }), (req, res) => {
  const event = stripe.webhooks.constructEvent(req.body, req.headers['stripe-signature'], process.env.WEBHOOK_SECRET);

  switch (event.type) {
    case 'checkout.session.completed':
      const session = event.data.object;
      if (session.payment_status === 'paid') {
        fulfillOrder(session);
      }
      break;
    case 'checkout.session.async_payment_succeeded':
      fulfillOrder(event.data.object);
      break;
    case 'checkout.session.async_payment_failed':
      sendPaymentFailedEmail(event.data.object);
      break;
  }

  res.json({ received: true });
});

Some payment methods (ACH, bank transfers) are asynchronous — listen for checkout.session.async_payment_succeeded in addition to checkout.session.completed.

Stripe API Reference - Self-contained docs reference, refreshed 2026-05-18