Skip to content
Gaurav TiwariDocs

Put Plans and Checkout on One Page

Version 0.1.0 Updated October 28, 2026

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"]
AttributeWhat it doesDefault
downloadA download ID. A download with variable pricing offers each price option. product works as an alias.none
plansDownload or download:price IDs in display order, separated by commas or spaces. Replaces download.none
defaultID of the plan picked first.first available plan
layoutinline shows the form, button shows a button that opens it in place.inline
buttonButton text for the button layout.Buy now
titleA heading above the plans.none
quantityyes adds the Quantity field.no
couponA discount code applied to the checkout, up to 64 characters.none
url_couponno 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.

A pricing page in an Easy Digital Downloads store with Stackless for EDD plan cards and the embedded checkout form below them.

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.”

The On-page Checkout settings screen in Stackless for EDD with the shortcode example and the New checkouts per connection field set to 30.

For Developers

  • stackless_edd_on_page_checkout_plans filters the plans, and stackless_edd_on_page_checkout_max_quantity changes the quantity cap.
  • stackless_edd_on_page_checkout_carts_per_window overrides the new checkouts limit.
  • stackless_edd_on_page_checkout_isolated_keys adds session keys that should stay with each plan’s cart.
  • The stackless_edd_on_page_checkout_cart_created action fires when a plan cart is filled.
  • A stackless-edd:on-page-checkout event fires for select, ready, error and complete. When the page has a dataLayer, it also gets a stackless_edd_on_page_checkout event.
  • 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.”
Share

Was this helpful?

Still stuck? Open a support ticket