Upsells
After a visitor completes their initial purchase, you can offer additional products on subsequent pages. Upsells charge the card that was already captured during checkout — no additional payment form is shown.
How It Works
The purchase click action charges the visitor’s saved payment method directly. It creates either a one-time charge (PaymentIntent) or a new subscription, depending on whether the product’s store price has a billing interval.
The flow:
- Visitor completes a payment via the Payment Element (card is saved).
- Visitor navigates to an upsell page.
- Upsell page presents an offer with a “Buy Now” or “Add to Plan” button.
- The button’s
purchaseclick action charges the saved card immediately. - On success, the visitor navigates to the next page.
The purchase action does not show a payment form. It charges the saved card directly with no additional confirmation UI. The visitor must have already completed a payment via the Payment Element earlier in the funnel. If no payment method is on file, the action will fail.
Setting Up an Upsell Page
Configure the upsell product
In the funnel’s Settings > Products, add the upsell product. Link it to a store price just like any other product. The upsell product can be a one-time charge or a subscription.
Set the page type
Set the upsell page’s type to upsell for proper analytics categorization.
Design the offer
Build the upsell page with product details, pricing, and a clear call-to-action. Use product variables for dynamic pricing:
Add {{ products.premium_addon.displayName }} for just {{ products.premium_addon.price }}Add the purchase button
Add a button with the Purchase click action. Configure:
| Setting | Description |
|---|---|
| Product | Select the upsell product to charge. |
| Automatic Tax | Enable if you use Stripe Tax for automatic tax calculation. |
| Metadata | Optional key-value pairs attached to the Stripe charge. |
Configure success navigation
Add a Go to Next Page action after the purchase action in the click action chain. Configure the page’s routes to point to the next page in the funnel.
Add a skip option
Always provide a way to skip the upsell. Add a “No thanks” button or link with a Go to Next Page action that routes past the upsell confirmation.
Upsell Patterns
One-Time Add-On
Charge a flat fee for a supplementary product (e.g., a digital download, premium report, or bonus content).
- Configure the upsell product with a one-time (non-recurring) store price.
- The
purchaseaction creates a PaymentIntent and charges immediately.
Additional Subscription
Add a second subscription on top of the primary one (e.g., a premium tier add-on).
- Configure the upsell product with a recurring store price.
- The
purchaseaction creates a new Stripe Subscription using the saved payment method. - Trial days can be applied to the upsell subscription independently.
Error Handling
If the purchase action fails (e.g., card declined, insufficient funds), the onFailure chain executes. Common patterns:
- Set Variable to display an error message: set
payment.errorand show it in a Text element with a dynamic property for visibility. - Navigate to a fallback page.
The payment.error variable contains the error message from Stripe when a charge fails.
Double Charge Prevention
AppFunnel includes optional double-charge prevention. When enabled on the store, it checks for recent successful charges with the same price before processing. If a matching charge is found within the last hour, the action is blocked with a duplicate_charge error.
Enable this in the store settings under Prevent Double Charge.
The purchase action supports both on-session (visitor confirmed the card just now via PaymentElement) and off-session (using a previously saved card) flows. AppFunnel handles the distinction automatically based on the session state.