The fastest way to learn whether your AI product matters is to ask people to pay for it. That makes checkout a validation tool, not a final polish step, and it's why Alinement ships with a full one.
A checkout in three steps
The checkout keeps the whole form on one page and unlocks it step by step:
- Contact and email verification. The shopper enters their details and a 6-digit code goes to their inbox. The rest of the form stays locked until the code checks out, so you never take payment from an address you can't reach. Signed-in customers skip this step.
- Coupon. Codes apply before payment and the discount shows up in the totals
straight away. Launch codes like
LAUNCH20are the cheapest marketing you'll run. - Payment. Card, PayPal and Flutterwave inline checkout. Add your Flutterwave public key and the inline window opens with the order total and currency already filled in.
Plans go straight to checkout
Pricing buttons are plain links to /checkout/?plan=developer or ?plan=business.
They work before any JavaScript loads, they're easy to share in emails, and the cart
only ever holds one plan, because a customer buys one licence per order. Prices come
from a single catalogue, src/_data/plans.json, which both the pricing page and the
checkout read, so the two can't disagree.
Measured from the start
Each step sends a GA4 ecommerce event: view_item_list on pricing, then
add_to_cart, begin_checkout and purchase. Items keep the same ID through the
whole funnel, so GA4 can join them and show you where people drop off. In local
development, events are also checked against GA4's Measurement Protocol validator,
which catches malformed events before they pollute your reports.
Protected without friction
Every gated action, including sign-in, code verification and coupons, fetches a reCAPTCHA v3 token first. There are no puzzles for real customers, and bots get filtered out. When a token can't be fetched, the shopper sees a clear message instead of a button that silently does nothing.
Going live
The demo service accepts any code except 000000, which lets you show the error
state. To go live:
- Set
DATA_MODE=liveandAPI_BASE_URLso coupon checks reach your backend. - Add your
FLUTTERWAVE_PUBLIC_KEY,RECAPTCHA_SITE_KEYandGA4_MEASUREMENT_ID. - Run
bun run deploy:check. It refuses production builds that still use placeholder settings.
The checkout and payments guide walks through each setting. On the Business owner plan, we connect your payment provider for you.