Hosted or embedded, themed to your brand
Send customers to Wam's checkout, or mount it inside your own page with your colours, corners and fonts. Card fields stay in Wam's frame.
Create a payment, send your customer to checkout, and get a signed webhook when it is paid. Cards and the Wam app, in one integration.
import { WamPaymentSDK } from "@wamnow/payment-sdk";
const wam = new WamPaymentSDK({
businessId: process.env.WAM_BUSINESS_ID!,
apiKey: process.env.WAM_API_KEY!,
environment: "production",
});
const intent = await wam.createPaymentIntent({
amountCents: 21000, // TT$210.00
currency: "TTD",
orderReference: "order-1042",
description: "Linen shirt, sand",
returnUrl: "https://islandthreads.tt/order/complete",
});
// Send your customer to Wam's checkout
redirect(intent.checkoutUrl);Your server sends the amount, currency and your order reference. Wam returns a checkout URL.
Redirect to Wam's hosted checkout or embed it in your page. Your customer pays by card or with the Wam app.
Wam posts a signed payment_intent.succeeded event to your endpoint. Verify it and ship the order.
One API for one-off payments, subscriptions and refunds, with card details kept off your servers.1
Send customers to Wam's checkout, or mount it inside your own page with your colours, corners and fonts. Card fields stay in Wam's frame.
Every delivery carries an HMAC-SHA256 signature and timestamp. One call in the SDK verifies both.
{
"type": "payment_intent.succeeded",
"data": {
"amount": 21000,
"currency": "TTD",
"status": "succeeded"
}
}Plans, hosted sign-up and invite pages, automatic retries and a page where customers manage their own subscription.
Save a card during checkout, or without a charge, and reuse it for subscriptions and later payments.
Refund a completed payment through the API. An idempotency key makes every retry safe.
Load one script, mount into a container or open as a modal, and listen for the result. Wam keeps the card fields in its own frame, so your PCI scope stays at the lowest level.
<div id="wam-pay"></div>
<script src="https://pay.wam.money/embed/v1/checkout.js"></script>
<script>
WamCheckout.mount({
checkoutUrl, // from createPaymentIntent
container: "#wam-pay",
theme: {
colorPrimary: "#111114",
borderRadius: "12px",
},
onSucceeded: (ev) => showReceipt(ev.paymentId),
});
</script>Never ship on the redirect alone. Wam signs every event with your webhook secret, and the SDK checks the signature and timestamp for you.
import { WamPaymentSDK } from "@wamnow/payment-sdk";
export async function POST(request: Request) {
const event = WamPaymentSDK.verifyWebhookSignature({
payload: await request.text(),
signature: request.headers.get("x-wam-signature") ?? "",
timestamp: request.headers.get("x-wam-timestamp") ?? "",
secret: process.env.WAM_WEBHOOK_SECRET!,
});
if (event.type === "payment_intent.succeeded") {
await fulfillOrder(event.data.merchantReference);
}
return Response.json({ received: true });
}Create payment links and invoices from the app or the Business Portal and share them anywhere.
Install the Wam Pay app and add a Pay with Wam button to your store in about ten minutes.
Use the Node.js SDK, or call the REST API from Python, PHP or any language that can sign a request.
Take sandbox keys from the staging Business Portal, pay with test cards, run the mock SDK in your CI and tunnel webhooks to your laptop before you go live.
Open a Business account, copy your API keys from the Business Portal and take your first test payment today.
A flat rate per card payment, with no setup or monthly fee.
See pricingBuilding something bigger? Our team can help you plan it.
Contact us