CHECKOUT

One integration, a checkout built for every market.

Accept one-time payments and subscriptions through one integration. Waffo handles local payment methods and languages, with checkout designed for desktop and mobile browsers.

  • 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 / TWO EXPERIENCES

Two ways to integrate. The same payment capabilities.

Choose a hosted page or embed checkout in your product. Both use Waffo’s payment and subscription capabilities; you decide how much of the frontend to manage.

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

The method list changes with the shopper.

Waffo Checkout resolves the available methods from payment mode, region, currency and your own business rules — one checkout, a different list in every market.

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

From order to webhook, one clear path.

From creating the order to confirming the payment, Waffo runs a standard flow that the shopper never has to think about.

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 method

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

  • Language preset from the 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

Our checkout. Looks like yours.

Brand color, text color, radius and layout are all configuration, not a fork.

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简体中文zh-Hans-HK
02ไทยth-TH
03Bahasa Indonesiaid-ID
04日本語ja-JP
05Englishen
06More languages+8
  • Español (México)
    es-MX
  • 한국어
    ko-KR
  • Bahasa Melayu
    ms-MY
  • Polski
    pl-PL
  • Português (Brasil)
    pt-BR
  • Türkçe
    tr-TR
  • Tiếng Việt
    vi-VN
  • 繁體中文
    zh-Hant-TW
06 / INTEGRATION

Pick the path, keep the capabilities.

Checkout composes with the rest of the payment stack, so the path you choose changes how much frontend you own — not what you can charge for.

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 behaviour 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 });
}

Checkout, in question form.

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.

Companies go live on Waffo. Developers start on Pancake.

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