CHECKOUT

Integrate once. Sell everywhere.

One-time payments and subscriptions through a single checkout, with local methods and languages applied per market.

  • One integration

    A single integration supports one-time purchases and subscription billing.

  • Global adaptation

    Local languages and payment methods are matched automatically to reduce cross-border checkout friction.

  • Every screen

    Checkout is designed for both desktop and mobile browsers, so customers can pay on the screen they use.

  • Nothing to maintain

    New payment methods, page updates and security patches are handled by the Waffo team.

01 / INTEGRATION

Hosted or embedded. Same rails.

Ship fast with a hosted page, or build checkout into your product. What happens behind the checkout doesn’t change.

Hosted Checkout

Waffo hosts the whole page. Create a session from your backend, redirect the shopper to the secure URL Waffo returns, and they come back when the payment is done.

0 lines of frontendCard data stays out
  • Zero frontend workPage rendering, form validation, error handling and 3DS are Waffo's job. You call one API from your backend.
  • Optimized continuouslyLayout, copy and interaction improvements reach your checkout automatically — nothing to update on your side.
  • Card data isolatedCard data is collected on the Waffo-hosted page and never touches your systems.
  • Nothing to maintainNew payment methods, page updates and security patches are handled by the Waffo team.

Waffo-hosted page

02 / PAYMENT METHODS

One checkout. A different list of payment methods in every market.

Waffo picks the payment methods by region, currency, and payment mode, and respects the rules you set on top.

Resolved for this marketIndonesia: 12 / 17 in the Waffo catalog
Indonesia
  • DANA
  • GoPay
  • OVO
  • ShopeePay
  • QRIS
  • Mandiri
03 / PAYMENT FLOW

One flow for the shopper. One event stream for you.

The buyer moves from cart to confirmation without a detour. Your systems get a webhook at every state change, so fulfillment and reconciliation never guess.

01

Confirm the order

The shopper clicks checkout on your site and your backend creates a Payment Session or Subscription.

  • Unique order id
  • Amount and currency preset
02

Open the checkout

Depending on the integration, the shopper is redirected to the Waffo-hosted page or the component opens in place.

  • Tuned to open in well under a second
03

Choose a payment method

The interface language follows the market of the payment method the shopper picks, so there is less to read and less to misread.

  • Language preset from the payment method
  • Mobile layout applied automatically
04

Authorize and pay

Card details or a QR scan, with 3DS run only when it is required. A failure keeps the page open and names the reason so the shopper can retry.

  • 3DS handled inline
  • Decline reason shown in plain words
05

Result and notification

The shopper lands on the success page while Waffo posts a webhook to your server, so order state stays in sync.

  • PAYMENT_NOTIFICATION
webhook → your server
POST https://yourstore.com/webhooks/waffo
{
  "eventType": "PAYMENT_NOTIFICATION",
  "paymentRequestId": "req_8Kd2f19",
  "status": "SUCCESS"
}
04 / CUSTOMIZATION

A checkout that looks like your product.

Brand color, text, radius, layout — all configuration, no code.

Checkout customizationSave & Publish
Payment method orderJPN
Payment method nameSort
  • Apple Pay
  • Google Pay
  • BNPL3
  • au PAYAUPAY
  • Over the Counter5
  • Payeasy Online Banking
  • PREPAIDCARD2
  • Credit/Debit Card
Live PreviewStyle changes will be reflected instantlyOne-time Payment
WStarter credit packArclight AI
$1.00
Price (excl. tax)$0.92
Tax$0.08
Total due today$1.00
Choose payment method
Pay
Secured by Waffo
05 / LANGUAGES

The checkout renders in the shopper's language.

Waffo Checkout resolves the interface language from the locale the merchant passes, the visitor’s browser preference and the region their IP resolves to, in that order of precedence — the shopper never has to switch it.

01简体中文
02ไทย
03Bahasa Indonesia
04日本語
05English
06More languages+8
  • Español (México)
  • 한국어
  • Bahasa Melayu
  • Polski
  • Português (Brasil)
  • Türkçe
  • Tiếng Việt
  • 繁體中文
06 / INTEGRATION

Three integrations. No trade-offs.

Hosted, embedded, or server API — everything Waffo can charge for is available on all three.

Read the integration docs

The least code for one-time or subscription payments: create a session, redirect, done.

  • No frontend to build
  • One-time and subscription alike
Hostedserver · @waffo/waffo-node
const waffo = Waffo.fromEnv();

const res = await waffo.order().create({
  paymentRequestId: genRequestId(), // idempotency
  orderAmount: '12.90',
  orderCurrency: 'SGD',
  notifyUrl: 'https://yourstore.com/webhooks/waffo',
  successRedirectUrl: 'https://yourstore.com/paid',
});

// Waffo hosts the page — hand the shopper the link.
redirect(webUrlOf(res.getData().orderAction));

Mount the checkout via SDK or component when the experience and styling should be under your control.

  • Inline, drawer or modal
  • Appearance driven from your code
Embeddedbrowser · @waffo/checkout-js
const waffo = await loadWaffo(PUBLISHABLE_KEY);

// orderId comes from your own /api/orders route,
// which runs the server snippet above.
const checkout = await waffo.checkout.mount('#pay', {
  orderId,
  appearance: { theme: 'light', layout: 'split' },
  onComplete: ({ status }) => {
    if (status === 'SUCCESS') router.push('/paid');
  },
});

Create payments and subscriptions, query state, receive notifications, and drive checkout behavior dynamically.

  • Sessions and subscriptions
  • Webhooks for order state
Webhookserver · order state of record
export async function POST(req: Request) {
  const event = await waffo.webhooks.verify(
    await req.text(),
    req.headers.get('waffo-signature'),
  );

  if (event.eventType === 'PAYMENT_NOTIFICATION') {
    await fulfil(event.paymentRequestId, event.status);
  }

  return new Response(null, { status: 200 });
}

Common questions about Checkout.

Checkout supports 480+ payment methods worldwide. Which ones a given shopper sees depends on their region and on your own configuration.

Yes. Checkout complies with the relevant payment security and compliance standards, including PCI DSS, and handles sensitive payment data over secure channels.

The checkout page stays open and names the reason, so the shopper can retry or switch card. Common reasons are insufficient funds, wrong card details, or a decline from the issuing bank.

If you are incorporated as a company, or if you are an individual developer.

Two paths, one promise: you build the product, Waffo runs the payments.