- Shipping details
- Payment details (including card panel)
- Confirmation (redirect to your next page)
Step 0: Enable checkout mode for the page
Before adding fields, make sure this page is marked as a checkout page in ElasticFunnels:- Go to Page List
- Click Edit Page on the page you are building
- Enable Is checkout page
- Save
Step 1: Shipping details
Usename="<field>" and data-template-value="checkout.customer.<field>" together for each input/select.
Required fields validated by checkout
| Label | name | data-template-value example |
|---|---|---|
| First name | first_name | checkout.customer.first_name |
| Last name | last_name | checkout.customer.last_name |
email | checkout.customer.email | |
| Street address | shipping_address | checkout.customer.shipping_address |
| Country | shipping_country | checkout.customer.shipping_country |
| City | shipping_city | checkout.customer.shipping_city |
| State/Province | shipping_state | checkout.customer.shipping_state |
| ZIP/Postal code | shipping_zip | checkout.customer.shipping_zip |
Common optional fields
| Label | name | data-template-value example |
|---|---|---|
| Phone number | phone | checkout.customer.phone |
| Apt/Suite | shipping_address2 | checkout.customer.shipping_address2 |
| Shipping first name (advanced fallback) | shipping_first_name | checkout.customer.shipping_first_name |
| Shipping last name (advanced fallback) | shipping_last_name | checkout.customer.shipping_last_name |
Shipping section example
checkout.countries and checkout.usStates (auto-provided)
These lists are automatically provided by the platform on checkout pages:
checkout.countries: full country list for country dropdownscheckout.usStates: US states list for US shipping/billing state dropdowns
Show all countries (default)
Limit the countries you display
You can limit visible countries by filtering inside the loop:Step 2: Billing + payment details
Shipping same as billing toggle
Use this exact binding:Billing field keys (when visible)
| Label | name | data-template-value example |
|---|---|---|
| First name | billing_first_name | checkout.customer.billing_first_name |
| Last name | billing_last_name | checkout.customer.billing_last_name |
| Street address | billing_address | checkout.customer.billing_address |
| Apt/Suite | billing_address2 | checkout.customer.billing_address2 |
| Country | billing_country | checkout.customer.billing_country |
| City | billing_city | checkout.customer.billing_city |
| State/Province | billing_state | checkout.customer.billing_state |
| ZIP/Postal code | billing_zip | checkout.customer.billing_zip |
How data-checkout-error works (not magic)
data-checkout-error is the target placeholder where checkout validation messages are rendered.
Use matching keys between field name and error placeholder:
- Checkout validates required/visible fields
- If invalid, checkout writes messages into
checkout.errors - The frontend template processor + checkout error adapter update matching
[data-checkout-error="<field>"]containers - The first invalid field is focused automatically
data-checkout-error element exists, the field can still fail validation, but users will not see an inline message for that field.
Card panel (recommended pattern)
For card payments, use:Payment method switch (optional)
If you show multiple methods, usepayment_method_choice:
Optional marketing consent / customer flags
Step 3: Confirmation (redirect step)
After submit:- If checkout returns
redirectUrl, customer is redirected there. - Otherwise, customer is redirected to
/purchase?order_id=...&email=....
- your thank-you page
- a next funnel step (upsell/downsell)
- a custom post-purchase page
How field bindings are handled
Checkout forms are reactive through the frontend template processor (same engine used by[[ ... ]], <template-if>, and <template-foreach>).
data-template-value="checkout.customer.email"creates two-way binding:- scope -> input (prefill/update)
- input -> scope (user typing updates checkout data)
<template-if data-condition="...">reacts when bound values change (for example, country/state or billing visibility)data-checkout-submitwires the button to checkout submit + payment flowdata-checkout-messageis where global submit/payment messages are shown
Cart + order summary fields from cart.js
Use these fields to build the right-side summary and item list.
Item fields (cartItems / items)
| Field | Use in template |
|---|---|
item.code | Product code for qty/remove buttons |
item.name | Product title |
item.image | Product image |
item.quantity | Quantity |
item.price | Unit price (formatted) |
item.retail_price | Retail/original unit price (formatted) |
item.total | Line total (formatted) |
item.item_total_raw / item.total_raw | Numeric line total |
item.discount_total | Line discount (formatted) |
item.currency | Currency code |
Scope-level cart fields
| Field | Meaning |
|---|---|
cartItems / items | Current cart lines |
count | Total quantity across items |
item_count | Number of line items |
is_single_product | Single-product checkout mode |
is_cart | Multi-item cart mode |
currency | Checkout currency |
Checkout totals fields
cart.js keeps these formatted fields synced from their *_raw values:
checkout.subtotalcheckout.totalcheckout.taxcheckout.shippingcheckout.discount_totalcheckout.bump_totalcheckout.product_pricecheckout.retail_price
Cart control attributes (quantity/remove)
Use these exact attributes:Complete wizard skeleton (shipping -> payment -> redirect)
Quick QA checklist
- Required shipping/personal fields use
name+data-template-value. - Every required field has matching
data-checkout-error="<field>". - Country/state uses
checkout.countries/checkout.usStates. - Card panel is present and submit button uses
data-checkout-submit. - Optional methods use
payment_method_choicevalues (card,paypal,klarna). - Cart controls use
data-cart-qty-minus,data-cart-qty-plus,data-cart-qty-remove,data-code. - Success and decline redirects are tested end-to-end.