Offer a One-Click Upsell After Purchase
The minute after a buyer pays is when they trust you most. An order bump has to win them over before they’ve paid, and a follow-up email a day later lands in a busy inbox. Most thank-you pages show the order summary and nothing else.
Post-purchase Offers puts one offer on the thank-you page. One click adds it as a separate order and charges the payment method the buyer just used, through Stripe, PayPal, Square, Mollie or Razorpay. When that isn’t possible, the click opens a payment page for the extra item instead. Nothing is charged without the click, and each offer shows its take rate and revenue.
Turn On Post-purchase Offers
- Open Stackless → Dashboard and turn on Post-purchase Offers.
- Open Stackless → Post-purchase offers and click Add offer.
- Fill in the Offer and When to show it panels, tick Show this offer on the thank-you page and click Create offer.
The module pauses while FunnelKit Funnel Builder Pro, CartFlows Pro or One Click Upsell Funnel for WooCommerce is active, because they do the same job. The Dashboard says which plugin paused it.
Fill In the Offer
- Internal name: only you see this.
- Status: Show this offer on the thank-you page.
- Product to offer: a simple product or one fully defined variation.
- Quantity: 1 to 99.
- Offer price: Percentage off, Amount off, Fixed price or Regular price, plus the amount. New offers start at 20% off.
- Headline: up to 160 characters. Defaults to “Add [product] to your order”.
- Description: up to 1,000 characters. Links, bold, italic and line breaks are allowed.
- Button text: defaults to “Yes, add it with one click”.
Amounts are per unit and in your store currency. The price can’t go below zero, and a percentage is capped at 100.
When you save, Stackless checks the product. A variable, grouped or external product, a variation with an attribute set to “Any”, or a product that’s out of stock or can’t be bought keeps the offer inactive, with a warning to choose a purchasable simple product or one fully defined variation.
Choose When It Shows
The When to show it panel holds the order rules. An offer shows only when all of these pass:
- Order contains any of these products, or products in these categories. Leave both empty to match every order.
- Hide when the order has these products
- Hide when the order has these categories
- Only for these payment methods. Leave it empty for any payment method.
- Order subtotal at least
- Order subtotal at most
The subtotal is the order’s items before tax and discounts, in your store currency. An order in another currency is converted at the current rate. Leave a subtotal box empty for no limit. Variations also match their parent product, and categories come from the parent.
An offer never shows when its product is already in the order. Only one offer shows per order. When several match, the lowest Priority number wins, from 0 to 999 with 10 as the default, then the oldest offer.
What the Buyer Sees
The offer shows on the order received page:
- A small “One more thing” label, your headline and your description.
- The product image, or the parent product’s image for a variation.
- The offer price, with the regular price struck through when there’s a discount. A quantity above one shows as “for 3”.
- Your button.
- A line under the button: “Charged to the payment method you just used, as a separate order. Tax may apply.” when one click can charge, or “You will pay for it on the next page, as a separate order.” when it can’t.
The offer stays up for 30 minutes after payment. Change that under Stackless → Settings → Post-purchase Offers with Offer open for (minutes), from 5 to 1,440. After that, the page stops showing the offer and a late click gets “This offer has expired.” For an order that isn’t paid yet, such as an on-hold bank transfer, the time counts from when the order was placed.
The offer doesn’t show on failed, cancelled, refunded or still-pending orders.
How the Click Is Paid
A click creates a new pending order with the offer product at the offer price, the same billing and shipping addresses, the same currency and the same payment method. Then one of three things happens:
| Situation | What happens |
|---|---|
| The order was paid with Stripe, PayPal, Square, Mollie or Razorpay, and the buyer has a saved payment method from that gateway | The saved method is charged straight away. The buyer stays on the thank-you page and sees “Added. You will get a separate confirmation for it.” |
| The bank asks for 3-D Secure, or PayPal asks the buyer to approve | The buyer goes to the new order’s payment page to confirm. The order stays pending until they do. |
| No saved method, a guest checkout, another gateway or a merchant-of-record gateway | The click opens the new order’s payment page, where the buyer pays as with any order. |
The saved method is the one saved with the first order, or the buyer’s default saved method for the same gateway. Saved methods belong to customer accounts, so guests always get the payment page.
Some charges settle later, such as a SEPA Direct Debit through Mollie. The buyer then sees “Added. The payment is being confirmed; you will get an email once it is.” If a charge is declined, Stackless notes the reason on the new order and sends the buyer to its payment page to pay another way.
Merchant-of-record gateways never get one-click charges: Polar, Paddle, Creem, Dodo Payments and Stripe Managed Payments, along with any copies you made with Payment Gateway Tools. The merchant of record sells to the buyer, so the extra item goes through the payment page.
On a copy of your store, such as staging, saved methods are never charged. The click goes to the payment page instead.
Safe to Click Twice
Nothing is charged without a click. Each click is checked against the order key, a security token and the buyer: the signed-in account that placed the order, or for a guest, the browser session that saw the thank-you page. A click that fails these checks gets “This offer could not be added. Please refresh the page.”
Each order and offer gets one linked order at most, so a double click or a reload never charges twice. Once the buyer accepts, the thank-you page shows the result instead of the offer.
The Linked Order
- It’s a normal WooCommerce order with its own number and its own order emails.
- Notes on both orders link them. The new order says it was accepted on the thank-you page of the first one, and the first order names the new one.
- No shipping is charged. A physical item ships to the same address at your cost.
- Tax is worked out with your tax settings. If the first order was VAT exempt, the new one is too.
- Coupons on the first order don’t apply to it.
- WooCommerce doesn’t treat it as a child of the first order. Refund each order on its own.
Currencies
With Multi-Currency on, the linked order uses the first order’s currency, even if the buyer has switched since. A percentage comes off the product’s price in that currency. Amount off and Fixed price are converted from your store currency. Offer prices in another currency are rounded to two decimals before WooCommerce rounds the order, so a zero-decimal currency can show a small rounding difference.
Read the Take Rate
The Stackless → Post-purchase offers list shows each offer’s Offer, Product, Status, Shown, Accepted, Take rate and Revenue.
- Shown counts once per order, the first time the offer appears on its thank-you page. Reloads don’t add to it.
- Accepted counts when the linked order reaches a paid status. A click that’s never paid doesn’t count.
- Take rate is accepted divided by shown.
- Revenue is the linked order’s total, tax included, in your store currency. Orders in other currencies are converted at the current rate.
Click an offer’s name to edit it. Row actions let you Activate or Deactivate, Reset stats, or Delete. Deleting an offer deletes its statistics, but linked orders stay.
Use Order Bumps for small add-ons the buyer should see before paying. Post-purchase Offers suits a bigger or second purchase, because it asks after the first one is safe.
Limits
- One offer per order. After a buyer accepts it, no other offer shows.
- If the best-matching offer’s product goes out of stock, no offer shows for that order. Stackless doesn’t fall back to the next offer.
- One-click charges need a customer account and a saved method from the same gateway. Guests always pay on the payment page.
- Razorpay charges saved methods in Indian rupees only. Mollie charges saved bank methods, such as iDEAL, Bancontact and SEPA Direct Debit, in euros only. Other orders go to the payment page.
- The linked order is a one-time sale. It doesn’t start a subscription, so offer one-time products.
- No extra shipping is charged, so physical offers ship at your cost.
For Developers
stackless_post_purchase_merchant_of_record filters the gateway ids that never get one-click charges. Copies of a listed gateway are matched too:
add_filter('stackless_post_purchase_merchant_of_record', function ($ids) {
$ids[] = 'my_reseller_gateway';
return $ids;
});
A payment gateway gets one-click charges by implementing Stackless\Contracts\SavedMethodCharger. To change the offer’s markup, copy templates/post_purchase/offer.php from the plugin to stackless/post_purchase/offer.php in your theme. Keep the form fields, because the click is checked against them.