Put Plans and Checkout on One Page
Your pricing page lists three plans, and every Purchase button sends the buyer to another page to pay. They lose the comparison they were reading, and anything already in their cart ends up in the order.
On-page Checkout puts plan cards and your real checkout form on the same page. Buyers pick a plan and pay right there. Each plan checks out from its own cart, so the store cart is left alone.
Turn It On
Switch on On-page Checkout under Stackless → Dashboard. Then add the On-page Checkout block or the [stackless_edd_checkout] shortcode to any page or post.
Modal Checkout needs this module too, because its modal shows the same embedded checkout.
Add the Block
Add On-page Checkout from the Easy Digital Downloads block category. The Download and plans panel picks what it sells:
- Download: search for a download. A download with one price is one plan. A download with variable pricing offers each price option as a plan.
- Plans (download or download:price IDs): optional. Comma-separated, in display order, for example
12:1, 12:2, 15. They can come from different downloads and replace the download above. - Preselected plan: the plan picked first. Without it, the first available plan is picked.
The Display panel sets how it looks:
- Heading: an optional heading above the plans.
- Layout: Checkout form shown on the page (default), or Button that opens the form in place.
- Button text: for the button layout. Defaults to “Buy now”.
- Let buyers choose a quantity: off by default. Adds a Quantity field from 1 to 100. It only shows when cart quantities are turned on in EDD and for the download.
- Discount code to apply: optional. When it’s empty, a
?coupon=code in the page address is applied.
Use the Shortcode
[stackless_edd_checkout download="12" plans="12:1,12:2" default="12:2" layout="inline" quantity="no"]
| Attribute | What it does | Default |
|---|---|---|
download | A download ID. A download with variable pricing offers each price option. product works as an alias. | none |
plans | Download or download:price IDs in display order, separated by commas or spaces. Replaces download. | none |
default | ID of the plan picked first. | first available plan |
layout | inline shows the form, button shows a button that opens it in place. | inline |
button | Button text for the button layout. | Buy now |
title | A heading above the plans. | none |
quantity | yes adds the Quantity field. | no |
coupon | A discount code applied to the checkout, up to 64 characters. | none |
url_coupon | no ignores a ?coupon= code in the page address. | yes |
The block has no url_coupon option. It always applies a code from the page address when its own is empty.
How Plan Cards Work
Two or more plans show as cards to pick from. A single plan shows no picker. With the button layout, it gets a one-line summary above the button instead.
- Each card shows the plan name, its price and a short note: “One-time payment”, a free trial, a signup fee or how often it renews.
- When plans come from more than one download, each card shows the download name followed by the price option name.
- A plan that can’t be bought shows “Unavailable” and can’t be picked. If no plan can be bought, the block says “This product is not available right now.”
- Downloads must be published. A private download shows only to users who can read private products.
If nothing in the block can be offered, anyone who can edit posts sees “On-page checkout: choose a published download or list its download and price option IDs.” Visitors see nothing.

Subscriptions and Savings Badges
Subscription downloads work as plans. The cards take their terms from the Subscriptions module, so they show what checkout charges. That means the price per period, such as “/ month” or “/ 3 months”, a free trial such as “14-day free trial”, and any signup fee. Set up the plans themselves as described in Subscription Products.
A plan billed every few months or yearly gets a “Save N%” badge when it costs less than a monthly plan of the same download in the block, over the same months. A $100 yearly plan next to a $10 monthly plan shows “Save 16%”. The percentage is rounded down. Without a monthly plan in the block, there’s no badge.
Its Own Cart for Each Plan
Each plan checks out from its own cart, kept in the visitor’s session apart from the store cart. The cart widget and checkout page don’t change, and nothing from the store cart ends up in the order.
- Switching plans keeps each plan’s form loaded, so switching back is instant.
- Reloading the page picks up the same plan’s cart.
- A visitor keeps up to six plan carts. Opening a seventh drops the oldest.
- Only the cart is separate. That covers the cart, fees, discount codes and per-cart choices from other Stackless modules, such as the checkout currency.
- If another plugin replaces EDD’s session handler, a plan checkout replaces the store cart instead. With EDD’s debug mode on, Stackless logs a notice under Downloads → Tools → Debug Log.
How the Form Loads
- With the inline layout, the form loads as the block scrolls near the screen. With the button layout, it loads when the button is clicked.
- The form is your checkout page’s own checkout: the EDD Checkout block if the page uses it, otherwise the
[download_checkout]shortcode. It shows without your theme’s header and footer, isn’t cached or indexed, and only your own site’s pages can embed it. - If it hasn’t loaded after 20 seconds, the block shows “Checkout could not load. Reload the page to try again.”
- Without JavaScript, a “Continue to checkout” link adds the plan to the store cart and opens the checkout page.
What Happens After Payment
After the buyer completes the purchase, the whole page moves to the receipt or the payment page, not just the embedded form. Hosted payment pages open in the full window too.
On the receipt, the store cart stays as it was. A form whose cart was already paid or has expired shows “This checkout has finished or expired. Reload the page to start again.”
Limit New Checkouts
Stackless → Settings → On-page Checkout has one setting:
- New checkouts per connection: how many new plan carts one connection may open in ten minutes. Defaults to 30, up to 1,000. Reopening a plan doesn’t count, store managers aren’t limited, and 0 turns the limit off.
It stops bots from filling your sessions table. Over the limit, the form shows “Too many checkouts were opened from this connection. Wait a few minutes and reload the page.”

For Developers
stackless_edd_on_page_checkout_plansfilters the plans, andstackless_edd_on_page_checkout_max_quantitychanges the quantity cap.stackless_edd_on_page_checkout_carts_per_windowoverrides the new checkouts limit.stackless_edd_on_page_checkout_isolated_keysadds session keys that should stay with each plan’s cart.- The
stackless_edd_on_page_checkout_cart_createdaction fires when a plan cart is filled. - A
stackless-edd:on-page-checkoutevent fires for select, ready, error and complete. When the page has adataLayer, it also gets astackless_edd_on_page_checkoutevent. - Override the embedded page’s template at
yourtheme/stackless-edd/on_page_checkout/frame.php.
Limits
- The block and shortcode show nothing on the checkout page itself.
- Payment method classes belong to Modal Checkout. The on-page form shows the same payment methods as your checkout page.
- If a plan’s cart no longer holds the plan it was opened for, for example after a change in another tab, the order is stopped with “This checkout changed in another tab. Reload the page and try again.”