# Activating and configuring Rokt Thanks
Source: https://docs.aftersell.com/aftersell/activating_and_configuring_rokt_thanks
How to enable and design Rokt Thanks on the confirmation page
In order to generate additional revenue from Rokt Thanks on your Thank You page, Order Status page, and customer account pages, you must first set-up and enable Rokt Thanks from the Aftersell admin. To do so:
Navigate to the *Rokt Thanks* tab in the navigation menu.\\
Click "Get Started"
Select your industry vertical. If you do not see the exact industry, choose the option that matches your industry the closest.
Review our [Terms and Conditions](https://www.rokt.com/policies/aftersell-powered-by-rokt-services-agreement) & [Privacy Policy](https://www.rokt.com/policies/privacy-policy). Once you've done so, click the checkbox to agree to them. Then click "Save & Continue" to move onto the next step.
In order to get paid for your Rokt Thanks offers, you'll need to provide a PayPal email address. If you do not have a PayPal account, you can still enter the email address that you wish to receive payments through, and PayPal will help you create an account once your first payment has been processed. Learn more about payouts [here](/aftersell/rokt_thanks_payouts).
Afterwards, the app will show you a loading screen while we create your Rokt account and give you access to our Rokt Thanks feature. This **does not** enable Rokt Thanks on your store right away.
Once your account is created, enable Rokt Thanks by clicking the "Enable" button in the setup walkthrough.
**NEXT:** We'll be placing the offers on your store.
## **App block placement**
Rokt Thanks is built on Shopify's Checkout Extensibility framework, requiring app block placement on Shopify pages for it to render. The app block we use for Rokt Network products is called the 'Rokt Placement' block.
To place this block on your Thank You page and Order Status page, simply click on the 'Edit Thank You Page' and 'Edit Order Status Page' buttons from the Rokt Thanks admin to be redirected to the Shopify Checkout Editor.
From there, in any of the sections on your page, click 'Add block' and select 'Rokt Placement' from the list of Aftersell blocks.
Once placed, make sure to click "Save".
When you navigate back to the Rokt Thanks admin, we will detect the block placement automatically and your task checklist will update. Please note that the setup will remain incomplete until the app blocks are saved successfully in the Shopify Checkout Editor.
***
## **Rokt Vaulted Rewards (Customer Account Pages)**
**Overview**
Shopify has introduced a new generation of customer account pages - specifically the Profile and Orders pages - which support app blocks. If your store has migrated to these new account pages, you can now display Rokt Thanks ads in these placements, the same way they appear on your Thank You page.
This represents a meaningful incremental revenue opportunity, with an estimated 10-20% uplift on top of your current placements.
**Requirements**
Your store must be using Shopify's new customer account pages. You can confirm this by checking your login experience:
Click on the "My Account" button in your storefront's navigation bar. If the login screen shows a "Continue with Shop" button in a distinctive purple/indigo color and uses Shop Pay authentication, **your store is using the new account pages and is eligible for this placement.**
Logged in view:
**Step 1: Start Setup**
A new card will appear on the "Rokt Thanks" tab in Aftersell. Click "Start Setup" and a loader will appear. While loading, two new pages will be created in your account - one for Orders and one for Profile - with all dependencies attached automatically.
**Step 2: Give Permissions**
Certain access scopes are required for Rokt to display on your Account pages. Click the "Give Permissions" button to accept these scopes. This will open a prompt to grant access.
**Step 3: Place App Blocks**
Once permissions are granted, click "Edit Orders Page" to open your Shopify editor.
We'll need to add the "Rokt Placement" app block to **both** the Profile and Order pages. So repeat these following steps for both surfaces.
First, select the surface from the dropdown at the top of the Shopify Editor.
Click "Add Block" and select "Rokt Placement".
Once placed, make sure to click "Save". Repeat the same steps for the other surface.
That's it - Rokt Thanks is now live on your account pages.
Vaulted rewards is available to stores using Shopify's new customer accounts. If you don't see the vaulted rewards option in your Rokt Thanks admin, your store may not be eligible yet.
***
## **Appearance**
In Shopify's Extensibility framework, there are some appearance options available to you. These customization options are controlled by Shopify from within their Checkout Editor. You can access the Checkout Editor via Shopify's Settings > Checkout > Customize.
Rokt Thanks will specifically inherit the typography selected for your checkout pages as well as the Button and Accent colors specified in the Color section.
***
## **Preview the placement**
To view the placement on your actual pages, follow these steps:
1. Enable Rokt Thanks in the Aftersell admin
2. Ensure the 'Rokt Placement' app blocks are placed on your Thank You page, Order Status page, and (if eligible) customer account pages via the Shopify Checkout Editor
3. Wait 10 minutes after enabling the placement before conducting a test purchase
4. Make a test purchase on your store and view the pages
If Rokt Thanks is not showing as expected click the button below to learn more:
[Learn More](/aftersell/why_is_rokt_thanks_not_showing_on_my_confirmation_page)
# Adding a checkout widget to your Shopify checkout
Source: https://docs.aftersell.com/aftersell/adding_a_checkout_widget_to_your_shopify_checkout
How to customize Shopify checkout with Aftersell widgets, add app blocks like Testimonials, and adjust their position before going live
After [creating your first checkout widgets in Aftersell](/aftersell/creating_your_first_checkout_widget), the next step is to add the widgets in your Shopify checkout.
***
## Step 1: Navigate to Shopify checkout customization page
There are two ways to do this:
1. Navigate to the "Settings" tab in Shopify. Click on "Checkout" in the left hand side navigation. Click "Customize" next to your desired checkout profile.
2. Click on the "Open Shopify Checkout Editor" in the bottom right of the Aftersell checkout editor page.
The first option will give you more granularity on which checkout profile you are editing, whereas the second option will bring you to the live profile version of your checkout. We recommend testing on a draft version first to ensure everything is working as you desire before setting it live.
***
## Step 2: Add an app block
Click "Add app block" in the Shopify checkout customization page.
You will be presented with the different widget options that Aftersell offers. In this example, we will be selecting the Trust Badges Widget.
After selecting your desired widget, select the correct placement and then press save in the top right corner. You may want to consider checking the "Include app block in Shop Pay" option if you want your checkout widgets displaying in the Shop Pay checkout.
***
## Step 3: Change app block position
Drag and drop the app block to your desired location and press save in the top right corner.
# Affiliate program
Source: https://docs.aftersell.com/aftersell/affiliate_program
This article outlines how to join and earn with the Aftersell affiliate program.
If you're a fan of Aftersell and know others who would benefit from it, we've made it easy for you to earn extra income by simply sharing the word.
The Aftersell Affiliate Program offers you the opportunity to earn a **15% commission every month for up to 12 months** for each new customer you refer who continues to use the app.
***
### How It Works
1. **Sign Up** - Visit our affiliate page, submit your application, and receive your personalized referral link.
2. **Share Your Link** - Promote your link through the channels you already use, such as social media, blogs, email newsletters, YouTube, or direct messages. Share it wherever you naturally connect with your audience.
3. **Earn Commission** - When someone subscribes to Aftersell using your link and remains a paying customer, you'll receive **15% of their monthly subscription for up to 12 months.**
***
### Commission Structure
* **Rate:** 15% of the referred customer's monthly subscription fee.
* **Duration:** Commissions are paid for up to 12 months, provided the referred customer continues to use the app.
***
### Payouts
* **Timing:** Commissions are paid on the 15th of the following month.
* **Payment methods:** PayPal, Stripe, or direct deposit.
* **Minimum payout:** \$5.
* **Delivery:** Payments arrive within 2–10 business days after processing.
* **Setup required:** You must connect a payment provider in your PartnerStack dashboard to receive payouts.
***
### Rules and conditions
* Referrals must be made using your personalized affiliate link. Commissions cannot be earned retroactively if a referral was made without it.
* You must sign up for the program to receive your referral link before sharing.
* The referred customer must be a new Aftersell customer and remain a paying subscriber for commissions to be paid.
***
### Application review process
Applications are reviewed by the Affiliates team on a first-come, first-serve basis.
* **Timeline:** Applications typically take up to 7 business days to review. This may be slightly extended during weekends or holidays.
* **Notification:** You will receive an email once your application has been reviewed.
Application reviews are handled in the order they are received and cannot be expedited. If you have recently applied, please allow the full review period before following up. For any questions about your application, send a message via your **PartnerStack account** once it has been created and our Affiliates team will be happy to help.
***
### Who Is This For?
This program is ideal for:
* Influencers and content creators
* Bloggers and writers
* Ecommerce coaches and consultants
* Anyone connected to online store owners
Whether you have a large following or a small, engaged network within the Shopify community, your referrals can add up quickly.
***
**Ready to start earning?**
[Join the program](https://aftersellbyrokt.partnerstack.com/?group=affiliateaftersell)
Already a member? For any questions about the Affiliate Program, send a message via your PartnerStack account and our Affiliates team will be happy to help.
# Aftersell billing & pricing
Source: https://docs.aftersell.com/aftersell/aftersell_billing_pricing
This guide will walk through Aftersell's pricing structure and frequently asked questions related to billing.
Your pricing on Aftersell depends on which features are on your plan, summarized below.
## Which pricing applies to you?
**Which Aftersell features are on your plan?**
→ [**Post-purchase funnels only**](/aftersell/post_purchase_overview) → You will see one Aftersell usage charge per month, sized by your store's order volume. See the Post-purchase pricing section below.
→ [**Checkout only**](/aftersell/checkout-dashboard-overview) (Shopify Plus only) → You will see one \$99 flat monthly charge while the plan is active.
→ **Both Post-purchase funnels and Checkout** (Shopify Plus only) → Both pricing sections apply to you. You may see two separate Aftersell line items on your Shopify invoice each month, one per feature.
***
## How Aftersell billing works
Aftersell submits charges to Shopify monthly through Shopify's usage charge API. Two things worth knowing about how Aftersell charges in practice:
* **Each feature on your plan has its own 30-day cycle.** Post-purchase and Checkout are billed independently. Each charges once every 30 days from when it first became billable on your plan.
* **The charge fires as long as the feature is on your plan.** Disabling individual widgets or settings inside the Aftersell admin does not stop the monthly charge. The charge stops only when you uninstall Aftersell or switch to a plan that does not include the feature.
***
## Free trial
Every new install gets a 30-day free trial per feature on your Aftersell plan. No charges occur during the trial.
The free trial is **per feature, not per app**. If you signed up for Post-purchase funnels only at install and add Checkout later, Checkout starts its own fresh 30-day trial from the day it is added to your plan. Your Post-purchase trial status is not affected. The two features can be in different trial states at the same time.
If you previously uninstalled Aftersell and are reinstalling, your free trial eligibility is determined automatically based on your account history at the time of reinstall. If you have questions about your specific trial status, contact the Aftersell support team.
***
## Post-purchase pricing
Aftersell's Post-purchase pricing is based on your **total store orders each month**. This means that your bill may increase or decrease based on your order volume each month.
**Store orders** refers to the total number of orders placed on your Shopify store in the last 30 days. This includes every order on your store.
Aftersell's **current** post-purchase pricing is as follows:
For example, if you have 1,500 orders on your Shopify store in the last 30 days, you will be billed \$99.99. If you have 10,000 orders, you will be billed \$329.99. If you have 100,000 orders, you will be billed \$799.99. \$799.99 is the maximum monthly Post-purchase usage charge. Even if your store's order volume grows beyond 100,000 orders in a 30-day window, your Post-purchase charge will not exceed \$799.99.
***
## Checkout pricing (Shopify Plus only)
Aftersell's Checkout functionality is billed at a flat **\$99 per month**. The charge fires once every 30 days while you have an Aftersell plan that includes Checkout. There is no order-volume scaling for Checkout, it is a flat monthly rate.
The charge stops only if you switch to a plan that does not include Checkout, or if you uninstall Aftersell.
Aftersell's Checkout features require Shopify's Checkout Extensibility, which is only available to **Shopify Plus** merchants. If your store is on Basic, Shopify, Advanced, or any plan other than Shopify Plus, you cannot subscribe to or use Aftersell Checkout. This is a Shopify platform restriction, not an Aftersell limitation.
***
## When do charges begin after installation?
Charges begin immediately after your 30-day free trial expires and reflect on the next Shopify invoice. During the trial, you can use Aftersell features without any charge.
***
## How do I change my pricing plan in Aftersell?
If you are on the Shopify Plus plan, you have access to both the Post-purchase and Checkout Aftersell plans. To switch between them, navigate to **Settings** in the left-hand navigation under Aftersell and click on **Billing**. From there, you can switch to your desired plan:
***
## What you'll see on your Billing page
To open the Billing page, navigate to **Settings → Billing** in the Aftersell admin. The page is organized into four sections.
| Section | What it shows |
| :--------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **This billing cycle** | The amount due for the current cycle, its due date, and a "View Shopify Billing" link. |
| **Current plan** | Your active plan with an "Active" status badge, plus a per-feature breakdown. See the detail below. |
| **Earn & Save** | Matching discount status, lifetime savings, and an enrollment progress card if your store is eligible. See the Earn & Save Program page. |
| **Payment history** | A table of past charges showing date, product, base amount, matching discount, and final total. |
### Current plan, in detail
Each feature on your plan has its own card under the Current plan section. Only features that are actually on your plan appear.
* **Post-purchase**: shows your current monthly charge, your orders in the last 30 days, your current pricing tier, and how many more orders until you reach the next tier.
* **Checkout**: shows the flat \$99 per month charge.
From this section you can also access "Compare plans", "View pricing tiers", and a "How billing works" link.
***
## How is the billing period determined?
Each feature on your Aftersell plan bills once every 30 days, starting from the day the feature first became billable on your plan. The amount is calculated based on your order volume for the previous 30 days. For example, if your charge fires on April 1, the amount is calculated from your store's order volume during the previous 30 days. Your next charge then fires 30 days later, on May 1.
If you have both Post-purchase and Checkout enabled, each feature has its own 30-day cycle. They may bill on different days each month if you enabled them on different dates.
***
## Enterprise pricing
Aftersell offers enterprise pricing for larger stores with specific needs, such as multi-store account arrangements where a single billing setup spans more than one Shopify store. Enterprise pricing is generally not applicable to smaller and mid-size stores, which are well-served by the standard tiered pricing above. If you think enterprise pricing might be a fit for your account, reach out via in-app chat or email [support@aftersell.com](mailto:support@aftersell.com) to discuss.
***
## Tips for managing billing
* Confirm your plan and trial dates on **Settings → Billing** during your first week.
* Watch your monthly order volume so you know when you might cross into a new pricing tier.
* Review your Shopify bills regularly under **Shopify Admin → Settings → Billing → Recent bills**.
* If you are enrolled in Earn & Save, check your matching discount each cycle to see how much you are saving.
* Uninstall at least one day before your next billing date if you want to avoid charges for the next cycle.
***
Aftersell calculates your monthly bill based on your store's total order volume over the previous 30 days. This includes every order placed on your Shopify store, regardless of whether each order interacted with an Aftersell offer.
The pricing model assumes that most of your orders can be served an Aftersell offer through one of several surfaces:
* **Post-purchase funnels** appear on orders that meet Shopify's Post-purchase eligibility requirements.
* **Thank you page upsells** appear on the order confirmation page and can capture orders that did not qualify for the Post-purchase page.
* **PDP upsells** and other pre-purchase surfaces drive incremental conversion before the order is even placed.
To get the most value out of Aftersell, set up the surfaces that fit your store. Together they give the majority of your orders an opportunity to convert into additional revenue.
Eligible stores can lower their subscription through the Rokt Thanks Earn & Save program. Your Rokt Thanks earnings pay out to you in full and match as a discount on your bill, up to your bill amount. See the Earn & Save Program page for details.
To request a refund, contact the Aftersell support team via in-app chat or email [support@aftersell.com](mailto:support@aftersell.com). Include your store URL, the charge date and amount you are requesting a refund for, and a short explanation of why.
What happens next depends on the status of the charge in Shopify's billing system:
* **Charge already paid.** Refunds are processed via Shopify's refund flow and post back to your original payment method.
* **Charge sent to Shopify but not yet collected.** A refund cannot be processed directly. You can either wait for Shopify to collect the charge and request the refund afterwards, or request an app credit equivalent to the amount.
* **Charge not yet submitted.** In some cases the Aftersell support team can stop the charge from being submitted, so it never appears on your Shopify bill.
Refunds are reviewed individually. Standard Shopify refund processing times apply once approved.
You can cancel your subscription directly from the Aftersell app. Navigate to **Settings → Billing**, scroll to the bottom of the page, and click **Uninstall**. A modal will guide you through selecting a cancellation reason and confirming the uninstall. This cancels your subscription and removes the app from your store in one step.
After uninstall, your settings and data are retained for up to 1 year. If you reinstall within that year, you can restore your configurations, widgets, and funnels. To avoid charges for the next billing cycle, uninstall at least one day before your next billing date.
For the full cancellation walkthrough, see How do I cancel my Aftersell subscription.
Shopify collects app billing charges on the billing cycle for your Shopify subscription, not on the day the charge is submitted. So even though Aftersell may have submitted a charge before you uninstalled, Shopify will collect it on the next Shopify billing cycle.
If you uninstalled but were still billed, this usually means the uninstall happened after the billing cycle had already processed. Any pending charges from previous billing periods still need to be resolved. To avoid this, uninstall at least one day before your next billing date.
# Aftersell & Inveterate integration
Source: https://docs.aftersell.com/aftersell/aftersell_inveterate_integration
This article explains how to set up the Aftersell and Inveterate integration.
The integration between Inveterate and **Aftersell** makes it simple to promote your **membership program as a post-purchase upsell**. It ensures your membership product works seamlessly within an Aftersell funnel, helping you drive more recurring revenue.
For example, if a customer buys a pair of shoes, you can offer your Inveterate **membership** immediately after checkout, adding value and encouraging ongoing engagement.
After a customer places an order, they’ll see a post-purchase screen where they can join your membership with just a single click.
## How to Set Up the Integration
1. **Install [Aftersell](https://apps.shopify.com/aftersell) and** [Inveterate](https://apps.shopify.com/inveterate) from the Shopify App Store.
2. **Create a new funnel** in the Aftersell dashboard.
3. **Set targeting rules** to define when and to whom the upsell appears.
4. **Build your upsell offer** by selecting your Inveterate **membership product**.
5. **Save and enable** the funnel to begin displaying the offer post-purchase.
For more details, check out the full guide here: [Inveterate+Aftersell Integration Guide](https://help.inveterate.com/help-center/guides/integrations/aftersell)
# Aftersell & Nosto integration
Source: https://docs.aftersell.com/aftersell/aftersell_nosto_integration
This article explains how to set up the Aftersell and Nosto integration.
Nosto is an alternative product recommendation engine utilized by more than 2,500 merchants, which can be integrated with your Automatic Upsells. Aftersell can connect to your Nosto account and leverage their algorithm for product recommendations.
We suggest visiting their [website](https://www.nosto.com/) if you have any inquiries regarding the product recommendation algorithm they employ.
## Steps to setup the integration
If you're interested, you’ll need to follow the steps below to set up Nosto through Aftersell:
1. Search for [Nosto](https://apps.shopify.com/nosto-personalization-for-shopify) in the Shopify App Store and **install the app.**
2. Navigate to the "**Settings**" section of the Nosto app, then click on "**Authentication Tokens**."
* If you don't see any API tokens, you'll need to reach out to Nosto Support to obtain one before proceeding.
3. After you obtain the API token, click the blue "Decrypt" button:
This will open a window displaying the API key. Ensure you click "**Copy to Clipboard**" to copy the API key, and remember to **keep it private**.
4. Now that you have the API key, return to Aftersell and navigate to the "**Settings**" tab on the left side of the app. Then, go to the Automatic Upsells section.
5. Ensure that "**Nosto**" is selected as your Product Recommendations app and that you have pasted the API token from earlier into the Nosto API key field:
6. **Save your changes**, and Nosto is now connected. Next, we need to set up some Automatic Upsells for it to utilize.
7. Go to the funnel editor and create an Automatic Upsell.
* You can choose to create either a single Automatic Upsell or multiple; there’s no limit to how many you can set up.
8. If you’re ready to test it out, ensure that the funnel with your Automatic Upsells is active. Once it’s active, place an order on your store that meets the funnel's trigger requirements. This will enable you to check if the product recommendations are functioning correctly.
* If you recently installed Nosto, we recommend waiting a few hours to allow its product recommendation algorithm to activate on your store. Otherwise, it may not yet have recommendations for your customers.
***
# Aftersell & Rivo integration
Source: https://docs.aftersell.com/aftersell/aftersell_rivo_integration
This article explains how to set up the Aftersell and Rivo integration.
**Rivo** and **Aftersell** seamlessly integrate to help you boost revenue by offering **membership upsells post-purchase.** With Aftersell’s powerful post-purchase upsell features, you can promote **Rivo memberships** to grow your subscriber base and increase your **average order value**.
***
## Why Combine Rivo with Aftersell?
* **Turn buyers into members** by upselling memberships post-purchase.
* **Boost customer retention** by enrolling more customers into your membership program.
* **Increase AOV** by offering memberships as a value-packed upsell.
***
## How to Set Up the Integration
## 1. Install Both Apps
* Add [Rivo](https://www.rivo.io/) to your Shopify store.
* Install **Aftersell** from the [Shopify App Store](https://apps.shopify.com/aftersell).
## 2. Set Up Your Rivo Membership
* Configure your **membership tiers and pricing** in the Rivo dashboard.
* Ensure your **membership product** is active and available for purchase.
## 3. Create Your Aftersell Upsell Offer
* Open **Aftersell** and navigate to **Post-Purchase Upsells**.
* Click **"Create New Offer"** and select your **Rivo membership** as the upsell product.
* Customize the messaging to highlight the benefits of joining your membership program.
## 4. Launch the Offer
* Enable the **post-purchase upsell flow**.
* Test your checkout experience to ensure the Rivo membership offer is showing correctly.
***
## Next steps
Your customers can now easily add a **Rivo membership** after they complete their purchase, helping you **increase recurring revenue** and **maximize customer lifetime value**.
For more help, contact the Rivo team via email at [help@rivo.io](mailto:help@rivo.io).
# Aftersell & Skio integration
Source: https://docs.aftersell.com/aftersell/aftersell_skio_integration
This article explains how to set up the Aftersell and Skio integration.
**Skio** is a modern subscription platform built for DTC brands, offering seamless account management, flexible selling plans, and powerful retention tools. It integrates directly with **Aftersell**, enabling you to offer post-purchase subscription upsells that boost AOV and customer lifetime value.
***
## How to Enable Subscription Upsells with Skio and Aftersell
## 1. Install the Apps
Download both [Skio](https://apps.shopify.com/skio-subscriptions) and [Aftersell](https://apps.shopify.com/aftersell) from the Shopify App Store.
## 2. Set Up Selling Plans in Skio
* In the Skio dashboard, create your **Selling Plans** and organize them as needed.
* These plans define the subscription options and are required for Aftersell to recognize your Skio-powered subscription products.
## 3. Configure Post-Purchase Upsells in Aftersell
* Open the **Aftersell** app and navigate to the **post-purchase upsell** section.
* Create a new upsell offer and select a **Skio subscription product** linked to your selling plan.
* This setup allows customers to easily add or upgrade to a subscription immediately after checkout.
**Note:** Ensure your Skio selling plans are fully set up before creating your upsell offer in Aftersell.
## Selling-plan picker for subscription upgrades
When you configure a subscription upgrade offer with an upgrade type of **Frequency only** or **Both**, a selling-plan picker is shown in the offer edit panel. This lets you select a specific Skio selling plan to apply to the upgrade, giving you precise control over which subscription option is offered to customers.
# Aftersell & Stay.AI integration
Source: https://docs.aftersell.com/aftersell/aftersell_stayai_integration
This article explains how to set up the Aftersell and Stay.ai integration.
**Stay AI** is a powerful subscription management platform built to help e-commerce brands drive retention and boost customer lifetime value. One of its standout features is the ability to create flexible, data-driven selling plans that adapt to customer behavior. Stay AI integrates seamlessly with **Aftersell**, allowing you to offer post-purchase subscription upsells and further maximize the value of each customer.
***
To enable subscription-based upsells using **Stay.ai** and **Aftersell**, follow the steps below:
## 1. Install the Apps
* Download both the **[Stay.ai](https://apps.shopify.com/stay-ai)** [app](https://apps.shopify.com/stay-ai) and the **[Aftersell](https://apps.shopify.com/aftersell)** [app](https://apps.shopify.com/aftersell) from the Shopify App Store.
## 2. Set Up Selling Plans in Stay.ai
* In the **Stay.ai** dashboard, navigate to **Subscription Setup > Selling Plans**.
* Create your **Selling Plans** and organize them into **Selling Plan Groups**
* These plans define your subscription options and are required for Aftersell to recognize your subscription products.
## 3. Configure Subscription Upsells in Aftersell
Open the Aftersell app, go to the post-purchase upsell section, and create an upsell offer. Select a subscription product (linked to your Stay.ai selling plan) as the upsell item. The shopper can now subscribe right after checkout.
The connection between Aftersell and Stay.ai is enabled through Shopify's native Selling Plans, so make sure your selling plans are fully configured in Stay.ai before creating the upsell in Aftersell.
***
You can learn more about the integration in this [Aftersell x Stay AI Integration](https://help.retextion.com/en/articles/9406520-aftersell-integration)
## Supported Aftersell features with Stay.ai
| Feature | Supported with Stay.ai? |
| -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- |
| Subscription Upsell (offer a subscription post-purchase) | Yes — works through Shopify's native Selling Plans |
| Subscription Upgrade (swap a one-time purchase into a subscription, or change frequency on an existing subscription) | No — Subscription Upgrade currently requires Recharge, Skio, or Loop |
Subscription Upgrade currently requires Recharge, Skio, or Loop. If you want to use Subscription Upgrade, see the [Subscription Upgrades guide](/aftersell/subscription-upgrades) for setup steps with a supported provider.
# Aftersell & Yotpo reviews integration
Source: https://docs.aftersell.com/aftersell/aftersell_yotpo_reviews_integration
This article explains how to set up the Aftersell and Yotpo Reviews integration.
Aftersell works with most product review apps automatically, including Judge.me, Stamped, ReviewsIO, Junip, Okendo, Shopify Reviews, and many more - review stars are displayed on your offers without any credentials. Yotpo Product Reviews requires additional setup described below.
## Setting up Yotpo integration
1. Download the [Yotpo app](https://apps.shopify.com/yotpo-social-reviews) in the Shopify app store
2. In the Yotpo app, tap the Profile icon in the top right corner of the screen, then choose `Account Settings > General Settings`. You will find your App Key at the bottom of the General Settings section:
* For more information, click [here](https://support.yotpo.com/docs/finding-your-yotpo-app-key-and-secret-key)
3. Open the Aftersell app, then go to `Settings > Product Reviews`
4. Select **Yotpo** from the review integrations list
5. Paste your App Key in the **Yotpo app key** field
6. Click **Save changes**
The integration is complete. Review stars will display on your upsell offers for products with Yotpo reviews.
## Syncing reviews
For the testimonials widget, Aftersell imports reviews from Yotpo and stores them so they can be displayed in checkout. The first import happens automatically within 24 hours, and then once a week after that.
To import reviews immediately:
1. Go to `Settings > Product Reviews`
2. Find the **Yotpo reviews** section
3. Click **Sync now**
The sync status shows when reviews were last imported and when the next sync is available.
# Post-purchase analytics
Source: https://docs.aftersell.com/aftersell/analytics_in_aftersell
Understand your post-purchase funnel performance and product page upsell metrics in Aftersell.
This page covers analytics for post-purchase funnels (including A/B tests and multivariate tests) and product page upsells in Aftersell. For checkout widget analytics, see [Checkout Analytics](/aftersell/checkout_analytics).
Analytics reflect data at the time of the transaction. If an order is later refunded, partially paid, or cancelled, the accepted offer count and associated revenue are not retroactively adjusted. An offer that was accepted will continue to count as an accepted offer in your analytics regardless of what happens to the order afterward. Keep this in mind when comparing analytics data to your actual payout or revenue reports.
***
## General notes about graphs
The large summary numbers at the top of each graph are weighted averages of the data shown. This method gives a more accurate overall view than a simple average. For example, three days of conversion rates are shown:
* **Day 1:** 3 accepted / 10 shown = 30%
* **Day 2:** 1 accepted / 9 shown = 11%
* **Day 3:** 5 accepted / 15 shown = 33%
The summary number is calculated as: `(3 + 1 + 5) ÷ (10 + 9 + 15) = 26.5%` not a simple average like `(30 + 11 + 33) ÷ 3 = 24.7%`. Weighted averages ensure that days with more impressions have the right impact on your totals.
Throughout the analytics dashboard, you can hover over the **ⓘ info icon** next to any metric to see how that value is calculated. The formulas listed in the tables below match the tooltip calculations shown in the dashboard.
***
## Funnels Tab
The Funnels tab shows analytics for your post-purchase funnels. You can filter by a specific funnel using the "Select a funnel" dropdown or view "All funnels" combined. You can also use the "Select upsell types" checkboxes to filter analytics by specific offer positions (for example, Upsell 1, Upsell 2, Upsell 3, Downsell 1, Downsell 2, or Thank You page). Some metrics such as Revenue per visit and Product profit per visit show separate values for Post-purchase upsells and Thank You page.
Product profit analytics is currently in Beta. Aftersell tracks the cost of upsell items at the time of purchase to provide insights into profitability. Data will start tracking one day after activating. Product profit data is not available for historical data prior to activation. Contact our support team to enable product profit analytics for your store.
### Funnels Tab Metrics
| Metric | What it measures | Formula |
| ---------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- |
| **Revenue** | The amount of money, in the shop currency, that the customer paid for the upsold product. This is the gross amount before any costs to the store, but after any discount the customer received. Revenue from other products in the order is not included. | `sum(upsold product revenue)` |
| **Revenue per visit** | The average revenue per unique page visit. A unique visit is counted once per customer, even if they view the page multiple times on a single order. This is the recommended way to measure performance over time. | Post-purchase: `post-purchase revenue / unique post-purchase visits` TY Page: `TY page revenue / unique TY page visits` |
| **Product profit** | The total product profit generated by Aftersell. Calculated by subtracting the cost of goods sold from revenue. | `sum(revenue) - sum(cost of goods sold)` |
| **Product profit per visit** | The average product profit per unique page visit. Similar to revenue per visit but accounts for cost of goods sold. | Post-purchase: `post-purchase profit / unique post-purchase visits` TY Page: `TY page profit / unique TY page visits` |
| **Impressions** | The total number of times funnel offers were viewed. Counted once per order, even if the same offer is seen multiple times during the same order. | `sum(offer views across all selected funnel offer types)` |
| **Conversion rate** | The percentage of offer views that resulted in an accepted offer. | `(accepted offers / offer impressions) x 100` |
| **Accepted offers** | The total number of offers accepted. Counted when a customer clicks "Accept" and completes the purchase. | `sum(accepted offers across all selected funnel offer types)` |
| **Product profit margin** | The ratio of product profit to revenue. If your products had no costs, this would be 100%. | `(product profit / revenue) x 100` |
| **Average upsell value** | The average revenue per accepted upsell item. Particularly useful when using dynamic products in offers. | `revenue / accepted offers` |
Revenue per visit is the recommended way to measure post-purchase funnel performance over time because it accounts for unique visits rather than raw impressions.
### Top Performing Products Table
This table highlights post-purchase upsells and the revenue generated from them.
| Column | How it is calculated |
| ----------------------- | -------------------------------------------------------------------------------------------------- |
| **Product** | The upsold product name |
| **Conversion rate (%)** | (number of accepted upsells containing the product / number of impressions for that product) x 100 |
| **Revenue** | Total revenue generated from accepted upsells of this product |
The conversion rate in this table is based on the number of accepted offers, not the number of individual product units sold. For example, if a customer accepts one offer containing 3 units of a product, it counts as 1 accepted offer. However, the revenue column reflects the total value of all units purchased through that offer.
### Resetting analytics on an offer card
You can reset the analytics displayed on an individual offer card in the funnel editor without affecting your overall funnel analytics or the analytics page.
To reset analytics for a standalone offer:
1. Open your funnel in the **Aftersell admin**.
2. Locate the offer card you want to reset.
3. Click the **Reset analytics** icon button (displayed between the **Edit offer** and **Delete offer** icons on the card).
4. Confirm the reset in the dialog that appears.
After the reset, the offer card recomputes its displayed metrics (impressions, revenue, profit, conversion rate, revenue per visit, and profit per visit) using only data from the reset point forward. No analytics data is deleted — the analytics page and other reports are unaffected.
The reset analytics action is available on standalone offers only. For A/B test and multivariate test offers, use the **Reset analytics** option in the test's three-dot menu instead. See [Post-Purchase A/B Testing](/aftersell/post_purchase_a_b_testing) for details.
***
### Deleted Funnels
Deleting a funnel does **not** remove its historical analytics data. Revenue and performance from deleted funnels are still included when **"All funnels"** is selected in the Funnel dropdown. However, once a funnel is deleted, it will no longer appear in the dropdown and cannot be viewed individually. Historical data is preserved for overall reporting, but funnel-specific breakdowns are no longer accessible.
***
## Tests Tab
The Tests tab tracks performance for post-purchase A/B tests and multivariate tests. This tab is exclusively for post-purchase funnel tests.
Checkout widget A/B test performance (Version A vs. Version B) is not shown in the Tests tab. To view checkout A/B test results, use the widget editor analytics view or the Checkout dashboard. See [Checkout A/B Testing](/aftersell/checkout_analytics) for details.
### Selecting a Test
1. Use the **Select a Funnel** dropdown to choose the funnel containing your test.
2. Use the **Select a Test** dropdown to choose the specific test you want to analyze.
The test card shows the test name, status (for example "Finished" or "Not Running"), the variables tested (for example "Layout"), the start date, and an impression progress bar showing how many impressions the test has received out of the target (for example "0/5364 impressions").
### Top Groups
The Top 3 Groups section shows your test variations ranked by performance. Each group represents a variation (for example, Group 1 = Layout A, Group 2 = Layout B). You can sort the groups using the **Sort by** dropdown, which includes the following options: Profit Per Visit, Profit, Revenue Per Visit, Revenue, and Conversion Rate.
Click on any group to view its individual analytics. Click **See all groups** to expand and compare all test groups side by side.
### Group-level Analytics
When you select a group, you see performance metrics for that specific variation.
| Metric | What it measures | Formula |
| --------------------- | ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- |
| **Profit per visit** | The average product profit per unique visit for this variation. Takes into account cost of goods sold. | `profit for this variation / unique visits for this variation` |
| **Profit** | The total product profit generated by this variation. | `revenue for this variation - cost of goods sold for this variation` |
| **Revenue per visit** | The average revenue per unique visit for this variation. Accounts for both conversion rate and order value. | `revenue for this variation / unique visits for this variation` |
| **Revenue** | Total revenue generated by this variation. | `sum(upsold product revenue for this variation)` |
| **Conversion rate** | Percentage of offer views that resulted in an accepted offer for this variation. | `(accepted offers for this variation / impressions for this variation) x 100` |
### Performance by Variable
This view shows how each variable performs on average across all other variables. Use the dropdown to switch between the following metrics.
| Variable | What it shows |
| --------------------- | ------------------------------------------------- |
| **Profit per visit** | Average profit per visit for each variable value |
| **Profit** | Total profit for each variable value |
| **Revenue per visit** | Average revenue per visit for each variable value |
| **Revenue** | Total revenue for each variable value |
| **Conversion rate** | Conversion rate for each variable value |
| **Impressions** | Total impressions for each variable value |
Use this to isolate which individual changes between variations had the most impact on performance.
### Key Metrics to Evaluate When Selecting a Winner
A winning variation should perform well across multiple metrics, not just one:
* **Higher profit per visit** - Each unique visit generated more profit after accounting for cost of goods sold.
* **Higher revenue per visit** - Each unique visit generated more revenue.
* **Higher conversion rate** - More customers accepted the offer.
* **Comparable or better average upsell value** - The accepted offers are generating equal or higher revenue per acceptance.
***
## Product Page Upsells Tab
The Product Page Upsells tab shows analytics for upsells displayed on your product pages.
Product page upsells do not currently support A/B testing.
### Product Page Upsells Metrics
| Metric | What it measures | Formula |
| ------------------------- | ------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------- |
| **Revenue** | The total revenue from product page upsells. | `sum(PDP upsell revenue)` |
| **Revenue per view** | The average revenue generated per unique view on product page upsells. | `revenue / unique impressions` |
| **Unique impressions** | The number of unique views on product page upsells. | `sum(unique PDP views)` |
| **Conversion rate** | The percentage of unique visitors who completed an order with a product page upsell. | `(upsold orders / unique impressions) x 100` |
| **Purchased products** | The number of products purchased through a product page upsell. | `sum(PDP products purchased)` |
| **Upsold orders** | The number of orders that included a product purchased through a product page upsell. | `sum(orders with PDP upsell)` |
| **Revenue per order** | The average revenue per order containing a product page upsell. | `revenue / upsold orders` |
| **Average upsell value** | The average revenue per product page upsell product purchased. | `revenue / purchased products` |
| **Profit** | The total profit from product page upsells. Calculated by subtracting cost of goods sold from revenue. | `sum(PDP upsell revenue) - sum(PDP upsell cost of goods sold)` |
| **Profit per view** | The average profit generated per unique view on product page upsells. | `profit / unique impressions` |
| **Average upsell profit** | The average profit per product page upsell product purchased. | `profit / purchased products` |
| **Profit per order** | The average profit per order containing a product page upsell. | `profit / upsold orders` |
***
## Custom dashboards
📝 Beta access — This feature is available on request. Contact the customer support team to enable access.
Custom dashboards appear as additional tabs on the Analytics page, alongside the built-in tabs such as Summary, Funnels, and Checkout. Each dashboard tab displays a grid of cards, where each card visualizes a saved query.
### Viewing a dashboard
Click any dashboard tab to open it. The date range picker and compare period picker in the top-right corner apply to all cards in the active dashboard. Switching to a different tab resets any date or compare overrides you have set.
### Creating a dashboard
Click **Create dashboard** (visible in the top-right corner from any tab) to create a new dashboard. A new tab named "Untitled dashboard N" is created and becomes the active tab in view mode.
### Editing a dashboard
On a dashboard tab you own, click **Edit dashboard** to enter edit mode. In edit mode you can:
* Rearrange cards by dragging them.
* Remove a card using the remove button on the card.
* Change a card's title or chart type.
Click **Save** to commit your changes, or **Cancel** to discard them. Switching tabs while in edit mode discards the draft without a confirmation prompt.
Global (template) dashboards are read-only. The **Edit dashboard** button is not shown for global dashboards.
### Tab bar scrolling
When there are more tabs than fit in the tab bar, left and right arrow buttons appear at each end of the bar. Click the arrows to scroll through the tabs. The arrows are disabled when you have reached the start or end of the list.
***
## Custom Data Tab
This feature is in beta and is available on request. Contact the support team to enable access.
The Custom Data tab provides advanced CSV exports for detailed analytics analysis. You can export data for a 30-day period ending on any fully complete UTC day.
### Available Exports
Exports post-purchase upsell latency metrics per session, including:
* TTI (Time to Interactive)
* RTTI (Relative Time to Interactive)
* PTTI (Perceived Time to Interactive)
Exports per-upsell daily totals with the following columns:
* Store Name
* Date
* Upsell Name
* Upsell Type
* Sum of Impressions
* Sum of Clicks
Exports per-funnel daily totals with the following columns:
* Store Name
* Date
* Funnel ID
* Upsell Name
* Sum of Impressions (unique visits)
* Revenue
* Revenue Per Visit
### How to Export Custom Data
1. Go to **Analytics** in your Aftersell dashboard.
2. Click the **Custom Data** tab.
3. Select an end date (must be a fully complete UTC day in the past).
4. Click the download button for the export you want:
* **Download Latency CSV**
* **Download Upsell Breakdown CSV**
* **Download Funnel Breakdown CSV**
All exports cover the 30-day period ending at the end of the selected date.
***
**Want to go further?**
* [Order Browser Overview](/aftersell/order_browser_overview) - understand how Aftersell is performing across your orders
* [Order Browser Troubleshooting](/aftersell/order-browser-troubleshooting) - resolve common issues with your order data
* [Post-purchase Best Practices](/aftersell/best_practices) - tips to improve conversion across all your offers
# Automatic upsells not working
Source: https://docs.aftersell.com/aftersell/automatic_upsells_not_working
This article outlines how to troubleshoot when automatic upsell products do not show up in checkout, post-purchase, or thank-you page.
Automatic upsells are a powerful tool for increasing sales by showing relevant products at checkout, post-purchase, or on the thank-you page. However, there are times when these AI upsell offers do not appear or are skipped as intended. These troubleshooting steps will help you identify and resolve common issues preventing automatic upsells from working or being skipped.
## 1. No "Related products" in Search & Discovery
Use the [Shopify Search & Discovery app](https://apps.shopify.com/search-and-discovery) to view “**Related products**” in the *Recommendations* page\*.\* For stores with very few orders or for recently added products, Shopify may not auto-generate “Related products”. You can manually add “Related products” by clicking on the product title and using the section titled “Edit related products”.
For more details on how “Related products” are selected, see this [Shopify help document](https://shopify.dev/docs/themes/product-merchandising/recommendations.)
## 2. Excluded products in Aftersell
Go to *`Aftersell > Settings > Automatic upsells >` Excluded products* to check if you have exclude products from automatic upsells. Look for selected collections that have a large number of products, such as “**All Products**”. If you have excluded too many products then there won’t be any "**Related products**" to show. We recommend keeping the exclusion list small and only excluding products that you absolutely do not want to upsell.Additionally, if you select "All products collection" as an exclusion, it will exclude every product in your store, effectively disabling upsells entirely. Be cautious with your exclusion settings, especially during specific periods when exclusions are active, as they might unintentionally prevent upsells from displaying.
NOTE: Even if you don’t exclude every product from your store, you might still be excluding all items in the “**Related products**” section.
## **3. Password protected online store**
Automatic upsells do not work for stores that require a password. This includes development stores and stores that are password-protected before launch.
* We recommend testing with specific products instead of automatic upsells on these stores.
# Post-purchase best practices
Source: https://docs.aftersell.com/aftersell/best_practices
A complete strategy guide for building, optimizing, and scaling your post-purchase upsell funnels in Aftersell
# Post-purchase best practices
This guide covers everything you need to build a high-performing post-purchase upsell strategy in Aftersell - from funnel architecture and product selection to discount strategy, copy and design, industry-specific playbooks, and testing.
Whether you are setting up your first funnel or optimizing an existing setup, these best practices are based on patterns from top-performing Aftersell merchants.
Want real-world examples from top brands? [Download our Upsell Playbook](https://www.aftersell.com/upsell-playbook) for proven strategies and case studies you can apply to your store today.
Looking for checkout widget best practices? See [Checkout Best Practices](/aftersell/checkout_best_practices).
***
## Funnel architecture
Your funnel architecture determines which customers see which offers, and in what order. Getting this right is the single biggest lever for post-purchase revenue.
### How the post-purchase funnel flow works
Before building funnels, make sure you understand how the offer flow works. For a full walkthrough, see [Post-purchase Overview](/aftersell/post_purchase_overview).
In short: after checkout, Upsell #1 is shown. If the customer accepts, Upsell #2 is shown as a follow-up. If the customer declines, a Downsell is shown instead. After all offers are completed, the customer lands on the Thank You Page.
Shopify limits customers to a maximum of 3 accepted post-purchase offers per order. Only one product can be selected per upsell step. Plan your funnel depth with these limits in mind.
### Start with your hero products
Build dedicated funnels for your 3 to 6 highest-volume products first. These are the items that generate 60 to 80% of your store's revenue, and targeting them ensures your highest-traffic orders always see a relevant, optimized upsell.
Traits of a hero product:
* High sales volume and strong contribution to profitability
* Market leadership in their category
* Broad customer appeal and positive reviews
* Receives dedicated marketing efforts and promotion
### Set up a catch-all funnel
A catch-all funnel ensures that every order - even those that do not match your hero product funnels - still sees an upsell offer. This is one of the most commonly missed steps, and skipping it means leaving revenue on the table.
How to set it up:
1. Set the trigger to "Show for All Customers"
2. Assign it the **lowest priority** so it only fires when no other funnel matches
3. Include Thank You Page upsells in this funnel for full post-purchase coverage
You can adjust funnel priority by clicking the **Manage Priority** button at the top right of the funnel table.
### Use Smart Funnel as your first layer
[Smart Funnel](/aftersell/smart_funnel) uses Rokt's AI and machine learning models to automatically select the most relevant upsell offer for each customer. It evaluates at Priority 0 (before all manual funnels), making it a powerful first layer in your strategy.
We recommend enabling Smart Funnel alongside your manual funnels. It handles the dynamic targeting automatically while your manual funnels cover specific use cases, Thank You Page offers, and edge cases Smart Funnel does not reach.
Smart Funnel currently only supports English. If your store serves customers in other languages, use manual funnels for those audiences until multilingual support is available.
### Add follow-up offers to your funnel
Do not stop at the first offer. A well-structured funnel includes offers on both the accept and decline paths:
* **Upsell #1** - Your primary offer (highest-margin or most complementary product)
* **Upsell #2** (accept path) - Shown when Upsell #1 is accepted. Use this for an additional complementary product or a related add-on
* **Downsell #1** (decline path) - Shown when Upsell #1 is declined. Use this for a lower-price alternative or a smaller version of the original offer
* **Thank You Page offers** - Product recommendations and upsells on the order confirmation page, shown to every customer regardless of what happened on the post-purchase page
This means every customer sees at least two offers (one on the accept or decline path, plus the Thank You Page), and customers who engage see even more.
Use AI-powered product recommendation widgets on the Thank You Page to keep engagement high. These widgets automatically surface relevant products based on what the customer purchased, without any manual configuration required.
### Manage funnel priority intentionally
When multiple funnels match the same order, Aftersell uses the priority order to determine which one fires. Review your priority list regularly:
* Hero product funnels should have higher priority than your catch-all
* Smart Funnel always evaluates at Priority 0 (highest)
* Seasonal or promotional funnels should be temporarily elevated during campaigns
***
## Product selection
Choosing the right products to upsell has a direct impact on conversion rate. The goal is relevance - customers are far more likely to accept an offer that feels like a natural extension of what they just bought.
### Complementary products outperform same-product offers
Upselling a complementary product (for example, sandals with a dress, a phone case with a phone, a serum with a moisturizer) consistently outperforms offering the same product the customer just purchased. The exception is consumable or replenishable products where buying a second unit makes sense.
### Strategic product placement across the funnel
Since the funnel flow is based on accept and decline actions, think strategically about what goes where:
* **Upsell #1:** Your strongest, most complementary offer with the highest expected conversion rate
* **Upsell #2 (accept path):** The customer just said yes - they are engaged. Show a second complementary item or a related add-on. This is a warm audience
* **Downsell #1 (decline path):** The customer said no to the first offer. Show a lower-price alternative, a smaller size, or a different product category. Reduce the commitment level to recover the conversion
### AI recommendations vs. manual selection
Aftersell supports both AI-powered and manually selected product offers:
* **AI recommendations (automatic upsells)** use Shopify's Recommendation API to suggest complementary products based on the customer's order. The recommendations consider factors like purchase correlation, order frequency, and product affinity. For stores with very few orders or recently added products, Shopify may not have enough data to generate recommendations - in that case, you can manually add related products in the Shopify Search & Discovery app. You can exclude specific products from automatic upsells under **Settings > Automatic upsells > Excluded products**.
* **Manual selection** gives you full control over exactly which products appear. This is best for curated campaigns, seasonal promotions, or when you know your catalog deeply.
When using automatic upsells (AI recommendations), you can enable a setting to skip the offer if the product already exists in the original order. In Smart Funnel, this is the "Skip Products in Original Order" toggle. In regular funnels, this is in the Product Details widget settings. We recommend keeping this enabled to avoid offering the customer a product they just purchased. This setting does not apply to the Most Expensive or Least Expensive in Cart product types, which are designed to re-offer items from the original order.
We recommend A/B testing AI vs. manual to see which performs better for your store. Many merchants find that AI outperforms manual selection for high-traffic, diverse catalogs, while manual selection wins for stores with a smaller, curated product line.
### Quantity defaults
For lower-cost or consumable products, test offering a default quantity of 2 instead of 1. If the x2 offer is accepted more often, it means increased revenue with no extra effort. This works especially well for supplements, food items, skincare, and other replenishable goods.
***
## Discount strategy
Discounts are one of the strongest levers for post-purchase conversion, but the approach matters more than the amount.
### Always offer a discount on post-purchase upsells
Post-purchase offers convert significantly better with a discount than without one. The customer has already committed to a purchase and is in a buying mindset - a discount at this moment feels like a reward, not a sales tactic.
Smart Funnel requires a minimum discount greater than 0%. Offers with a 0% discount are not supported in Smart Funnel, as the templates do not dynamically adjust based on the discount field value. Use manual funnels for 0% discount offers.
### Use compare-at pricing
Enable compare-at pricing to visually emphasize the value of your upsell offer. Displaying a higher "compare at" price alongside a lower discounted price makes the deal feel more compelling, even with a smaller actual discount.
Example:
* Regular price: \$20
* Compare at price: \$25
* Customer sees: \~\~$25~~ $20
The visible discount percentage may differ from what you set in upsell settings when "Use Compare at Price" is enabled, since the compare-at price can inflate the perceived discount. Always double-check how it renders on the page by placing a test order.
### Round your discount percentages
Always round to the nearest 5th - for example, offer 25% or 30% instead of 27%. Round numbers look more intentional and can boost conversion rates.
### Finding the right discount level
A/B test different discount levels to find the sweet spot for your store. The goal is to determine how low you can set the discount without hurting your conversion rate. Common starting points by category:
* **Fashion and apparel:** 10-20% off
* **Supplements and health:** 15-25% off
* **Beauty and skincare:** 10-20% off
* **Food and beverage:** 15-25% off
* **Electronics and accessories:** 5-15% off
* **Home goods:** 10-20% off
These are starting ranges for testing - your optimal discount depends on your margins, product pricing, and customer behavior.
### Discount strategy across the funnel
Consider varying your discount by funnel position:
* **Upsell #1:** Your standard discount (for example, 15% off)
* **Upsell #2 (accept path):** Can be the same or slightly lower - the customer is already engaged and buying
* **Downsell #1 (decline path):** Consider a slightly higher discount to recover the customer who just said no. A bigger discount on a lower-price item can be very effective here
### When to use percentage vs. fixed dollar discounts
* **Percentage discounts** work better for higher-priced items where the dollar savings feel significant (for example, "20% off" on a $100 item = $20 saved)
* **Fixed dollar discounts** work better for lower-priced items where a percentage feels small (for example, "$5 off" feels better than "10% off" on a $50 item)
A/B test both formats to see which resonates with your customers.
***
## Copy and design
First impressions are crucial on post-purchase pages. Customers make snap judgments, so your value proposition needs to be impossible to miss.
### Emphasize key points with bold text and color
Draw attention to the most persuasive elements of your upsell page. Phrases worth highlighting:
* The discount percentage or dollar amount
* "LIMITED TIME" or urgency language
* Countdown timers
* Free shipping mentions
### Write clear, benefit-focused headlines
Your headline should tell the customer exactly what they are getting and why it matters. Lead with the benefit, not the product name.
* Good: "Complete your look - 20% off matching accessories"
* Avoid: "You might also like these products"
### Configure your accept and decline buttons intentionally
The [Buttons widget](/aftersell/post_purchase_widgets) gives you control over how the accept and decline buttons behave and appear. However, Shopify requires that the accept and decline button text follows strict guidelines - the button wording cannot be customized, only translated into a selected language.
What you can configure:
* **Accept button text** - Choose between "Pay Now" (displays "Pay now - Product total price") or "Accept Offer" (displays "Accept offer - Product total price")
* **Button language** - Select from all supported Shopify Checkout locales to automatically translate both accept and decline button text into the customer's language
* **Button layout** - Choose accept above decline, decline above accept, or side by side
* **Decline button style** - Button or link format
* **Button alignment and width** - Adjust positioning to match your offer design
* **Supporting text** - Add optional text above or below the buttons with styling controls and dynamic variable support
The accept and decline button text cannot be freely written or customized beyond the two options listed above. This is a Shopify platform restriction, not an Aftersell limitation. The decline button text is automatically set and can only be translated, not edited.
### "Require Confirmation Click to Accept"
"Require Confirmation Click to Accept" is available in the Buttons widget for individual offers. This setting adds a second confirmation step before an upsell is accepted. It is worth being aware of if you are using the Most Expensive or Least Expensive in Cart product types, which re-offer items from the customer's original order. If you find that customers are reaching out about unintended purchases on these offer types, this setting can help. It is not needed for all offers, as the additional step may reduce conversion rates.
[Learn more →](/aftersell/post_purchase_widgets)
### Long-form vs. short-form offer pages
* **Short-form pages** offer concise information, faster load times, and a streamlined experience. They work well for lower-priced, impulse-friendly products.
* **Long-form pages** provide detailed product descriptions, features, benefits, and additional images. They work better for higher-ticket products where customers need more information before committing.
We generally recommend starting with short-form and testing long-form for higher-ticket items.
### Multi-step offers within a single page
If you want to show multiple products on a single upsell page (for example, three accessories on Upsell #1), you can use [multi-step offers](/aftersell/how_to_create_a_multi_step_post_purchase_upsell). Multi-step splits a single page into sequential steps where each step shows a different product. If the customer declines a step, they see the next step on the same page. If they accept, they move to the next page in the funnel (for example, from Upsell #1 to Upsell #2).
Multi-step is only available for multi-product upsells and supports up to 12 products per page. We recommend keeping the number of steps minimal for a smooth customer experience.
***
## Thank You Page strategy
Not every order qualifies for Post-purchase upsells due to [Shopify's post-purchase restrictions](/aftersell/why_isnt_my_1_click_offer_displaying). Thank You Page upsells act as a fallback, ensuring those customers still see an offer. Unlike Post-purchase offers, Thank You Page offers work with all payment methods.
### Include Thank You Page offers in every funnel
Set up Thank You Page upsells in every funnel, including your catch-all. Each funnel's Thank You Page widgets must be configured individually - there is no way to standardize them across multiple funnels. This means if you have 5 funnels, you need to configure the TYP section in each one.
Step by step:
1. Open your funnel in the Aftersell admin
2. Scroll to the **Thank You Page** section
3. Click **Add Widget** and select **Product Recommendation**
4. Choose your product selection method, configure your discount, and save
5. Repeat for each funnel, including your catch-all
### Choose the right product selection method
Thank You Page product recommendation widgets support three selection methods. Choose the one that fits your store:
* **Automatic Upsells** - Lets Aftersell recommend products based on the customer's cart contents. This is the easiest option and tends to convert well because the recommendations are personalized to what the customer just bought. Start here if you are unsure which products to show.
* **Specific Products** - Manually select up to 10 products to display. Use this when you want full control, such as promoting a specific product, clearing overstock, or running a seasonal campaign.
* **Collections** - Display products from a specific Shopify collection. Use this when you want variety within a curated set (for example, showing items from the same collection the customer purchased from).
Enable **Hide purchased products** to avoid showing items the customer already bought, and **Hide out-of-stock variants** to only display available products. Both settings are in the product recommendation widget configuration.
### Apply a discount to your TYP offers
You can apply a percentage or fixed dollar discount directly within the TYP widget. We recommend always including a discount on Thank You Page upsells to give customers a reason to act. Use compare-at price display to visually show the savings.
### Set the right order handling method
When a customer accepts a Thank You Page upsell, you choose how the order is processed:
* **Modify original order** - Adds the upsell product to the existing order. Free shipping is automatically applied. Use this for a seamless experience where everything ships together.
* **Create new draft order** - Creates a separate order for the upsell. Use this if your fulfillment workflow requires separate orders, if you want to offer free shipping only on the upsell, or if your upsells overlap with products in the original order.
If your top-sellers are also your main upsell candidates, prefer **Create new draft order** - "Modify original order" silently hides upsells whose variant is already in the customer's order. See [Order Handling](/aftersell/thank_you_page_extensions_overview#order-handling) for the full trade-off breakdown.
### Use banner text to frame the offer
Add a short banner headline above your product recommendations to give customers context. Framing like "Complete the look," "Pairs well with your order," or "Customers who bought this also loved" performs better than showing products with no context.
### Add the app block in Shopify
After configuring your Thank You Page widgets in Aftersell, you must add the Aftersell TY widget app block to **both** the Thank You page **and** the Order Status page in your Shopify Editor, then enable it and save. Skipping this step will cause your Thank You Page widgets to not display for customers.
This is one of the most common reasons Thank You Page widgets do not appear. If your TYP offers are not showing, check the Shopify Editor first before troubleshooting anything else.
***
## Upsell strategies by industry
Different product categories have different upsell dynamics. For detailed playbooks tailored to your vertical - including recommended products, discount ranges, funnel triggers, and testing priorities for fashion, supplements, food and beverage, beauty, electronics, home goods, and automotive - see [Post-Purchase Strategies by Industry](/aftersell/post_purchase_strategies_by_industry).
***
## Testing
A/B testing and multivariate testing are the most effective ways to improve funnel performance over time. See the full [Post-Purchase A/B Testing](/aftersell/post_purchase_a_b_testing) and [Post-Purchase Multivariate Testing](/aftersell/multivariate_testing) guides for detailed setup instructions.
### Key tests to prioritize
These are the highest-impact tests based on patterns from top-performing merchants:
1. **AI (dynamic) vs. specific product (static) upsells** - Determines whether automated product matching outperforms your manual curation
2. **Default quantity 1 vs. 2** - Especially impactful for consumables and lower-cost products
3. **Long-form vs. short-form offer pages** - Tests whether customers need more information or prefer a streamlined experience
4. **Same product vs. complementary product** - Tests repurchase vs. cross-sell
5. **Single product vs. multi-product** - Tests simplicity vs. choice
6. **Varying discount percentages** - Finds the minimum discount needed to maintain conversion rate
A/B testing for post-purchase uses Layout A through Layout E (up to 5 layouts). You cannot A/B test one funnel against another funnel - testing happens within a single funnel across layouts. A/B testing is only available for Post-purchase upsells and is not available for Thank You Page offers. For checkout widget testing, see [Checkout A/B Testing](/aftersell/checkout_a_b_testing).
### Data guidelines
Before making changes to a funnel, ensure it has run for a minimum of 2 to 4 weeks or collected at least 100 to 200 impressions per layout. Changes made too early are based on insufficient data and can lead to misleading conclusions.
Regularly analyze performance data to refine offers, placements, and product selections. An iterative approach helps identify high-conversion strategies while ensuring all changes are based on reliable data.
Use the **Revenue per visit** metric as your primary performance indicator over time, as it accounts for unique visits rather than raw impressions.
***
## Common mistakes
Avoid these pitfalls when setting up and optimizing your post-purchase funnels:
❌ **No catch-all funnel** - some orders will never see an upsell because they do not match any funnel triggers. Set up a catch-all funnel with the "Show for All Customers" trigger at the lowest priority so every order sees an offer.
[Fix it →](/aftersell/quickstart_guide_to_aftersell)
❌ **No Thank You Page upsells** - orders that are ineligible for Post-purchase offers (due to Shopify payment method restrictions) go unconverted. Add Thank You Page upsells to every funnel, including your catch-all. Make sure to add the Aftersell TY widget app block to both the Thank You page and Order Status page in your Shopify Editor.
[Fix it →](/aftersell/how_can_i_set_up_and_customize_thank_you_page_upsells_in_aftersell)
❌ **No downsell configured** - if a customer declines Upsell #1 and there is no downsell on the decline path, you have missed a second chance to convert. Always configure a downsell with a lower-price alternative for the decline path. You can add a downsell in the funnel editor when building your post-purchase funnel.
[Fix it →](/aftersell/post_purchase_overview)
❌ **Irrelevant upsell offers** - generic offers that do not relate to what the customer bought reduce conversions and erode trust. Use collection-based triggers and complementary product selection to match offers to what the customer purchased.
[Fix it →](/aftersell/how_to_configure_post_purchase_triggers)
❌ **Underutilizing AI tools** - missing out on dynamic personalization that often outperforms manual selection, especially for stores with large or diverse catalogs. Enable Smart Funnel and test AI recommendations in your manual funnels.
[Fix it →](/aftersell/smart_funnel)
❌ **Making changes too early** - optimizing before collecting enough data leads to decisions based on noise rather than signal. Wait for at least 2 to 4 weeks or 100 to 200 impressions per layout before drawing conclusions.
[Fix it →](/aftersell/analytics_in_aftersell)
❌ **Not testing** - running the same offer indefinitely without testing leaves performance gains on the table. Run at least one A/B test per quarter on your highest-traffic funnels.
[Fix it →](/aftersell/post_purchase_a_b_testing)
***
## Need help?
If you have questions about setting up or optimizing your post-purchase upsell strategy, chat with our support team using the live chat at the bottom right of the app.
# Can I advertise with Rokt Thanks and promote my business on other sites?
Source: https://docs.aftersell.com/aftersell/can_i_advertise_with_rokt_thanks_and_promote_my_business_on_other_sites
Can I become an advertiser on Rokt Thanks?
Currently, this is reserved to Shopify stores with over 50,000 monthly orders.
To learn how you can join our advertising network, [request a demo](https://www.aftersell.com/demo) from one of our experts.
# Changing post-purchase button colours (CTA)
Source: https://docs.aftersell.com/aftersell/changing_post_purchase_button_colours_cta
This article demonstrates how to modify the background and text colours for the post-purchase call-to-action button.
Aftersell's post-purchase upsell feature allows you to offer additional products to your customers after they have completed their purchase. This can help increase your sales and improve customer satisfaction.
However, you may want to customize the appearance of the upsell button to better match your brand's aesthetic. In this article, we will guide you through the process of changing the post-purchase upsell button background colour.
# Understanding the default button colour
The background color of the post-purchase upsell button will always match the button color of your Shopify Checkout page. This is enforced by Shopify to maintain a cohesive and seamless checkout experience for your customers.
To change your button colour go to your **Shopify Admin > Settings > Checkout**, then click the "**Customize**" button on your live checkout profile:
Next, navigate to the Settings tab on the left and adjust the button colour as shown in the image below.
# Understanding the button text colour
The text on the button is automatically determined by Shopify according to the button background colour. This ensures that the text remains visible and easy to read.
Please note that our editor preview may occasionally show minor inaccuracies, but the post-purchase branding will match your Shopify checkout settings on a live offer.
***
Following these steps allows you to easily adjust the background color of the post-purchase upsell button to better match your brand’s look. If you have any issues or further questions, please don’t hesitate to reach out to our support team via the chat option in the bottom right corner of the app.
# Checkout dashboard overview
Source: https://docs.aftersell.com/aftersell/checkout-dashboard-overview
The Checkout dashboard is your central hub for managing all Checkout widgets and pages, as well as monitoring general performance. This article covers the layout of the dashboard and what each section does.
For a detailed breakdown of how Pages and Standalone widgets work, including setup, configuration, block IDs, and placement - see [**Pages & Standalone Widgets: A Complete Guide**](#pages-vs-standalone-widgets).
***
## **Dashboard metrics**
At the top of the Checkout dashboard, you'll find a summary of your checkout performance across four key metrics:
* **Revenue**: Total revenue attributed to your Checkout upsells widgets
* **AOV**: Average order value of orders that included a Checkout widget
* **Impressions**: Total number of times your Checkout widgets were displayed
* **Conversion**: The Percentage of checkout sessions with widget impressions that resulted in a completed purchase
Use the date selector in the top-left to filter all metrics by a custom date range (e.g., last 30 days). This applies to all metrics on the Checkout dashboard, including those shown in the Pages and Standalone widgets tables.
***
## **Pages**
A Page is a group of related widgets that are displayed together on your checkout based on a shared set of trigger conditions (which can include multiple conditions). While widgets are grouped within a Page and triggered at the same time, each widget still needs to be configured individually and requires its own app block placement. This setup helps coordinate when widgets appear, but does not eliminate the need to manage each widget separately.
The Pages section displays the following information for each page:
| **Column** | **Description** |
| :------------------ | :---------------------------------------------------------------------------------------- |
| **Priority** | The order in which pages are evaluated when multiple pages are active |
| **Name** | The name of the page |
| **Triggers** | The conditions under which this page is shown (or "Show to all" to show to all customers) |
| **Widgets** | Icons representing the widget types included in the page |
| **Impressions** | How many times this page has been shown |
| **Page conversion** | The conversion rate for this page |
| **AOV** | Average order value attributed to this page |
Each page has action buttons on the right:
* **Edit** (pencil icon): Open the page editor
* **View analytics** (bar chart icon): View analytics for this specific page
* **Duplicate** (duplicate icon): Create a copy of the page, including all its widgets and trigger configuration. The duplicated page is created in an inactive state with the name prefixed by "(Duplicated)" so it doesn't conflict with the original's display rules. You can then rename and activate it when ready.
Use **Manage priority** to control the order in which your pages are evaluated, and **Create page** to add a new page.
***
## **Standalone widgets**
Standalone widgets are individual widgets that function independently, each with their own triggers and priority configured at the variant-level.
The Standalone widgets section shows the following for each widget:
| **Column** | **Description** |
| :-------------------- | :--------------------------------------------------------------------------------------------------------------------------------- |
| **Name** | The widget name (e.g., "Default upsell", "Additional upsell 1") |
| **Variants** | The number of variants configured for this widget |
| **Active variants** | How many of those variants are currently active |
| **Placement status** | Whether the widget has been placed in your Shopify Checkout editor. Shows **Incomplete** (red) if placement has not been completed |
| **Impressions** | Total impressions for this widget |
| **Widget conversion** | Conversion rate for this widget |
Each standalone widget also has:
* **Edit** (pencil icon): Open the widget editor
* **View analytics** (bar chart icon): View analytics for this specific widget
**Note:** A maximum of **3 blocks** can be added for Standalone widgets. Each block can contain multiple variants, but no more than 3 blocks per widget can be created.
***
## **Analytics**
You can view analytics for any individual Page or Standalone widget directly from the dashboard by clicking the **bar chart icon** next to it. Analytics can also be accessed from within the page or widget editor.
This allows you to monitor and compare performance across your different widgets and pages to see what's working best for your store.
# Checkout A/B testing
Source: https://docs.aftersell.com/aftersell/checkout_a_b_testing
Learn how to set up, manage, and analyze A/B tests for your checkout widgets in Aftersell
# Checkout A/B Testing
A/B testing (also known as split testing) lets you compare two versions of a checkout widget to determine which performs better. A/B testing is currently only available for standalone widgets and is not yet supported for pages. Each version is shown to a portion of your checkout traffic, and performance is tracked separately so you can identify the higher-performing version.
By testing variations of your offers, you can improve conversion rates, increase revenue, and make data-driven decisions about your upsell strategy.
This page covers A/B testing for checkout widgets only. If you are looking to test your post-purchase offers, see [A/B Testing for Post-Purchase Offers](/aftersell/post_purchase_a_b_testing).
Checkout widgets are only available to Shopify Plus merchants due to Shopify's Checkout Extensibility API restrictions.
## How checkout A/B testing works
Standalone checkout widgets support two versions within a single block. When both versions are active, traffic is split 50/50 between them, labeled **Version A** and **Version B** in the analytics view. Each version is shown to a separate portion of customers, and their performance is tracked independently so you can compare results and identify a winner.
Each version has its own configuration and settings, making it possible to test meaningful differences between offers.
A/B testing is currently only available for standalone widgets. Pages do not support A/B testing yet.
### What you can test
A/B testing is supported on both **upsell widgets** and **content widgets**.
**Upsell widgets** - You can test:
* **Products**: Different products, product types, or recommendation strategies (specific product vs. AI recommendations vs. most expensive product)
* **Discounts**: Different discount amounts or types (percentage vs. fixed dollar)
* **Widget mode**: Single product upsell, multi-product upsell, or checkmark upsell
* **Triggers**: Since standalone widget triggers are configured at the version level, you can test different targeting conditions against each other
* **Blank (Skip)**: Use an empty version as a control to measure whether showing an upsell helps or hurts checkout conversion
**Content widgets** (trust badges, testimonials, cart controls, notes, text, images) - You can test:
* Different badge or testimonial content
* Different messaging or copy
* Showing vs. not showing a content widget (using Blank/Skip as a control)
## Test types
When adding a new version to a standalone widget, you choose one of three test types:
### Duplicate content
Duplicate content creates a new version that is a copy of an existing version. Use this when you want to test a small change - such as a different discount amount or a different product - while keeping everything else the same. Because the starting point is identical, any performance difference is more likely to be caused by the single change you made. This is the most common starting point for A/B tests because it minimizes variables and makes results easier to interpret.
### New content
New content creates a blank version that you configure from scratch. Use this when you want to test a fundamentally different offer - such as a different widget mode, a completely different product category, or a different trigger strategy. New content versions give you full flexibility but require more setup time. This type is best suited for broader tests where you want to compare two distinct approaches rather than a single incremental change.
### Blank (Skip)
Blank (Skip) creates an empty version that shows nothing to the customers it is assigned to. Use this as a control group to measure the baseline - what happens when no widget is shown at all. Comparing a Blank version against an active offer helps you understand whether your widget is helping or hurting checkout conversion. This is especially useful if you are concerned that showing a widget might increase checkout abandonment for certain customer segments.
## Setting up a checkout A/B test
### Step 1: Open or create a standalone widget
1. Open the Aftersell app from your Shopify Admin
2. Navigate to **Checkout** in the left sidebar
3. Scroll to the **Standalone widgets** section
4. Either open an existing standalone widget by clicking the pencil (edit) icon, or click **Create widget** to create a new one
### Step 2: Add a version
1. Inside the widget editor, add a new version
2. Choose one of the three test types: **Duplicate content**, **New content**, or **Blank (Skip)**
3. Configure the new version - set the product, discount, widget mode, and any other settings you want to test
### Step 3: Configure triggers for each version
1. Open each version and set its triggers
2. Triggers are configured at the version level for standalone widgets, so each version can target the same or different customer conditions
3. For a fair A/B test, set both versions to the same trigger conditions so they compete for the same audience
For a full list of available trigger options, see [Checkout Triggers](/aftersell/checkout_triggers).
### Step 4: Enable both versions
Ensure both versions are toggled to **active**. Inactive versions do not receive traffic - both must be active for the 50/50 split to take effect.
### Step 5: Verify placement in the Shopify Checkout editor
1. Open the Shopify Checkout editor from your Shopify Admin
2. Confirm the app block for this standalone widget is placed in your desired location
3. The widget will not display to customers until it has been placed
Your A/B test is now live.
## How traffic is split
Checkout A/B tests use a **50/50 split** between two active versions (Version A and Version B). Traffic is evenly distributed between the versions automatically and cannot be manually adjusted.
If one version is deactivated, all traffic goes to the remaining active version. To run a valid A/B test, both versions must be active at the same time.
## Managing your test
Once your A/B test is running, you can manage it at any time from within the widget editor.
### Pausing a version
Toggle a version to **inactive** to pause it. When a version is inactive, it no longer receives traffic. The remaining active version will receive all traffic. Use this if you need to temporarily stop showing a specific version without deleting it.
### Editing a version
Open the version and make your changes directly. For accurate results, avoid making significant changes to a version while the test is running, as this can make it harder to interpret what drove any performance differences.
### Deleting a version
Delete a version to permanently remove it from the widget. Once deleted, the version and its data cannot be recovered. All traffic will go to the remaining active version.
### Selecting a winner
When you are ready to end the test and commit to one version:
1. Identify the higher-performing version based on its analytics
2. Deactivate or delete the losing version
3. The winning version will now receive 100% of traffic
## Understanding your A/B test results
When an A/B test is running, you can view Version A and Version B performance by clicking the bar chart icon next to the widget on the Checkout dashboard. The metrics shown depend on the widget type - upsell widgets and content widgets show different metrics.
For a complete breakdown of all widget-level metrics, per-version analytics, and the Analytics tab Checkout graphs, see [Checkout Analytics](/aftersell/checkout_analytics).
## Limitations
### A/B testing is within the same widget type only
A/B testing in Aftersell compares two versions of the **same widget type**. For example, you can test two different trust badge configurations against each other, or test an upsell offer against Blank (Skip). You cannot A/B test across different widget types - for example, you cannot test a trust badge widget against an image widget in the same A/B test.
### A/B testing is not available for pages
A/B testing is currently only available for standalone widgets. Pages do not support A/B testing yet.
### Placement testing is not supported
You cannot A/B test different widget placements (for example, testing whether an upsell performs better in the order summary vs. above the payment section). A/B testing compares the content within a single widget in a fixed placement.
## Best practices
### Test one element at a time
When you change multiple elements at once, it becomes difficult to know which change drove the result. Isolate one variable per test for clear, actionable insights.
**Good**: Test 10% discount vs. 20% discount (one variable changed)
**Avoid**: Test 10% discount + Product A vs. 20% discount + Product B (two variables changed at once)
### Use Blank (Skip) as a control
Running a Blank (Skip) version against an active widget is one of the most valuable tests you can run. It tells you whether showing the widget at all is helping or hurting your checkout conversion rate. If the Blank version performs better on checkout completion, it may be worth reconsidering the offer entirely or adjusting your targeting.
### Monitor checkout abandonment
A higher upsell conversion rate is good, but make sure it is not coming at the cost of increased checkout abandonment. Check the **Checkout abandonment rate** in Analytics > Checkout tab regularly while running A/B tests. For content widgets, the per-version analytics view also includes a Checkout abandonment rate metric.
### Common test ideas
**Upsell widget tests**
* Specific product vs. AI recommendations vs. most expensive product
* Complementary product vs. same product (replenishment)
* 10% off vs. 20% off
* Percentage discount vs. fixed dollar amount
* Discount vs. no discount
* Single product upsell vs. checkmark upsell
* Multi-product upsell vs. single product upsell
* Active offer vs. Blank (Skip) to measure the net impact of showing an upsell
**Content widget tests**
* Trust badge with vs. without specific badges
* Different testimonial content
* Different note or text messaging
* Active content vs. Blank (Skip) to measure the impact of showing the content widget
## Need help?
If you have questions about setting up or analyzing your checkout A/B tests, chat with our support team using the live chat at the bottom right of the app.
# Checkout analytics
Source: https://docs.aftersell.com/aftersell/checkout_analytics
Understand your checkout upsell performance across the Checkout dashboard, Analytics tab, and widget-level metrics in Aftersell
This page covers all analytics related to checkout widgets in Aftersell, including the Analytics tab Checkout graphs, widget-level analytics by widget type, and per-version A/B test breakdowns. For post-purchase funnel and product page analytics, see [Post-Purchase Analytics](/aftersell/analytics_in_aftersell). For checkout A/B test setup and management, see [Checkout A/B Testing](/aftersell/checkout_a_b_testing).
Checkout widgets are only available to Shopify Plus stores due to Shopify's Checkout Extensibility API restrictions.
Analytics reflect data at the time of the transaction. If an order is later refunded, partially paid, or cancelled, the accepted offer count and associated revenue are not retroactively adjusted. An offer that was accepted will continue to count as an accepted offer in your analytics regardless of what happens to the order afterward. Keep this in mind when comparing analytics data to your actual payout or revenue reports.
***
## General Notes About Graphs
The large summary numbers at the top of each graph are weighted averages of the data shown. This method gives a more accurate overall view than a simple average. For example, three days of conversion rates are shown:
* **Day 1:** 3 accepted / 10 shown = 30%
* **Day 2:** 1 accepted / 9 shown = 11%
* **Day 3:** 5 accepted / 15 shown = 33%
The summary number is calculated as: `(3 + 1 + 5) ÷ (10 + 9 + 15) = 26.5%` not a simple average like `(30 + 11 + 33) ÷ 3 = 24.7%`. Weighted averages ensure that days with more impressions have the right impact on your totals.
Throughout the analytics dashboard, you can hover over the **ⓘ info icon** next to any metric to see how that value is calculated. The formulas listed in the tables below match the tooltip calculations shown in the dashboard.
***
## Checkout Dashboard
The Checkout dashboard is the main overview for all checkout widget performance. It is accessible from the **Checkout** section in the left sidebar of the Aftersell app. For a full breakdown of all Checkout dashboard sections, columns, and summary metrics, see [Checkout Dashboard Overview](/aftersell/checkout-dashboard-overview).
***
## Analytics Tab - Checkout Graphs
The Analytics section of the Aftersell dashboard includes a dedicated Checkout tab with graphs and metrics for your overall checkout performance.
### Filtering by Page
You can filter your checkout analytics by specific pages or widget types using the "Select a page" dropdown at the top of the Checkout tab. This allows you to analyze performance for:
* **Overall (pages + standalone widgets)** - Shows combined analytics for all checkout pages and standalone widgets. This is the default view.
* **Standalone widgets** - Shows analytics only for widgets that are not part of a checkout page.
* **Individual checkout pages** - Shows analytics for a specific checkout page by name.
When you select a page filter, all graphs and metrics on the Checkout tab update to show data only for that selection. This helps you understand which pages or widget configurations are performing best.
Inactive pages are labeled with "(Inactive)" in the dropdown but still show historical analytics data.
### Checkout Tab Metrics
| Metric | What it measures | Formula |
| ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------- |
| **Revenue** | The total checkout revenue generated by Aftersell upsell widgets. | `sum(upsell widget revenue)` |
| **Impressions** | The total number of times checkout upsell widgets were viewed. | `sum(widget views)` |
| **Upsell revenue per order** | The average upsell revenue per purchased order. This is the recommended way to measure performance over time for checkout widgets. | `checkout upsell revenue / purchased orders` |
| **Accepted upsell rate** | The percentage of unique visitors who accepted an upsell offer. | `(accepted offers / unique visitors) x 100` |
| **Unaccepted upsell rate** | The percentage of customers who initiated the checkout process but did not accept an upsell. | `(1 - (accepted offers / unique visitors)) x 100` |
| **Checkout abandonment rate** | The rate at which customers go to checkout without completing the order. This is measured separately from any offers shown. | `(1 - (purchased orders / unique visitors)) x 100` |
| **Total revenue per order** | The average total store revenue from purchased orders where Aftersell checkout widgets were placed on the checkout page. | `total store revenue / purchased orders` |
| **Accepted offers** | The total number of Aftersell upsell offers that were accepted. | `sum(accepted offers)` |
| **Average upsell value** | The average revenue per accepted upsell item. Particularly useful when using dynamic products in offers. | `upsell revenue / accepted offers` |
| **Product profit** | The total product profit generated by Aftersell. Calculated by subtracting the cost of goods sold from the revenue. | `sum(upsell revenue) - sum(cost of goods sold)` |
| **Product profit per order** | The average product profit per purchased order. Similar to revenue per order but accounts for cost of goods sold. | `product profit / purchased orders` |
| **Product profit margin** | The ratio of product profit to revenue. If your products had no costs, this would be 100%. | `(product profit / revenue) x 100` |
Upsell revenue per order is the recommended metric for measuring checkout widget performance over time.
### Top Performing Products Table
This table highlights checkout upsells and the revenue generated from them. It works the same way as the one in the Funnels tab, but only includes checkout upsells.
The conversion rate in this table is based on the number of accepted offers, not the number of individual product units sold. For example, if a customer accepts one offer containing 3 units of a product, it counts as 1 accepted offer. However, the revenue column reflects the total value of all units purchased through that offer.
To view this table, go to the **Analytics** section in your Aftersell dashboard, click on the **Checkout** tab, and scroll to the **Top Performing Products** section.
***
## Widget-Level Analytics
You can view analytics for individual widgets by clicking the bar chart icon next to any widget on the Checkout dashboard. The metrics shown depend on the widget type.
### Pages
Pages are groups of related widgets with a shared trigger. Click the bar chart icon next to a page on the Checkout dashboard to view its analytics.
| Metric | What it measures | Formula |
| ---------------------------- | ------------------------------------------------------------------------- | ---------------------------------------- |
| **Sessions with page** | The number of unique checkout sessions where this page was displayed. | `sum(widget views)` |
| **Cart conversion rate** | The percentage of sessions that resulted in a completed purchase. | `(purchased orders / impressions) x 100` |
| **Average order value** | The average total order value for sessions where this page was displayed. | `total store revenue / purchased orders` |
| **Upsell revenue per order** | The average upsell revenue per purchased order. | `upsell revenue / purchased orders` |
### Standalone Upsell Widgets
Upsell widgets display product offers that customers can accept during checkout. Click the bar chart icon next to an upsell widget on the Checkout dashboard to view its analytics.
| Metric | What it measures | Formula |
| ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------- |
| **Upsell revenue per order** | The average upsell revenue per purchased order. | `upsell revenue / purchased orders` |
| **Sessions with widget** | The number of unique checkout sessions where this widget was displayed. If a customer views a page multiple times on a single order, it is counted as one session. | `sum(widget views)` |
| **Upsell conversion rate** | The percentage of purchased orders that accepted an upsell from this widget. An order that accepts upsells across multiple widget placements is counted once per placement, so this rate can exceed 100%. | `(orders with upsells / purchased orders) x 100` |
| **Orders with upsells** | The sum of widget placements per order where at least one upsell was accepted. An order that accepts upsells in two placements contributes twice; multiple offers accepted within one placement count once. | `sum(placements per order with at least 1 accepted offer)` |
| **Purchased orders** | The number of purchased orders where this widget was displayed. This is the denominator used by the upsell conversion rate and per-order revenue metrics. | `sum(purchased orders)` |
When an A/B test is running on an upsell widget, these same 4 metrics are split to show **Version A** and **Version B** separately, allowing direct comparison between versions. A/B test results are only available at the widget level and are not shown in the general Analytics tab. For setup instructions, see [Checkout A/B Testing](/aftersell/checkout_a_b_testing).
### Standalone Content Widgets
Content widgets include trust badges, testimonials, cart controls, notes, text, and images. These widgets do not offer upsell products but can influence checkout behavior. Click the bar chart icon next to a content widget on the Checkout dashboard to view its analytics.
| Metric | What it measures | Formula |
| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------- |
| **Sessions with widget** | The number of unique checkout sessions where this widget was displayed. If a customer views a page multiple times on a single order, it is counted as one session. | `sum(widget views)` |
| **Cart conversion rate** | The percentage of sessions that resulted in a completed purchase. | `(purchased orders / impressions) x 100` |
| **Average order value** | The average total order value for sessions where this widget was displayed. | `total store revenue / purchased orders` |
| **Checkout abandonment rate** | The percentage of sessions that did not complete their purchase. | `(1 - purchased orders / impressions) x 100` |
When an A/B test is running on a content widget, these same 4 metrics are split to show **Version A** and **Version B** separately, allowing direct comparison between versions.
### Why Widget Analytics May Show Zero Values
If you see 0% conversion, \$0 revenue, and 0 orders for a widget or a specific version, this does not mean the data is missing or broken. It means no customer has completed the relevant action through that widget or version yet.
This is normal in the following situations:
* The widget was recently created and has not yet received enough traffic
* The widget's triggers are not matching any customers in the current date range
* The widget or variant is newly active and sessions are still accumulating
* For A/B tests, it is normal for the widget to show overall metrics while the per-version view still shows zeros, especially if the test was recently started
Give the widget time to accumulate sessions before drawing conclusions.
***
**Want to go further?**
* [Checkout A/B Testing](/aftersell/checkout_a_b_testing) - set up and manage A/B tests for your checkout widgets
* [Checkout Dashboard Overview](/aftersell/checkout-dashboard-overview) - full breakdown of the Checkout dashboard
# Checkout best practices
Source: https://docs.aftersell.com/aftersell/checkout_best_practices
A complete strategy guide for configuring, optimizing, and testing your checkout widgets in Aftersell
# Checkout best practices
This guide covers how to get the most out of Aftersell's checkout widgets on Shopify Plus -- from choosing between Pages and Standalone widgets, to configuring upsells, trust badges, rewards, and testimonials, to running A/B tests and avoiding common setup mistakes.
Checkout widgets are only available to Shopify Plus merchants due to Shopify's Checkout Extensibility API restrictions. For post-purchase upsell best practices, see [Post-Purchase Best Practices](/aftersell/best_practices).
***
## Choose the right widget structure
Aftersell offers two ways to add widgets to your checkout: **Pages** and **Standalone widgets**. Choosing the right structure upfront saves time and avoids conflicts later.
### When to use Pages
A [Page](/aftersell/pages-vs-standalone-widgets) is a group of widgets that share a single set of triggers. When the trigger conditions are met, all widgets in the page display together. Use Pages when you want to show a coordinated set of widgets to the same audience -- for example, an upsell, trust badges, and testimonials all appearing together for a specific customer segment.
Pages support a guided setup that recommends widgets based on a goal you select:
* **Increase AOV and conversion rate** - Upsells, Trust Badges, Testimonials
* **Build customer trust and reduce abandonment** - Trust Badges, Cart Controls, Text
* **Promote add-ons and accessories** - Checkbox Upsells, Images, Testimonials
* **Encourage customers to reach free shipping threshold** - Upsells (with Rewards), Text
Your goal cannot be changed after saving. If you need a different goal, you will need to delete the page and create a new one. Widgets can be added to or removed from a page at any time.
### When to use Standalone widgets
[Standalone widgets](/aftersell/pages-vs-standalone-widgets) function independently, each with their own triggers and priority configured at the variant level. Use Standalone widgets when you need a single widget that runs on its own, or when you need different trigger conditions for different widgets.
Standalone widgets also support A/B testing (Pages do not support A/B testing yet), so use Standalone if testing is part of your strategy.
### Block limits
Pages allow up to 5 blocks per widget type. Standalone widgets allow a maximum of 3 blocks per widget type. Once all blocks are in use, you cannot create additional widgets of the same type until an existing block is removed.
***
## Upsell widget strategy
Checkout upsells are your primary revenue driver at this stage. The goal is to increase AOV without increasing checkout abandonment.
### Choose the right upsell mode
Aftersell offers three upsell widget modes:
* **Single Product Upsell** - Show one product with an Add to Cart button. Best for focused, high-confidence offers where you know exactly what the customer is likely to want.
* **Multi-Product Upsell** - Show multiple products in a stack or carousel layout. Customers can accept multiple offers. Best for stores with a wide catalog where you want to give customers options.
* **Checkmark Upsell** - Show a single product with a checkbox instead of an Add to Cart button. Best for low-cost add-ons like shipping protection, gift wrapping, or rush processing where the decision is simple and fast. Note: the checkbox cannot be pre-checked or auto-added to the order by default. Shopify does not allow this. The customer must actively check the box to add the product.
### Choose the right product selection method
Each upsell widget supports several product selection methods. Choose based on your catalog and strategy:
* **Specific Products** - Manually select individual products to upsell. Use when you want full control over exactly what appears, such as during a seasonal promotion or for curated pairings.
* **Collection** - Select a collection and display up to 5 random products from it. Products already in the cart are automatically excluded. Use when you want variety within a curated set without manually managing individual products.
* **AI Recommendations** - Let Aftersell automatically recommend products based on the customer's cart contents. Use when you have a large catalog and want personalized recommendations without manual curation.
* **Most Expensive Product** - Automatically upsell the most expensive product from the customer's cart. Use for cross-sell scenarios where re-offering the hero item makes sense.
* **Spend Threshold** - Recommend products that help customers reach a free shipping threshold (requires the rewards widget to be enabled). Use alongside the rewards bar to close the gap between the customer's current cart value and the free shipping goal.
### Always add a discount to your checkout upsells
We strongly recommend adding a discount to every checkout upsell widget. A discount gives customers an immediate incentive to add the product to their order and significantly increases acceptance rates. Even a small discount signals value and can be the difference between a customer engaging with the offer or ignoring it.
Discounts are configured directly within the Aftersell upsell widget and are automatically applied when the customer adds the upsell product to their order. You can either select an existing Aftersell checkout discount or create a new one (percentage or fixed dollar) right in the widget editor. See [Checkout Widget Types](/aftersell/checkout_widget_types) for full details on discount configuration.
Keep in mind:
* Shopify only allows one line-item discount per product at a time. If a product already has a discount applied, the Aftersell upsell discount will not stack on the same line item.
* For two discounts to combine, both must be explicitly set to "combinable" in Shopify Admin.
* If another app is dynamically modifying your checkout (for example, recalculating pricing), Aftersell discounts may not apply as expected.
### Enable product review stars
If you have a compatible review app installed, enable product review star ratings on your upsell widgets. Review ratings build trust and increase the likelihood a customer will accept the offer. You can set a minimum rating threshold (default 4.0) so only well-reviewed products display stars.
Supported review apps include Shopify Product Reviews, Judge.me, Okendo, Loox, Stamped, and others that store ratings in product metafields. See [Checkout Widget Types](/aftersell/checkout_widget_types) for the full list.
***
## Content widgets that increase conversion
Content widgets do not directly offer products, but they reduce checkout abandonment and build trust, which increases overall conversion.
### Trust badges
[Trust badges](/aftersell/checkout_widget_types) highlight security features, guarantees, and shipping benefits. They can be stacked vertically or displayed horizontally.
Effective trust badge content includes:
* Secure checkout / SSL encryption
* Money-back guarantee or satisfaction guarantee
* Free returns or easy exchanges
* Free or fast shipping
* Customer count or order count ("Trusted by 50,000+ customers")
Keep badges concise and use recognizable icons. Place them near the payment section where customers are most likely to hesitate.
### Testimonials
[Flex Testimonials](/aftersell/checkout_widget_types) pull real reviews from your review app (Judge.me, Klaviyo, Okendo, or Yotpo) and display them directly on checkout. Testimonials automatically fetch reviews based on products in the customer's cart, so each customer sees reviews relevant to what they are buying.
Reviews sync automatically within 24 hours of setup, then weekly. To import reviews immediately, go to Settings > Product Reviews and click Sync now.
Set a minimum rating filter (for example, 4.0) and use the truncate option to keep long reviews clean. A "Read more" button appears automatically for reviews that exceed your character limit.
### Rewards bar
The [rewards bar](/aftersell/checkout_widget_types) shows customers how close they are to earning free shipping. This creates a natural incentive to add more products to their order.
To get the most out of the rewards bar:
1. Set a goal based on **Order Value** or **Item Count**
2. Pair it with an upsell widget using the **Spend Threshold** product type, which automatically recommends products that help customers close the gap to the free shipping threshold
3. Create the free shipping reward in Shopify by modifying your **Shipping Rules** to offer free shipping at the target order value
The rewards bar and spend threshold upsell work best as a pair - the bar creates the motivation, and the upsell provides the product to get there.
### Cart controls
[Cart controls](/aftersell/checkout_widget_types) let customers modify their cart directly on the checkout page -- changing variants, adjusting quantities, removing items, or upgrading to a subscription. This reduces friction and can prevent abandonment from customers who would otherwise leave checkout to make changes.
You can target which products display cart controls using the visibility settings: all products, only selected products, or all products except selected ones. This lets you enable subscription upgrades only on eligible products, for example, without exposing unnecessary controls on other items.
***
## Triggers
[Triggers](/aftersell/checkout_triggers) let you control which customers see which widgets. Using triggers effectively means the right customers see the right offers at the right time.
The full set of available checkout triggers:
* **Products:** Specific products, specific collections, quantity of specific product
* **Cart:** Subtotal, quantity, subscription purchase
* **Discount:** Applied discount titles, discount value
* **Customer:** Shipping country, customer language, customer tags, device type
* **Advanced:** Group of triggers (combine multiple triggers for complex logic)
### Start with a "Show to all" baseline
Before building complex trigger logic, set up your primary widgets to show to all customers. This ensures every checkout session sees your offers and gives you a baseline to measure against before you start segmenting.
### Segment with product and cart triggers
The most impactful triggers for upsells:
* **Specific products or collections** -- Show a complementary upsell when a specific product or collection is in the cart
* **Quantity of specific product** -- Show a widget only when a customer has a certain quantity of a specific product (for example, show a volume discount upsell when a customer has 2 or more of a product)
* **Cart subtotal** -- Show a rewards bar or upsell only when the cart value is within range of a threshold (for example, show the rewards bar when the subtotal is between $40 and $75 if free shipping starts at \$75)
* **Cart quantity** -- Show or hide widgets based on how many items are in the cart
* **Subscription purchase** -- Show or hide widgets based on whether any item in the cart is a subscription
### Use customer triggers for personalization
* **Shipping country** -- Show different content or offers based on the customer's shipping destination
* **Customer language** -- Display translated widgets to customers whose locale matches a specific language. Set the trigger to "is French" and translate all editable fields to French within the widget
* **Customer tags** -- Target customers based on Shopify customer tags. Use this for VIP customers, loyalty tiers, wholesale accounts, or any other customer segmentation you have set up in Shopify
* **Device type** -- Show or hide widgets based on whether the customer is on mobile or desktop. This is especially important for placement strategy (see the mobile checkout behavior section below)
### Combine triggers with advanced logic
Use the **Group of triggers** option to combine multiple conditions. For example, show a specific upsell only when the cart contains Product X AND the subtotal is above \$50. This prevents irrelevant offers from appearing and improves the customer experience.
***
## Placement and branding
### Place widgets thoughtfully
Where you place your widget in the checkout affects how likely customers are to see and interact with it. General guidelines:
* **Upsells** -- Place above the payment section where customers are actively reviewing their order. Avoid placing upsells inside the order summary section (see mobile note below).
* **Trust badges** -- Place near the payment section where hesitation is highest.
* **Rewards bar** -- Place near the top of the checkout so customers see the incentive early and have time to act on it.
* **Testimonials** -- Place below the upsell for social proof reinforcement, or near the payment section.
### Be aware of mobile checkout behavior
On mobile, Shopify collapses the order summary section into a dropdown that is hidden by default. Any widgets placed inside the order summary area will be hidden under that dropdown and most customers will not see them. This is Shopify's default behavior and Aftersell has no control over it.
For widgets you want every customer to see (especially upsells and rewards bars), place them outside the order summary section so they are visible on both desktop and mobile without requiring the customer to expand anything.
Use the **device type** trigger to create separate widget configurations for mobile and desktop. For example, you might show a streamlined single-product upsell on mobile (where screen space is limited) and a multi-product carousel on desktop. Or you might place a widget in the order summary for desktop users (where it is always visible) and use a separate widget outside the order summary for mobile users.
If your upsell widget is placed in the order summary and you are seeing low impressions on mobile, this is likely the cause. Move the widget to a section outside the order summary, or use the device type trigger to show a differently placed widget to mobile customers.
After placing widgets in the Shopify Checkout Editor, check the "Include app block in Shop Pay" option if you want your widgets to display in Shop Pay checkout as well. See [Shop Pay Widgets](/aftersell/show_checkout_widgets_in_shop_pay) for setup details.
### Match your checkout to your storefront
A checkout that looks visually different from your storefront can erode trust and increase abandonment. Use the [Checkout Branding Settings](/aftersell/checkout_branding_settings) to match your checkout's button colors, corner radius, and body colors to your store's design. Pay particular attention to the primary button styling -- this is the most visible element in the checkout and should feel consistent with your storefront's CTA buttons.
***
## A/B testing
A/B testing is the most effective way to improve checkout widget performance. See the full [Checkout A/B Testing](/aftersell/checkout_a_b_testing) guide for setup instructions.
### Key concepts
* A/B testing is currently available for **Standalone widgets only** (Pages do not support A/B testing yet)
* Each widget supports **two versions** (Version A and Version B) with an automatic **50/50 traffic split**
* Testing compares **content within a single widget** - you cannot test across different widget types or different placements
* Use **Version A** and **Version B** terminology (not "Layout" - that is post-purchase terminology)
### Most valuable tests to run
**Upsell widget tests:**
* Specific product vs. AI recommendations vs. most expensive product
* Complementary product vs. same product
* Percentage discount vs. fixed dollar discount
* Discount vs. no discount
* Single product upsell vs. checkmark upsell
* Active offer vs. Blank (Skip) to measure whether showing the upsell helps or hurts overall checkout conversion
**Content widget tests:**
* Trust badges with vs. without specific badges
* Different testimonial selections
* Active content vs. Blank (Skip) to measure the impact of showing the widget
### Test one variable at a time
When you change multiple elements at once, you cannot tell which change drove the result. Keep tests clean:
* Good: 10% discount vs. 20% discount (one variable)
* Avoid: 10% discount + Product A vs. 20% discount + Product B (two variables)
### Use Blank (Skip) as a control
This is one of the most valuable tests you can run. A Blank version shows nothing to the customers it is assigned to, giving you a true baseline. If the Blank version results in a higher checkout completion rate, the widget may be hurting conversion and needs to be reconsidered.
### Monitor checkout abandonment alongside upsell conversion
A higher upsell acceptance rate means nothing if checkout abandonment is increasing at the same time. Track the **Checkout abandonment rate** in Analytics > Checkout tab while running A/B tests. For content widgets, per-version analytics also include a Checkout abandonment rate metric.
### Use upsell revenue per order as your primary metric
**Upsell revenue per order** (checkout upsell revenue / purchased orders) is the recommended metric for measuring checkout widget performance over time. It accounts for both upsell acceptance and overall order completion, giving you a complete picture.
***
## Common mistakes
❌ **Placement mismatch between Aftersell and Shopify** - the placement selected in the Shopify Checkout Editor must match the placement set in Aftersell (for example, Default placement, Additional placement 1, Additional placement 2). If they do not match, the widget will not appear or will display in the wrong location. This is one of the most common reasons a widget fails to display.
[Fix it →](/aftersell/how_to_configure_checkout_widgets)
❌ **Widget not enabled in Aftersell** - creating and placing a widget is not enough. You must also enable the widget using the toggle in the top right corner of the widget settings in the Aftersell admin. If the toggle is off, the widget will not display regardless of placement.
[Fix it →](/aftersell/how_to_configure_checkout_widgets)
❌ **Missing Shop Pay app block setting** - if you want checkout widgets to display in Shop Pay checkout, you must check the "Include app block in Shop Pay" option in the Shopify Checkout Editor for each widget. This is off by default.
[Fix it →](/aftersell/show_checkout_widgets_in_shop_pay)
❌ **No "Show to all" baseline** - jumping straight into complex trigger logic without first establishing a baseline that shows widgets to all customers. Start with "Show to all" so you have performance data, then segment with triggers based on what you learn.
[Fix it →](/aftersell/checkout_triggers)
❌ **Stacking discounts that do not combine** - Aftersell upsell discounts follow Shopify's standard discount rules. If a product already has a discount and neither discount is set to "combinable" in Shopify Admin, the Aftersell discount will not apply. Check your Shopify discount combination settings before assuming a discount is broken.
[Fix it →](/aftersell/checkout_widget_types)
❌ **No rewards bar alongside upsells** - running upsell widgets without a rewards bar misses the opportunity to give customers a reason to add more. Pair the rewards bar with the spend threshold product type in your upsell widget so the upsell directly helps customers reach the free shipping threshold.
[Fix it →](/aftersell/checkout_widget_types)
❌ **Not testing with Blank (Skip)** - most merchants test different offers against each other but never test whether showing a widget at all is helping. Use Blank (Skip) as a control to measure whether a widget is increasing or decreasing checkout completion.
[Fix it →](/aftersell/checkout_a_b_testing)
❌ **Running only one A/B test version** - for a Standalone widget A/B test to work, both versions must be active at the same time. If one version is deactivated, all traffic goes to the remaining version and no comparison data is collected.
[Fix it →](/aftersell/checkout_a_b_testing)
***
## Need help?
If you have questions about configuring or optimizing your checkout widgets, chat with our support team using the live chat at the bottom right of the app.
# Checkout branding settings
Source: https://docs.aftersell.com/aftersell/checkout_branding_settings
This article walks you through the Checkout Branding Settings and how to use each feature to customize your checkout.
The branding settings allow you to customize the look and feel of your checkout experience, from colors and buttons to headers and field layouts. These tools make it easy to align your checkout design with your brand identity.
# How to Access It
You can access the settings by clicking on "Edit Branding" at the top of your Checkout Editor:
***
# Design System
## Color Palette
This section allows you to adjust the colors used across your checkout, including backgrounds, buttons, and text. You can modify the following areas:
* **Primary Buttons** - Controls the color of main action buttons (e.g., “Pay Now” or “Add”).
* **Interactive** - Controls elements customers can interact with, such as links and input fields.
* **Main Body** - Sets the color for the **left side** of the checkout page.
* **Secondary Body** - Sets the color for the **right side** (order summary section).
* **Loading Screens** – Defines the color displayed when customers perform an action that triggers a loading screen.
* **Critical** – Controls the color of error messages or alerts displayed during checkout.
## Variables
This section allows you to control the **corner radius** of elements throughout your checkout. The corner radius is essentially how rounded the corners appear.
You can adjust the radius for:
* **Small elements** (ex. checkboxes)
* **Medium elements** (ex. text or input fields)
* **Large elements** (ex. buttons or cards)
***
# Customizations
## Buttons
This sections allows you to customize additional styling options for your primary and secondary buttons beyond color:
* **Variables** – Define whether the button uses the small, medium, or large radius setting in the Variables section
* **Background** – Choose between a solid color background or a transparent one.
* **Border** – Enable or disable a border around the button.
* **Horizontal & Vertical Padding** – Adjust the spacing around buttons.
* *Horizontal* = left and right spacing
* *Vertical* = top and bottom spacing
## Fields
This section allows you to control the styling of all form fields, including text inputs, dropdowns, and checkboxes:
* **Variables** – Assign the field size (small, medium, or large) in the Variables section.
* **Border** – Toggle borders on or off.
* **Label Position** – Choose whether the field label appears inside or above the input.
* **Corner Radius** – Adjust how rounded the field corners appear.
## **Header**
In this section, you can customize the position and alignment of your checkout header:
* Position the header on the left or right side of the page.
* Align the header text to the left, center, or right.
## Order Summary
This section gives you control over the look of product images in the order summary:
* Add or remove an image **border**.
* Adjust the **corner radius** to make image corners more rounded or square.
***
# Coming Soon
We have additional customization options coming soon, including:
* **Typography** – Control font styles and weights.
* **Main & Global Settings** – Expanded options for overall design consistency.
More details will be available when these features launch.
# Checkout customization limitations
Source: https://docs.aftersell.com/aftersell/checkout_customization_limitations
This article outlines notable limitations regarding checkout customizations
The Shopify API's used in Aftersell's checkout customization feature come with [some limitations](https://shopify.dev/docs/api/functions/reference/payment-customization#limitations-and-considerations). We aim to detail those here to prepare you for its usage. Additionally, it's important to note that these limitations extend beyond payment customizations and also include restrictions related to price displays on checkout and cart buttons.
# Payment Customization Limitations
## Payment method naming
The "Credit Card" payment option seen on the checkout page is actually called "Shopify Payments" for the purposes of the API. This can be confusing, but keep this in mind when targeting this payment method for any sort of customization.
For example, when ordering items alphabetically, the "Credit Card" option will be ordered by its true name of "Shopify Payments", meaning it may appear closer to the bottom of the list.
## Renaming
You can't rename payment methods that have logos as a name, such as Shop Pay, Apple Pay and Google Pay. This includes all wallets.
## Reordering
You can remove wallets from the Express section of checkout, but you can't reorder them.
## Draft Orders
Payment customizations are not currently supported in draft orders.
# Checkout customizations
Source: https://docs.aftersell.com/aftersell/checkout_customizations
This article outlines customizable actions for configuring payment and delivery methods.
Checkout customizations allow you to adjust delivery and payment methods to better meet customer needs and enhance the customers' shopping experience.
[Payment Methods](#payment-methods)
[Delivery Methods](#delivery-methods)
[Actions](#actions)
[Trigger condition](#trigger-condition)
## Payment Methods
You can set payment method customization(s) to show tailored payment options to customers when they finalize their purchase.
## Delivery Methods
You can set delivery method customization(s) to show tailored delivery options to customers when they finalize their purchase.
***
## Actions
You can set three actions for Checkout customizations:
1. **Rename:**
* To rename a payment/delivery method, select "Add Method" and choose a logic such as "**is**".
For example, if the payment method is labeled as "bank deposit", you can specify the desired renaming, such as changing it to "BD".
2. **Move:**
* To reorder payment/delivery methods, choose from options like sorting alphabetically or in reverse, setting a method to the top based on conditions like "**contains**", "**does not contain**", or "**is not**". Alternatively, you can manually arrange them by selecting "set manually" and adding payment/delivery methods in your preferred order.
3. **Hide:**
* To hide a payment/delivery method, you can set conditions such as:
If the method is
If the method contains
If the method does not contain
If the method is not
For example, you might specify "payment method is bank deposit" to hide it. This action ensures that the selected payment method will not appear in the checkout options.
Note: You can add more than one customization, by clicking on **Add new action**.
***
## Trigger condition
You can also define specific trigger conditions under which these customizations will be applied:
# Checkout translations
Source: https://docs.aftersell.com/aftersell/checkout_translations
Customize the system text shown in your checkout widgets for each language using the Checkout Translations section in Settings.
Aftersell automatically translates system text in your checkout widgets (upsells, cart controls, and testimonials) based on the customer's language. You can override any of these default translations per language from **Settings > Translations**.
***
## How checkout translations work
When a customer reaches checkout, Aftersell detects their language and applies the appropriate translations to all system-generated strings in your checkout widgets. These include labels like "Adding...", "Sold Out", "Remove", and "Read more".
The **Checkout translations** section in **Settings > Translations** lets you override the default translated strings for any supported language. Your overrides apply on top of the bundled defaults — if you leave a field blank, the default translation is used. If you clear a field entirely, that label is hidden for customers in that language.
***
## Supported languages
Checkout translations currently support 33 languages:
Arabic, Bulgarian, Chinese, Croatian, Czech, Danish, Dutch, English, Estonian, Finnish, French, German, Greek, Hebrew, Hungarian, Italian, Japanese, Korean, Latvian, Lithuanian, Norwegian, Norwegian Bokmål, Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovenian, Spanish, Swedish, Turkish, and Ukrainian.
***
## Customizing checkout translations
1. Go to **Settings**
2. Select **Translations**
3. Scroll to the **Checkout translations** section
4. Choose a language from the language dropdown
5. Update any fields you want to override for that language
6. Click **Save**
Your overrides are saved alongside your post-purchase translations in a single save action.
To reset all fields for a language back to the bundled defaults, click **Reset defaults**.
***
## Available fields
The following strings are available for customization. Sensitive strings (such as commerce CTAs, savings claims, and "Verified buyer") are system-managed and cannot be overridden.
### Upsell widget
| Field | Description |
| ------------------------------ | ------------------------------------------------------------------------------------------------------ |
| Adding (loading state) | Text shown while a product is being added to the cart |
| Removing (loading state) | Text shown while a product is being removed |
| Sold out badge | Label shown when a product is out of stock |
| Quantity (upsell label) | Quantity selector label on upsell widgets |
| Purchase option (upsell label) | Label for the purchase option selector |
| One-time purchase (upsell) | Label for the one-time purchase option |
| Upsell error message | Message shown when adding or removing a product fails |
| Review count label | Label for review counts — use `{{count}}` as a placeholder for the number (e.g. `({{count}} reviews)`) |
### Cart controls widget
| Field | Description |
| ---------------------------------- | ------------------------------------------------------- |
| Remove (cart action) | Text for the remove item action |
| Modify (cart action) | Text for the modify item action |
| Variant (cart label) | Label for the variant selector |
| Quantity (cart label) | Label for the quantity selector |
| One time purchase (cart) | Label for the one-time purchase option in cart controls |
| Subscription (cart label) | Label for the subscription option |
| Discount calculating (cart status) | Status text shown while a discount is being calculated |
| Retry (cart action link) | Link text shown when a discount calculation fails |
### Testimonials widget
| Field | Description |
| ------------------------ | --------------------------------------------- |
| Read more (testimonials) | Text for the "Read more" link on testimonials |
***
## Blank field behavior
Leaving a field blank uses the default translation for that language. Clearing a field that previously had a value (saving it as empty) hides that label entirely for customers in that language. This is intentionally different from post-purchase translation behavior and is useful if you want to suppress a specific label for a given language.
***
## Need help?
If you have questions about checkout translations or need help configuring them, reach out through the in-app chat or by email.
# Checkout triggers
Source: https://docs.aftersell.com/aftersell/checkout_triggers
This article explains how to create and manage triggers and the underlying logic, so you can understand what customers will see.
Triggers enable you to segment your customers and display a customized set of widgets for each of them. By using triggers, you can design more precise and personalized widgets:
* [Products](#products)
* [Cart](#cart)
* [Discount](#discount)
* [Customer](#customer)
* [Advanced](#advanced)
***
### **Products**
The Product Trigger works by displaying the widget only if the customer has purchased a specific product.
* Specific products:
Use this option for individual products or variants. Select the products you want to trigger the widget. When a customer purchases any of these products, the widget will appear.
* Specific collections:
This option works when any item in the cart belongs a specific collection. Select the collection you want to trigger the widget. When a customer purchases any item from the collection, the widget will appear.
* You can set the product/collection trigger to show for all customers or conditionally based on the following criteria:
1. Contains at least one of:
Shows the widget if the cart contains at least one of the selected products/collections.
2. Does not contain any of:
Shows the widget if the cart does not contain any of the selected products/collections.
* Quantity of specific product:
For example, 2 or more of a specific product
Set the trigger to show the widget if a customer purchases two or more of a specific product.
* Product tag:
Shows the widget if any product in the cart has one of the specified Shopify tags. Tag matching is case-insensitive.
For example, set the trigger to include the tag `summer-collection` to show the widget only when a tagged product is in the cart.
* Product type:
Shows the widget if any product in the cart belongs to one of the specified product types.
For example, set the trigger to include `Apparel` to show the widget only when an apparel product is in the cart.
* Variant name:
Shows the widget if any cart variant title matches one of the specified strings. Matching is case-insensitive.
For example, set the trigger to include `Large` to show the widget only when a large-size variant is in the cart.
* Product metafield:
Shows the widget if any product in the cart has a metafield (identified by namespace and key) whose value matches the specified condition (equals or contains).
> **Note:** Metafield values are evaluated at the time the widget is displayed, not at order placement. If a customer removes the matching product and adds a different product after the widget loads, the widget may still appear.
* Variant metafield:
Shows the widget if any variant in the cart has a metafield (identified by namespace and key) whose value matches the specified condition (equals or contains).
> **Note:** Same evaluation timing applies as with product metafields above.
***
### **Cart**
* Subtotal:
The combined value of all items before discounts, tax, and shipping.
* Quantity:
The total number of items in the cart. You can set this trigger to show the widget when the cart quantity is greater than, less than, or exactly equal to a specified number.
* Subscription purchase:
Indicates if any item in the cart is a subscription.
* Cart attribute:
Shows the widget based on a cart-level attribute key and value (equals or contains). This is useful for targeting customers based on data set by other apps or integrations (for example, loyalty status set by a third-party app).
> **Note:** Only one distinct cart attribute key can be used across all active checkout widgets. If another widget already uses a cart attribute trigger with a different key, you must use the same key or update the other widget. The same key can be reused across multiple widgets with different values.
***
### **Discount**
* Applied discount titles:
Verify if a specific discount is applied during checkout
* Discount value:
Track the total sum of discounts applied at checkout
***
### **Customer**
* Shipping country:
Target specific shipping destinations
* Customer language:
Display personalized content based on the customer's language.
For example, show French content exclusively to French-speaking customers.
You can set the customer language trigger to "**is French**" and translate all editable fields in the widget to French.
***
### **Advanced**
* Group of triggers:
Combine multiple triggers for complex logic
For example, show a widget if a customer has both product X and product Y in their cart.
You can set the product trigger condition to contain both product X and product Y, so the widget will appear accordingly.
# Checkout widget types
Source: https://docs.aftersell.com/aftersell/checkout_widget_types
This document covers various checkout widgets you can add with Aftersell to enhance your Shopify Plus checkout experience
There are a variety of checkout widget options to select from. In this article, we will walk through the different widget options, what they do, and available customizations:
* [Upsells](#upsells)
* [Cart Controls](#cart-controls)
* [Rewards](#rewards)
* [Trust Badges](#trust-badges)
* [Testimonials](#testimonials)
* [Notes](#notes)
* [Images](#images)
* [Text](#text)
***
## Upsells
Offer products to your customers during checkout to **help increase your AOV.**
Upsell Widgets have a few different configurations to select from.
* **Single Product Upsell:** Offer one product to your customer.
* **Multi-Product Upsell:** Show multiple products in either a stack or carousel layout. Allow customers to accept multiple offers.
* **Checkmark Upsell:** Upsell a single product with a checkbox instead of an Add to Cart button. This is commonly used for cheaper add-ons such as shipping protection or first in line shipping.
### Product selection options
When creating upsell offers, you can choose how products are selected:
* **Specific Products:** Manually select individual products to upsell.
* **Collection:** Select a collection and choose up to 5 random products from that collection to display. Products already in the cart are automatically excluded.
* **AI Recommendations:** Let Aftersell automatically recommend products based on the customer's cart contents.
* **Most Expensive Product:** Automatically upsell the most expensive product from the customer's cart.
When browsing the **Products** tab in the product picker, you can check **Active products only** to hide Draft and Archived products from the list. This filter is off by default and only applies to the Products tab — Collections are not affected.
### Product types
When adding products to your upsell widget, you can choose from several product types:
* **Specific product** - Select a particular product from your store to display
* **Automatic upsell** - Uses Shopify's AI to recommend complementary products based on cart contents
* **Most expensive product** - Shows the most expensive item from the customer's cart
* **Spend threshold** - Intelligently recommends products to help customers reach reward thresholds (requires rewards bar to be enabled)
* **Collection** - Display products from a specific collection
The **spend threshold** product type works with your rewards bar to suggest products that help customers reach goals like free shipping or discounts. It automatically selects the most relevant product based on how close the customer is to the threshold.
### Variant name display
When a customer selects a variant for a checkout upsell product, the variant name appears as small subdued text below the product title. This helps customers confirm they are adding the correct variant to their order.
The variant name only appears when the product has multiple variants — it is hidden for single-variant products (those with only a "Default Title" variant).
### Subscription plan locking
* When you hide a variant option, customers won't see it in the checkout upsell.
* The default value you select is automatically applied to the product.
* Only variants matching your selected default values will be available to customers.
* If you hide multiple options, only variants matching all selected defaults will be shown. When creating upsells for subscription products, you can lock the upsell to a specific subscription plan. This prevents customers from changing the subscription plan at checkout, ensuring they receive the exact subscription option you've configured.
**How to configure subscription plan locking:**
1. Open your upsell widget in the Checkout editor.
2. Set the **Purchase option** to **Subscription**.
3. In the **Subscription plan** dropdown, select a specific plan instead of "Any plan (customer chooses)".
4. The plan is now locked - customers will see this plan at checkout but cannot change it.
**Customizing the locked plan display:**
* Hide the Color option and set the default to "Black"
* Keep the Size option visible
* Customers will only see size options for the black t-shirt
When a plan is locked, you can customize how it appears to customers at checkout:
* **Show subscription option on checkout** - Toggle whether the subscription option row (label + plan name) appears at checkout. Enabled by default.
* **Show variant on checkout** - Toggle whether the variant row (option name + variant name, e.g., "Size / Large") appears at checkout. Enabled by default.
* **Subscription option label** - Customize the label shown above the plan name (default: "Subscription"). For example, you might change this to "Subscribe", "Delivery", or another term that fits your brand.
* **Plan name** - Override the plan name displayed at checkout. By default, the plan name from Shopify is used.
**When plans are automatically locked:**
* **Product image corner radius** - Apply rounded corners to product images. Choose from:
* None - Square corners
* Base - Slightly rounded corners
* Large - More rounded corners (default)
* Fully Rounded - Maximum rounding
* **Product image size** - Control image dimensions:
* Default - Standard size (64px for vertical layouts)
* Small - Smaller images (48px for vertical, taller aspect ratio for horizontal)
* Medium - Medium images (72px for vertical, square aspect ratio for horizontal) (default)
* Large - Larger images (96px for vertical, shorter aspect ratio for horizontal)
* **Product image display** - Choose how images fill their container:
* Fill - Image stretches edge-to-edge (default)
* Bordered - Adds a visible border around the image
* **Card padding** - Set inner spacing between the card edge and content:
* None - No padding
* Tight - Minimal spacing
* Base - Standard spacing
* Loose - Maximum spacing (default)
* **Button width style** - Control how the add-to-cart button width is displayed across upsells. Choose from:
* Auto (default) - Button width varies based on whether variant selectors are present
* Compact (uniform small) - All buttons use compact width for consistent sizing
* Full width (uniform large) - All buttons use full width for consistent sizing Plans are automatically locked when:
* You select a specific subscription plan (as described above)
* The product has only one subscription plan available
In both cases, customers cannot change the subscription plan at checkout, and the customization options above apply.
### Upsell button text
For non-checkmark upsell widgets, you can customize the text displayed on the upsell buttons. These fields are available when the feature is enabled for your account — contact support to request access.
By default, the buttons show:
* **Add** for standard upsells
* **Upgrade • \$X savings** for replacement upsells where the customer saves money
* **Upgrade • \$X** for replacement upsells where the product costs more
#### Add button text
You can customize the text on the add button for standard and replacement upsells. When you enter custom text, the savings or cost suffix is still appended automatically for replacement offers (e.g. `Buy Now • $5 savings`).
#### Replacement button text
You can set a separate custom prefix for the button on replacement offers. This overrides both the default "Upgrade" prefix and any text entered in the **Add button text** field for replacement offers. The price suffix (e.g. `• $5.00 savings`) is always appended automatically.
For example, entering `Trade up` produces `Trade up • $5.00 savings` on a replacement offer where the customer saves \$5.
> 💡 **Tip:** The `{Amount}` placeholder is not substituted in the replacement button text field — it is treated as literal text. Use the **Add button text** field with `{Amount}` if you need full control over the label format.
#### Using the `{Amount}` placeholder
You can include `{Amount}` in the **Add button text** field to embed the price or savings amount directly in your label. When `{Amount}` is present, your text becomes the entire button label — the automatic suffix is not appended.
| Button text | Offer type | Result |
| ---------------------------- | ------------------------ | ---------------------- |
| `Save {Amount} by upgrading` | Replacement (savings) | `Save $5 by upgrading` |
| `Upgrade for {Amount} more` | Replacement (extra cost) | `Upgrade for $5 more` |
| `Get yours for {Amount}` | Standard upsell | `Get yours for $10` |
The placeholder is case-insensitive — `{Amount}`, `{amount}`, and `{AMOUNT}` all work.
> ⚠️ **Note:** If you use `{Amount}` in a standard (non-replacement) upsell, the product price is substituted. If there is no price to substitute (for example, a free product), the placeholder is removed from the label.
### Max accepted offers
For **Single Product Upsell** and **Multi-Product Upsell** widgets, you can set a limit on how many offers a customer can accept from a single widget during a checkout session.
Once a customer has accepted the configured number of offers, the widget stops showing additional offers for the remainder of that checkout session.
* **Leave blank** — No limit is applied. The widget continues to show offers regardless of how many the customer has accepted.
* **Set a positive number** — The widget stops displaying offers once the customer has accepted that many from this widget.
To configure this setting, open your upsell widget in the Checkout editor and enter a value in the **Max number of accepted offers** field.
> 💡 **Tip:** This setting is not available for Checkmark Upsell widgets.
***
### Discounts
Discounts can be **configured directly within the upsell widget**. This discount automatically gets applied when the customer selects to add the upsell product to their order.
#### Adding a discount to your upsell
When configuring an upsell widget, you can add a discount by clicking the **"Add discount"** button. You'll see two options:
* **Pick existing** - Select from discounts you've already created. You can search through your existing discounts to find the one you want to apply.
* **Create new** - Create a new discount directly in the editor by setting:
* **Title** - The discount code text shown to customers in checkout (e.g., "SAVE")
* **Amount** - Choose between a percentage discount or a fixed amount discount, then enter the value
Once a discount is applied to your upsell, it appears as a badge that you can click to change or remove.
You can manage all your checkout discounts in one place. See [Managing checkout discounts](/aftersell/managing_checkout_discounts) to learn how to view, edit, and delete discounts.
#### Hiding the discount amount text
When a discount is applied to your upsell, a savings suffix (e.g. "(20% OFF)" or "(\$6 OFF)") appears next to the product title by default. You can hide this suffix by enabling **Hide discount amount text** in the **Show additional settings** section of the upsell editor.
* When enabled, the savings suffix is hidden. The discounted price itself still displays normally.
* When disabled (default), the savings suffix appears next to the product title.
> 💡 **Tip:** This setting is per-widget. If you have multiple upsell widgets, you can configure each one independently.
#### Customizing the discount suffix label
The "OFF" text in the savings suffix (e.g. "20% OFF") can be customized in **Settings > Translations**. Look for the **Discount suffix** row and enter your preferred label (e.g. "saved", "off", or a translated equivalent). The default value is "OFF".
#### Showing the discounted price when the Aftersell discount is skipped
When **Skip discount if other discounts are already applied** is enabled, the widget hides the configured upsell discount from the preview price by default. If your cart-level discount already matches your upsell discount (so the customer pays the same discounted price regardless), you can enable **Show the discounted price in the widget even when the Aftersell discount is skipped** to keep the preview price in sync with what the customer will actually be charged.
> ⚠️ **Important:** This setting changes the displayed price in the widget for both preview and live customers, but does not apply an Aftersell discount. Only enable this if your cart-level discount matches your upsell discount exactly — otherwise customers may see an incorrect price.
This checkbox is only visible when **Skip discount if other discounts are already applied** is already turned on.
#### How discounts work
* Aftersell discounts follow the same rules as any other Shopify discount. For two discounts to combine, both must be explicitly set to combine in Shopify Admin. For example, if Aftersell creates a discount code and you also have a separate discount like "10% off", both need combination enabled. If either one is not set to combine, they will not combine. Shopify's standard discounting rules apply throughout:
* Shopify only allows one line-item discount per product at a time. If a product already has a discount applied, an additional upsell discount will not stack on the same line item
* Order-level and line-item discounts can combine if both are set to "combinable" in Shopify Admin For full details on Shopify's combination rules, refer to [Shopify's discount combination documentation](https://help.shopify.com/en/manual/discounts/combining-discounts/discount-combinations). **Important limitations** There are a few scenarios where discounts may fail to apply:
* **Multiple discounts on the same product:** If an Aftersell upsell discount is configured for a product that already has a discount applied, the Aftersell discount will not stack
* **Incorrect collection setup:** If discounts target collections, ensure all relevant products belong to the correct collection. Hidden collections can be used to include specific products without making them visible to customers
* **Third-party app conflicts:** Checkout discount functionality is not currently supported when another app is dynamically modifying your checkout. If you are running an app that does this, discounts added by Aftersell may not apply as expected.
For example, if an app adds pricing or add-ons at checkout and recalculates the order total, this can interfere with how Aftersell applies discounts.
***
## Upsell Review Stars
Checkout upsells can display star ratings on offer products to help increase conversions. Ratings are pulled from your product review app's metafields and only appear when valid review data exists for the product.
* Please note that this is currently available on Aftersell's Checkout version 2 and not version 1, due to api limitations.
**How to enable**
* Open **Checkout** and edit the upsell.
* Enable **Show product review ratings**.
* *(Optional)* Open **Advanced product review settings** to customize the display.
**Advanced settings**
* Set a **minimum rating** to display (0-5, default 4.0).
* Choose where stars appear (**below title** or **below price**).
* Customize **filled and unfilled star colors**.
* Show or hide the **numeric rating** and **review count**.
**Supported review apps**\
We support review apps that store ratings in product metafields, including:
* Shopify Product Reviews
* Junip
* Okendo
* Growave
* Fera
* Stamped
* Loox
* REVIEWS.io
* Automizely Reviews
* Judge.me
* Ali Reviews
* Trustoo
* Rivo
* Rivyo
* Vitals
Ratings won't display for products without review data. If multiple supported review apps are installed, the app with the highest review count is used. Yotpo isn't supported for Checkout V2 upsell ratings because it requires a separate API.
### Troubleshooting: reviews show in editor but not on live checkout
If you enable **Show product review ratings** and see stars in the editor preview but not on your live checkout, your review app's metafields may not have Storefront API access enabled.
The editor reads product data through the Admin API (which can access all metafields), while live checkout reads through the Storefront API (which only accesses metafields that have been explicitly granted storefront access). When this mismatch is detected, a warning banner appears in the editor listing the affected products.
**To fix this:**
1. Go to **Settings → Custom data → Products → Metafields** in your Shopify Admin.
2. Find the `reviews.rating` and `reviews.rating_count` metafield definitions.
3. Enable **Storefront API access** for each definition.
Alternatively, check your review app's settings for a **Storefront API sync** option and enable it there.
***
## Cart Controls
Surface a modify link below every product line item to allow editing directly on the checkout page.
The following functionality is supported for cart controls:
* Variant selector: Allow customers to change to another in-stock variant.
* Quantity selector: Allow customers to change the quantity of a product.
* Remove item: Allow customers to remove upsell products.
* Subscription selector: Allow customers to change the currently selected subscription option (e.g. from every 60 days to every 30 days).
* Subscription upgrade: Allow customers to upgrade a one time purchase to a subscription.
* Custom text: Add custom text below each line item.
### Product review ratings
Cart controls can display star ratings for in-cart products to help build trust and increase conversions. Ratings are pulled from your product review app's metafields and only appear when valid review data exists for the product.
**How to enable**
1. Open **Checkout** and edit the cart controls widget.
2. Navigate to the **Product review ratings** section.
3. Enable **Show product review ratings**.
4. *(Optional)* Customize the display settings.
**Settings**
* Set a **minimum rating** to display (0-5, default 4.0). Products below this rating won't show stars.
* Choose where stars appear (**below product title** or **below cart controls**).
* Customize **filled star color** (default: #fdcc0d) and **unfilled star color** (default: #d1d5db).
* Show or hide the **rating value** (e.g., 4.5) and **review count** (e.g., 123 reviews).
**Supported review apps**\
We support review apps that store ratings in product metafields, including:
* Shopify Product Reviews
* Junip
* Okendo
* Growave
* Fera
* Stamped
* Loox
* REVIEWS.io
* Automizely Reviews
* Judge.me
* Ali Reviews
* Trustoo
* Rivo
* Rivyo
* Vitals
Ratings won't display for products without review data. If multiple supported review apps are installed, the app with the highest review count is used.
### Product targeting
You can control which products display cart controls using the **Visibility** settings in the cart controls widget editor:
* **All products in cart:** Cart controls appear for every product (default).
* **Only selected products:** Cart controls appear only for products you select. Click **Select products** to choose which products should display cart controls.
* **All products except selected:** Cart controls appear for all products except those you select. Click **Select products** to choose which products should not display cart controls.
This allows you to customize the checkout experience based on specific products. For example, you might want to enable subscription upgrades only for certain products, or prevent customers from removing specific items from their cart.
**How to configure product targeting:**
1. Open your cart controls widget in the Checkout editor.
2. Navigate to the **Visibility** section.
3. Select your preferred targeting mode from the **Apply cart controls to** dropdown.
4. If you selected **Only selected products** or **All products except selected**, click the **Select products** button to choose your products.
5. Save your changes.
***
## Rewards
Show a reward bar (spend X get Y) in your checkout to incentive adding more products. This goal can either be based on Order Value or Item Count.
**Rewards work well alongside the upsell widget.** Make it easy for a customer to add an extra product to their order to achieve the reward. You can use the **spend threshold** product type in your upsell widget to automatically recommend products that help customers reach the reward threshold.
**Keep in mind**, any rewards you're offering will need to be created through Shopify. This can be done by creating Automatic Discounts if you are offering a discount, or by modifying your Shipping Rules if you are offering free shipping.
### Amount basis
When configuring a reward based on Order Value, you can choose how the cart total is calculated using the **Amount basis** setting:
* **Order total** — Uses the full order total, including shipping and taxes.
* **Subtotal** — Uses the pre-discount merchandise subtotal (before any discount codes are applied).
* **Post-discount subtotal** — Uses the cart total after discounts, shipping, and taxes are subtracted. This matches how Shopify evaluates free-shipping thresholds, so the reward bar accurately reflects whether the customer has truly reached the threshold when a discount code is applied.
> 💡 **Tip:** If you offer free shipping as a reward, use **Post-discount subtotal** to ensure the bar matches Shopify's own free-shipping evaluation. With other bases, a discount code can cause the bar to show "unlocked" while Shopify still charges shipping.
***
## Trust Badges
Build trust badges with custom icons and text in order to increase checkout conversion rate. The badges can be stacked vertically, or displayed horizontally.
Trust badges are great for building a **sense of trust** with your brand and highlighting your value proposition, which can help **lower your abandoned checkout rate.**
***
## Testimonials
Display customer reviews directly on checkout to build trust and lower your abandoned checkout rate.
### Testimonials modes
Aftersell offers two types of testimonials widgets:
* **Classic Testimonials** - ⚠️ **Deprecated** - Classic testimonials are no longer available, If you're currently using Classic Testimonials, we recommend switching to Flex Testimonials.
* **Flex Testimonials** - Automatically pulls customer reviews from your review app (Judge.me, Klaviyo, Okendo, or Yotpo). This is the recommended option for all merchants.
### Switching from Classic to Flex Testimonials
If you're using Classic Testimonials, you should switch to Flex Testimonials to display reviews from your review app:
1. Open **Checkout** in Aftersell
2. Navigate to the **Classic Testimonials** widget tab
3. Click **Switch to review app widget** in the banner at the top
4. Configure your review app credentials in **Settings > Product Reviews** (see [Review app integrations](#review-app-integrations) below)
You can switch back to Classic Testimonials at any time by clicking **Switch back** in the Flex Testimonials tab. **Note:** Classic Testimonials is deprecated and no longer accessible, Once you switch to Flex Testimonials, you will not be able to switch back to Classic Testimonials.
### Flex Testimonials configuration
Flex Testimonials offers two selection modes:
* **Manual selection** - Choose specific reviews to display in your testimonials widget
* **Dynamic** - Automatically fetch and display reviews based on products in the customer's cart
#### Dynamic mode
In dynamic mode, Aftersell imports reviews from your review app and stores them so they can be displayed in the checkout widget. The first import happens automatically within 24 hours, and then once a week after that.
To import reviews immediately, go to **Settings > Product Reviews** and click **Sync now** for your review app.
You can configure:
* **Maximum reviews to show** - Control how many reviews appear
* **Display type** - Choose between horizontal carousel or vertical stack layout
* **Minimum rating** - Set the minimum star rating for reviews to display
* **Truncate review text after (optional)** - Set a maximum character length for review text. When a review exceeds this limit, it's clipped with an ellipsis and a "Read more" button appears. Clicking "Read more" opens a popover with the full review. Leave blank for no limit (default).
### Review app integrations
To use Flex Testimonials, you need to configure your review app credentials in **Settings > Product Reviews**. Aftersell supports:
* **Judge.me** - Requires your Private API token
* **Klaviyo** - Requires your private API key
* **Okendo** - Requires your User ID
* **Yotpo** - Requires your App Key
See the following guides for setup instructions:
* [Judge.me integration](/aftersell/judgeme_reviews_integration)
* [Klaviyo integration](/aftersell/klaviyo_reviews_integration)
* [Okendo integration](/aftersell/okendo_reviews_integration)
* [Yotpo integration](/aftersell/aftersell_yotpo_reviews_integration)
***
## Notes
Allows your customer to add notes to their order. These notes can either be written manually by the customer, or be pre-written notes. Pre-written notes are excellent when your store offers gift wrapping or eco packaging, and you want to give your customers an easy way to opt-in.
***
## Images
Upload a custom image which can be inserted in the checkout.
***
## Text
Insert a banner in your checkout with the text of your choice.
Choose between **four different styles** for the text widget.
* **Information:** A blue background with a blue information icon.
* **Success:** A green background with a green checkmark icon.
* **Critical:** A red background with a red exclamation point icon.
* **Warning:** A yellow background with a yellow warning triangle icon.
# Compare at price not reflecting for checkout upsells (Shopify Plus)
Source: https://docs.aftersell.com/aftersell/compare_at_price_not_reflecting_for_checkout_upsells_shopify_plus
This article outlines the troubleshooting steps to follow when compare-at prices are not displaying correctly for checkout upsells.
If product discounts aren’t appearing at checkout even though checkout upsells are published, this may be related to how **compare-at prices** display in Shopify for EEA (European Economic Area) stores.
## Why This Happens
Shopify automatically uses the **compare-at price** feature to meet the **European Price Indication Directive (PID)**. When enabled, Shopify shows the lowest price in the past 30 days instead of an active discount. You can read [Shopify's documentation](https://help.shopify.com/en/manual/compliance/legal/pricing-indication-directive) for more details.
## How to Fix
If your primary market is in the EEA:
1. Go to **Products** in your Shopify admin.
2. Open the product.
3. Under **Pricing**, set the **Compare-at price** to the lowest price in the last 30 days or more.
4. Set the **Price** to your new sale price.
5. Click **Save**.
**Note:** The **Compare-at price** must be higher than the **Price** to display a discount.
If your store’s primary market isn’t in the EEA:
1. Go to **Settings** > **Markets** in Shopify.
2. Click **Preferences**.
3. Deselect **Hide compare-at prices for EEA customers**.
4. Click **Save**.
If the issue continues after adjusting these settings, clear your browser cache and test again. If it persists, contact **Aftersell Support** for further assistance.
# Configuring post-purchase offer settings
Source: https://docs.aftersell.com/aftersell/configuring_post_purchase_offer_settings
Learn how to configure settings for your post-purchase offers, including custom order tags, discounts, and product options.
When creating or editing a post-purchase offer, you have several configuration options to customize how the offer appears and behaves. This guide covers the key settings available for V2 post-purchase offers.
***
### Searching offer settings
The post-purchase offer editor includes a **Search settings** box at the top of the left sidebar. You can use it to quickly find any setting across your offer without scrolling through each section manually.
As you type, results are grouped into three categories:
* **This offer** — settings within the offer's existing widgets. Selecting a result switches to the relevant widget, opens the section, and jumps directly to the field.
* **Add widget** — widgets not yet added to the offer. Selecting a result adds the widget and opens its settings.
* **Funnel settings** — links to funnel-level pages such as triggers, targeting, A/B testing, translations, and analytics.
This feature is available on V2 post-purchase offers only.
***
### Custom order tags
You can add a custom tag to any V2 post-purchase offer to track which specific upsell a customer accepted. When a customer accepts an offer with a custom tag configured, that tag is automatically applied to their Shopify order alongside the standard "Aftersell Upsell" tag.
#### Why use custom order tags?
Custom order tags give you more granular tracking and help you:
* Identify which specific upsell offer was accepted
* Segment orders by promotion or campaign
* Filter orders in Shopify by upsell type
* Track performance of different offers within the same funnel
#### How to add a custom order tag
1. Navigate to **Post-purchase Funnels** in the Aftersell admin.
2. Select the funnel containing the offer you want to tag.
3. Click **Edit offer** on the offer you want to configure.
4. In the offer settings, find the **Order Tag** field.
5. Enter your custom tag (up to 40 characters).
6. Click **Save**.
#### Tag requirements
* Maximum 40 characters
* Can include letters, numbers, hyphens, and spaces
* Must follow Shopify's order tag requirements
#### How custom tags are applied
When a customer accepts an offer with a custom tag configured:
* The standard "Aftersell Upsell" tag is applied to the order
* Your custom tag is also applied to the order
* Both tags appear in the order details in Shopify
* You can search and filter orders by your custom tag in the Order Browser
**Tip:** Use descriptive, consistent naming for your tags. For example: "summer-promo-accepted", "bundle-upsell", "vip-offer", "clearance-upsell".
#### Per-offer configuration
Custom tags are configured per offer, not per funnel. This means:
* Different offers in the same funnel can have different custom tags
* You can track exactly which offer in a multi-offer funnel was accepted
* Each offer's tag is independent and can be changed without affecting other offers
***
### Product selection and discounts
When configuring your offer, you can:
* Select specific products or use automatic recommendations
* Apply percentage or fixed-amount discounts
* Add product badges (like "Bestseller" or "New")
* Configure subscription options if applicable
#### Setting a discount
When configuring a discount on your offer, you set two separate fields:
* **Discount type** — choose between **Percentage** (e.g. 20% off) or **Fixed amount** (e.g. \$10 off).
* **Discount value** — enter the amount. The field shows a `%` suffix for percentage discounts or your store's currency symbol as a prefix for fixed-amount discounts so the unit is always clear.
A live preview line appears beneath the value field showing how the discount applies to a sample product price — for example, "If your product is \$50.00, customer pays \$40.00 (saves \$10.00)". If you have a specific product selected on the offer, the preview uses that product's price instead of the sample price.
Percentage discounts are capped at 100%. If you enter a value above 100%, or switch from a fixed amount to a percentage while the value exceeds 100%, the value is automatically reduced to 100%.
#### Discount display options
You can choose to display your discount as a monetary value (for example "Save \$6") or as a percentage (for example "Save 20%"). To change this, open the offer settings and adjust the discount display option to your preferred format.
Aftersell supports displaying either a monetary discount or a percentage discount, but not both at the same time. Choose the format that best suits your store.
#### Rounding rules for percentage discounts
When displaying a percentage discount, Aftersell applies the following rounding rules:
* Percentages with decimals up to **.80** are rounded down.
* Percentages with decimals of **.81** or higher are rounded up.
For example:
* A discount of **39.56%** will display as **39%**
* A discount of **39.81%** will display as **40%**
For more details on product selection, see the [Quickstart Guide](/aftersell/quickstart_guide_to_aftersell).
***
### Offer design and messaging
Customize how your offer appears to customers:
* Add custom text and headlines
* Include countdown timers for urgency
* Configure product images and layout
* Match your brand's checkout styling
For more information on offer design, see [Post-purchase Branding Settings](/aftersell/post_purchase_branding_settings).
***
### Need help?
If you have questions about configuring your post-purchase offers or custom order tags, our support team is here to help. Reach out via chat or email us at [support@aftersell.app](mailto:support@aftersell.app).
# Configuring Shopify web pixels
Source: https://docs.aftersell.com/aftersell/configuring_shopify_web_pixels
Setting up conversion tracking using Web Pixels with post-purchase upsells
[Shopify Web Pixels](https://help.shopify.com/en/manual/promoting-marketing/pixels) are Shopify's solution for tracking data on purchases such as conversion rates. There are two primary ways you will interact with them:
* App Web Pixels
* Custom Web Pixels
# App Web Pixels
Some app pixels, (e.g. Omega Facebook Pixel) integrate directly with Shopify Web Pixels. These apps require no further setup to work with Aftersell.
# Custom Web Pixels
Custom pixels allow for bespoke solutions if no app pixel can be found on the Shopify marketplace to meet your needs. The following details how to convert existing order status page tracking scripts to use custom pixels. Please note the [potential risks of custom pixels](https://help.shopify.com/en/manual/promoting-marketing/pixels/overview#potential-risks) before proceeding.
If you use Google Tag Manager specifically, then Shopify provides [helpful documentation for completing this migration](https://help.shopify.com/en/manual/promoting-marketing/pixels/custom-pixels/gtm-tutorial).
There are 3 core steps to creating a custom pixel for conversion tracking.
1. Preparing the 3rd party JavaScript SDK
2. Setting up conversion tracking using web pixels
3. Connecting your custom pixel
## 1. Preparing the 3rd party JavaScript SDK
You will want to remove any HTML present in the provided pixel code. Any JavaScript that is loaded through an HTML `
```
*After removing HTML & reworking `
```
# Customizing discount displays in Aftersell
Source: https://docs.aftersell.com/aftersell/customizing_discount_displays
Aftersell gives you options for how discounts are displayed to customers on your post-purchase offers. You can choose to show discounts as a monetary value (for example "Save \$6") or as a percentage (for example "Save 20%").
This guide explains how to configure these options and the rules that apply.
***
## Displaying Monetary vs Percentage Discounts
You can configure whether your upsell offers display a monetary discount or a percentage discount. To change this, open the offer settings within your funnel and adjust the discount display option to your preferred format.
Aftersell supports displaying either a monetary discount or a percentage discount, but not both at the same time. Choose the format that best suits your store.
***
## Rounding Rules for Discount Percentages
When displaying a percentage discount, Aftersell applies the following rounding rules:
* Percentages with decimals up to **.80** are rounded down.
* Percentages with decimals of **.81** or higher are rounded up.
For example:
* A discount of **39.56%** will display as **39%**
* A discount of **39.81%** will display as **40%**
***
## Limitations
It is not possible to remove the percentage label in Checkout Upsells while keeping the discount enabled. The discount and percentage display are linked, meaning that enabling a discount will automatically show the total percentage savings. **This cannot be adjusted independently.**
***
## Frequently Asked Questions
No. Aftersell currently supports displaying either a monetary or a percentage discount, but not both simultaneously. Choose the format that best fits your marketing strategy.
The discount and percentage display settings are linked in Checkout Upsells. When a discount is enabled, the total percentage savings will always be shown to customers. This cannot be changed independently.
Discount percentages are calculated based on the difference between the original price and the discounted price. The rounding rules above are then applied to determine the final displayed percentage.
***
**Want to go further?**
* [Post-Purchase Best Practices](/aftersell/best_practices) - tips to improve conversion across all your offers
* [How to Configure Post-Purchase Offers](/aftersell/how_to_configure_post_purchase_triggers) - set up your full post-purchase funnel
# Does Aftersell have a developer API?
Source: https://docs.aftersell.com/aftersell/does_aftersell_have_a_developer_api
Due to the nature of working with Shopify's Post Purchase API and Checkout Extensibility environments we're limited in what we can edit. All of the changes available to us can be made in our app and we do not provide an API for Aftersell.
# Does multi-currency checkout impact Aftersell?
Source: https://docs.aftersell.com/aftersell/does_multi_currency_checkout_impact_aftersell
This article explores how multi-currency checkout affects the functionality of Aftersell.
If your store has multi-currency enabled, 1-click upsell offers will only appear for orders made in your **store's default currency.** For instance, if your store's default currency is GBP and the order was placed in USD, the offer will **not** display. This limitation is a result of Shopify's multi-currency infrastructure. \
To address this, consider aligning your store's default currency with the currency most commonly used by your customers. This can improve the visibility and performance of post-purchase upsells by providing a localized shopping experience.
### Steps for Changing Store Currency
1. Evaluate your customer base to determine the predominant purchasing currency.
2. Update your store's default currency in Shopify to match the target market's currency.
3. Wait for up to 24 hours for Shopify to fully convert your store to the new currency.
4. Verify that post-purchase upsells are visible to customers in the target market. No additional steps are required after the currency change for upsells to appear.
This restriction is due to Shopify’s post-purchase limitations, which are explained further [here](/aftersell/why_isnt_my_1_click_offer_displaying). You can also review [Shopify's documentation](https://shopify.dev/docs/apps/checkout/product-offers/post-purchase#limitations-and-considerations) for additional details. Shopify's infrastructure imposes unique constraints on multi-currency capabilities, emphasizing the need for merchants to carefully plan their store's currency settings to optimize post-purchase app functionalities.
***
[Thank you page](/aftersell/thank_you_page_scripts_overview) offers are not subject to the same limitations as 1-click offers, making them an excellent alternative in this scenario. We recommend setting up upsells to capture orders that may not see 1-click offers due to these restrictions. Moreover, setting up dedicated upsell offers tailored to key customer segments can further ensure these offers align with multi-currency functionalities. Consider leveraging Shopify Markets for enhanced configuration.
# DTC ads onboarding guide | web pixel activation
Source: https://docs.aftersell.com/aftersell/dtc_ads_onboarding_guide_web_pixel_activation
This article outlines how to integrate the Rokt Conversions Web Pixel
# **Overview**
The Rokt Conversions Web Pixel enables accurate attribution of conversions from your Shopify store to Rokt campaigns. This helps optimize your marketing performance by tracking user activity through Shopify’s Web Pixels API.
***
## **Step 1: Install the Aftersell App**
You will be provided with a special installation link by your account manager.
* Click the link to be redirected to the Shopify App Store.
* You will be prompted to install the Aftersell app.
* Click **Install** to continue.
After installation, Aftersell may display a permission request within the app for scopes related to pixel tracking — specifically `read_customer_events` and `write_pixels`. Click **Approve** to grant these permissions. Accepting these scopes allows Aftersell to inject and activate the Rokt Web Pixel automatically.
***
## **Step 2: Accept Terms and Conditions**
After granting the required permissions:
* You will be prompted to review and accept our Terms and Conditions.
* Press **Enable now** to proceed.
***
## **Step 3: Activate Free Plan**
Following the Terms and Conditions:
* You will be prompted to accept the **Aftersell Free Plan (Rokt Ads)**.
* Click **Approve** to complete the activation.
* Once approved, your onboarding is complete, and you will be redirected to the Rokt Ads dashboard, where you will see your newly created **Rokt Account ID**.
***
## **Step 4: Web Pixel Activation**
After completing onboarding, the Web Pixel installation will be triggered automatically.
Please allow up to **5 minutes** for the activation to complete.
***
## **To Verify Pixel Activation:**
1. On the Rokt Ads page (inside Aftersell), click the link labeled Customer Events Settings. This will take you directly to the right page in your Shopify Admin.
2. Alternatively:\
Navigate manually to Shopify Admin → Settings → Customer Events.
3. Once there:\
Under App Pixels, look for "Aftersell".\
Ensure the status is listed as Connected.
If the pixel does not appear immediately or shows "Disconnected," it may still be processing. Please wait a few minutes and refresh the page.
***
## **Additional Notes:**
This activated web pixel does two things:
1. Adds a cookie when a customer lands on your site from one of your Rokt campaigns. Rokt will automatically add the “rtid” query parameter to the URL of the landing page.
2. Records conversions. If the customer has a cookie from step i) then the conversion will be attributed to your Rokt campaign.
The following settings will be applied automatically by the web pixel app.
1. *Permission: Required > Marketing and Analytics*. These are the default settings for new pixels. This is most relevant for customers in the EU and UK. To learn more, see [Shopify’s documentation here](https://help.shopify.com/en/manual/promoting-marketing/pixels/custom-pixels/manage#customer-privacy).
2. *Data sale: Data collected does not qualify as data sale.* Conversion data is collected to optimize and monitor advertising campaigns and is not sold by Rokt.
3. For details on the Web Pixels API, see [Shopify’s developer documentation here](https://shopify.dev/docs/api/web-pixels-api).
# Earn & Save program
Source: https://docs.aftersell.com/aftersell/earn-save
Earn & Save is an opt-in program for Aftersell merchants. When you enroll, two things happen each cycle:
* Your Rokt Thanks earnings pay out to you in full.
* Aftersell adds a matching discount on top of your Aftersell bill, sized to match your earnings from the last 30 days, up to your bill amount.
If your earnings are less than your bill, the matching discount only covers part of the bill, and you still owe the remainder. Your Rokt Thanks earnings always pay out to you in full, regardless of whether the discount fully covers your bill.
Earn & Save is not a trial, and it does not change your existing Aftersell plan. As long as Rokt Thanks stays active on your store and you remain enrolled, the matching discount keeps applying each cycle. Your features, your base plan price, and your maximum monthly charge all stay the same.
## How Earn & Save works
Earn & Save has two sides: the earnings you generate through Rokt Thanks, and the matching discount Aftersell adds to your monthly bill.
**Earn.** When you enable Rokt Thanks, vetted brands like Disney+, HelloFresh, and Venmo show their offers on your post-purchase confirmation page. Every time a customer clicks "Yes, please!" on one of those offers, you earn revenue. On average, merchants earn around \$0.30 to \$0.50 USD per transaction. Rokt pays these earnings out to you in full via PayPal (or wire/ACH if you have that set up).
**Save.** Each billing cycle, Aftersell adds a matching discount on top of your Aftersell bill, sized to match your Rokt Thanks earnings from the last 30 days, up to your bill amount. The discount is added by Aftersell, not deducted from your earnings.
If your earnings fully cover your bill, your Aftersell charge for that cycle can be as low as \$0. If your earnings are smaller than your bill, the discount only covers part of the bill and you pay the remainder. Either way, your Rokt Thanks earnings pay out to you in full.
## At a glance
| | |
| :-------------------------------- | :------------------------------------------------------------------------------------------------------------ |
| **Who is it for?** | Any Aftersell store with 1,000 or more monthly orders. |
| **What is it?** | An opt-in program layered on top of your existing pricing plan. |
| **What does it cost?** | Nothing. There is no separate fee. |
| **What changes about my plan?** | Nothing. Your features, base plan price, and maximum monthly charge stay the same. |
| **When does the discount start?** | On your upcoming Aftersell bill, irrespective of how long you have been enrolled. |
| **Where do my earnings go?** | Rokt pays them out to you in full via PayPal (or wire/ACH if set up), separately from the Aftersell discount. |
## How the matching discount is calculated
Each billing cycle, Aftersell looks at your Rokt Thanks earnings from the **last 30 days** and adds a matching discount to your Aftersell bill, sized to match those earnings. The discount is capped at your bill amount, so it never exceeds what you would have paid.
How this plays out depends on how much you earned in the last 30 days:
| Last 30 days earnings | Matching discount | What you pay Aftersell |
| :---------------------- | :----------------------- | :------------------------- |
| **Exceed your bill** | Caps at your bill amount | **\$0** |
| **Match your bill** | Covers the full bill | **\$0** |
| **Less than your bill** | Matches your earnings | The remainder of your bill |
Either way, your Rokt Thanks earnings continue to pay out to you in full.
On your Aftersell admin (Settings → Billing), the matching discount shows the exact 30-day earning window it was sized to match, for example "May 5 to June 3 Rokt earnings". Hover the info icon next to the line for the full breakdown.
If you have both Post-purchase and Checkout on your plan, both charges are billed together on the same day for Earn & Save merchants. The matching discount applies to the combined Aftersell bill, not to each feature separately.
## Am I eligible?
Your store qualifies for Earn & Save if it processes **at least 1,000 orders per month**.
Earn & Save applies to your total Aftersell bill, regardless of which features are on your plan. If you are on Post-purchase only, or Post-purchase plus Checkout, the matching discount applies to your full Aftersell charge each cycle.
What you actually earn through Rokt Thanks depends on factors like your traffic, order volume, and offer relevance to your customers. Higher engagement generally leads to higher earnings.
If your store does not currently meet the 1,000 monthly order threshold, you can still use Aftersell on a standard paid plan. Eligibility is re-evaluated continuously, so Earn & Save will surface in your admin if your store crosses the threshold later.
## Enrolling in Earn & Save
The enrollment flow depends on your current Aftersell setup. Some stores see additional steps, others enroll in a single click.
Some stores are required to confirm updated subscription terms before enrolling. You will see a prompt in your Aftersell admin if this applies to your store. If you do not see a prompt, skip to step 2.
This typically applies to stores on an older Aftersell billing plan that includes the Checkout feature. Confirming the updated terms does not change your features or your base plan price. It only authorizes Aftersell to add the matching discount line to your future bills.
Open the Rokt Thanks dashboard in your Aftersell admin and click **Enable**. Then place at least one Rokt Thanks app block on a customer-facing page. Your Thank You page is the recommended starting point. Completing both of these actions marks the setup guide on your Rokt Thanks dashboard as complete and activates Rokt Thanks on your store.
If you need help with block placement, see Activating and Configuring Rokt Thanks.
Setting up your payouts (PayPal or wire/ACH) is a separate step that is not required for Earn & Save to apply the matching discount to your bill. Payout setup only affects how you receive your Rokt Thanks earnings. See [Rokt Thanks Payouts](/aftersell/rokt_thanks_payouts) for details.
## Maximizing your earnings
The more visible the Rokt Thanks block is on your store, the more opportunities your customers have to interact with offers. A few practical things you can do to increase visibility:
**Place the block above the fold.** Buyers do not always scroll the confirmation page. Place the Rokt Placement block in the **Main** section of your Thank You page, just below the order-confirmation banner, so it appears without scrolling. Avoid the Order Summary column and the Footer.
**Add the block to multiple surfaces.** Rokt Thanks can render on up to four customer-facing pages: your Thank You page, your Order Status page, your customer account Profile page, and your customer account Orders page (if you are on Shopify's new customer accounts, also called Vaulted Rewards). Placing the block on all four surfaces can lift earnings by an estimated 10 to 20 percent on top of the Thank You page alone. See Rokt Vaulted Rewards.
**Keep Rokt Thanks active.** The matching discount only applies while Rokt Thanks is active and generating earnings. If you disable or remove the Rokt Thanks block, earnings stop and the discount stops on the next cycle. You can re-enable anytime.
## What you see on your bill and payouts
Earn & Save shows up in three places. Each handles a different part of the program.
| | |
| :-------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Shopify invoice** | Your Aftersell charge for the cycle, with the matching discount already applied. The charge can be as low as \$0 if the discount fully covers it. |
| **PayPal (or wire/ACH)** | Your Rokt Thanks earnings, paid out by Rokt directly on their normal payout schedule (approximately 90 days after the end of the month the earnings were generated in). |
| **Aftersell admin, Settings → Billing** | The current cycle's matching discount, the 30-day window it was sized to match, and your lifetime savings from the program. |
## Worked examples
### Scenario 1: matching discount covers part of the bill
You are on Post-purchase only. Based on your order volume, your Aftersell bill for this cycle is \$149.99. Your Rokt Thanks earnings from the last 30 days are \$80.
| | |
| :---------------------------------- | :--------------------------------- |
| Post-purchase charge | \$149.99 |
| **Aftersell bill this cycle** | **\$149.99** |
| Rokt Thanks earnings (last 30 days) | \$80 |
| Matching discount added to bill | \$80 off (sized to match earnings) |
| **What you pay Aftersell** | **\$69.99** |
| **Earnings paid out to you** | **\$80** |
The matching discount of \$80 is applied to your bill, leaving \$69.99 still due. You also receive your \$80 in Rokt Thanks earnings, paid out by Rokt directly.
### Scenario 2: matching discount covers the full bill
You are on Post-purchase. Your store is high-volume, doing 30,000 or more orders per month, which puts your Post-purchase charge at the maximum of \$799.99 (the highest the Post-purchase charge can reach, regardless of how high your order volume goes). Your Rokt Thanks earnings from the last 30 days are \$1,200.
| | |
| :---------------------------------- | :--------------------------------------------------- |
| Post-purchase charge | \$799.99 (maximum) |
| **Aftersell bill this cycle** | **\$799.99** |
| Rokt Thanks earnings (last 30 days) | \$1,200 |
| Matching discount added to bill | \$799.99 off (sized to earnings, capped at the bill) |
| **What you pay Aftersell** | **\$0** |
| **Earnings paid out to you** | **\$1,200** |
Your earnings exceed your bill, so the matching discount caps at \$799.99 and your Aftersell charge for the cycle is \$0. You still receive your full \$1,200 in Rokt Thanks earnings, paid out by Rokt directly. The discount does not grow beyond your bill amount.
## Troubleshooting
Yes. When your Rokt Thanks earnings from the last 30 days reach or exceed your bill amount, the matching discount covers the full bill and you pay \$0 for that cycle. You continue to receive your full earnings from Rokt Thanks, paid out separately.
Whether your bill reaches \$0 depends on your earnings each cycle. It is possible, not guaranteed.
The matching discount is sized to match your Rokt Thanks earnings from the last 30 days. If your earnings did not reach your bill amount, the discount is sized to match whatever you earned, and the remainder of the bill is still due. Your Rokt Thanks earnings continue to pay out to you in full.
Only when your Rokt Thanks earnings consistently meet or exceed your Aftersell bill. If you earn \$50 in a 30-day period and your bill is \$349, your matching discount is \$50 and the remaining \$299 is still due.
For high-volume stores with strong engagement, it is common for earnings to fully cover the bill each cycle. For smaller stores, Earn & Save is best thought of as a recurring savings on your subscription, not free service.
The matching discount is capped at your bill amount, so the discount itself does not grow beyond that. Your earnings always pay out in full regardless, so you still receive everything Rokt Thanks earned for you during that cycle. Earnings and the discount are separate.
A few common reasons:
* **Rokt Thanks is not yet enabled or showing offers.** Open your Aftersell admin (Settings → Billing) and confirm Rokt Thanks is enabled and your store is set up to display offers.
* **You have not earned yet.** The discount is sized to match your last 30 days of Rokt Thanks earnings. If you only just enabled Rokt Thanks, give it a billing cycle to start earning.
* **You are still ramping up.** Earnings depend on traffic, order volume, and offer relevance. Results vary by store and grow over time.
You stay enrolled in the program, but the matching discount only applies while Rokt Thanks is active and generating earnings. If you disable Rokt Thanks, the discount stops on the next cycle. You can turn Rokt Thanks back on anytime to resume.
It depends on your current Aftersell billing plan. If you are on an older Aftersell plan that includes the Checkout feature, you may be prompted to confirm updated subscription terms when you enroll. Look for the Earn & Save prompt in your Aftersell admin. If you do not see a prompt, you can enroll without confirming any new terms.
Earnings are paid out approximately 90 days after the end of the month the revenue was generated in. Payouts are also subject to a minimum threshold based on your payout method.
Full details are on the [Rokt Thanks Payouts](/aftersell/rokt_thanks_payouts) page.
The Earn & Save card is always accessible from your Aftersell admin under **Settings → Billing**. The card stays available as long as your store is eligible.
Earn & Save is only surfaced for stores that meet the eligibility threshold of 1,000 monthly orders. If you have recently crossed that threshold and do not see the program, reach out to support and we can confirm your eligibility status.
Yes. The Earn & Save card on Settings → Billing shows your lifetime savings from the program, alongside the current cycle's matching discount.
No. Earn & Save sits on top of whichever standard plan you are on. Your features, your base plan price, and your maximum monthly charge stay the same. The only difference is the matching discount that gets added to your bill.
You can stop the matching discount in two ways:
* **Disable Rokt Thanks.** Earnings stop, and the discount stops on the next cycle. You can re-enable anytime.
* **Leave the program entirely.** Contact the Aftersell support team via in-app chat. Your standard plan billing resumes on the next cycle.
## Need help?
* For program questions or setup issues, contact the Aftersell support team via in-app chat or email [support@aftersell.com](mailto:support@aftersell.com).
* For Rokt Thanks payout-specific questions, see [Rokt Thanks Payouts](/aftersell/rokt_thanks_payouts).
* Include your store URL and a brief description of the issue for faster help.
### Related pages
* [What is Rokt Thanks?](/aftersell/what_is_rokt_thanks)
* [Activating and Configuring Rokt Thanks](/aftersell/activating_and_configuring_rokt_thanks)
* [Rokt Thanks Settings](/aftersell/rokt_thanks_settings)
* [Rokt Thanks Payouts](/aftersell/rokt_thanks_payouts)
* [Aftersell Billing & Pricing](/aftersell/aftersell_billing_pricing)
# Fulfillment
Source: https://docs.aftersell.com/aftersell/fulfillment
This article outlines how order processing workflows can be managed.
**Post-purchase fulfillment holds**
When a customer completes payment during checkout, an order is generated in Shopify. If a post-purchase upsell is offered to the customer, the order will have a fulfillment status of **On Hold**.
The **On Hold** status indicates that fulfillment should be paused, as the customer may accept the upsell, which would add items to the order. This status ensures the order is not processed prematurely, allowing time for potential additions.
***
**Releasing post-purchase fulfillment holds**
Once the fulfillment hold is released, the order fulfillment status will change to **Unfulfilled**:
The order hold will automatically release in the following scenarios:
* If the customer clicks Accept or Decline on all post-purchase offers.
* If 60 minutes has passed since the order's creation.
**NOTE:** If the "Release fulfillment holds from post-purchase offers when the offer timer ends" setting is enabled in `Aftersell > Settings > Fulfillment and payment`, the release time may differ.
**DEV Note: How the "Release fulfillment holds from post-purchase offers when the offer timer ends" functions behind the scenes.**
When the above setting is enabled, and Aftersell determines that the order hold should be released, the following actions are performed:
1. Aftersell queries Shopify for the order and retrieves all associated fulfillments (an order may have one or more fulfillments).
2. Aftersell instructs Shopify to release the order hold for each individual fulfillment.
Aftersell will add an event to the order for each fulfillment hold released, displaying the message "Aftersell Post Purchase Upsell released fulfillment for X items."
* **Note**: Aftersell does not modify the number of fulfillments.
The following table describes the timeline of when the post-purchase fulfillment hold is released for various customer scenarios:
***
## Order routing for upsells
When an upsell is accepted, Aftersell creates a separate fulfillment for the upsell items. By default, this fulfillment is not re-routed through your store's order routing rules, which can result in the upsell being fulfilled from a different location than the original order — creating a split fulfillment.
You can enable the **Re-run order routing on Aftersell upsells** toggle in `Aftersell > Settings > Fulfillment and payment > Order routing` to have Shopify re-apply your store's [order routing rules](https://help.shopify.com/en/manual/fulfillment/setup/order-routing) to any fulfillment containing only Aftersell upsells, once its hold is released after the post-purchase or thank you page flow completes.
A common use case is to configure your order routing rules to minimize split fulfillments as the first priority, which helps reduce the number of orders where the upsell is fulfilled separately from the original order.
> **Note:** This toggle requires the **merchant-managed fulfillment orders** and **third-party fulfillment orders** Shopify permissions. If these permissions have not been granted, a banner will appear on the settings page prompting you to grant access. The toggle is disabled until both permissions are granted.
***
## **Integrating with external fulfillment services (3PL)**
Certain fulfillment services or custom workflows may not be configured to handle the
**On Hold** status for order fulfillment. If your process does not properly manage post-purchase fulfillment holds, there is a risk of partially fulfilling orders or generating unnecessary extra fulfillments for a single order.
Fulfillment workflows differ from store to store, as do the solutions for managing orders with post-purchase upsells. The following framework provides guidance on assessing and implementing any necessary adjustments to ensure that your fulfillment process operates smoothly with post-purchase upsells:
If your fulfillment process requires a custom solution to work with post-purchase upsells, please contact Aftersell Support for assistance.
***
## ShipStation Integration
If you're utilizing ShipStation with a direct connection to Shopify, your fulfillment process should automatically integrate with post-purchase upsells.
However, if you're using an intermediary service to connect Shopify and ShipStation (such as NetSuite), you might require a custom solution. Please refer to the next section to review the expected order format in ShipStation to ensure everything is operating correctly.
**How On Hold Orders Look in ShipStation**
Orders marked as **On Hold** in Shopify will appear in the On Hold section of ShipStation. These orders will display a quantity of **0**. The quantity shown in ShipStation represents the fulfillable amount, which is indicated as **0** while the order is **On Hold** because none of the items are ready to be fulfilled yet (since the order may still be adjusted with post-purchase upsell items).
After the order fulfillment hold is lifted, the order will shift to the Awaiting Shipment tab in ShipStation. The quantity will be updated to accurately reflect the total quantity of the order, including any post-purchase upsell item(s).
These orders will indicate that the quantity has been updated by the selling channel, which is Shopify in this instance.
***
## Testing Notes
If you're testing your ShipStation integration and aren't seeing orders come in immediately, you can manually refresh the orders for your store.
# Fulfillments and payments setting
Source: https://docs.aftersell.com/aftersell/fulfillments-and-payments-setting
This guide covers every setting available in the Fulfillment and Payment section of Aftersell. These settings control how your orders are held, released, and managed after a post-purchase upsell is offered or accepted.
You can find these settings in your Aftersell admin under **Settings > Fulfillment and Payment**.
***
## Fulfillment Holds
An order is placed **On Hold** when a customer hasn't yet accepted or declined all of their post-purchase offers, or if they closed the browser tab before making a decision. The hold exists as a buffer between order creation and fulfillment, ensuring the order isn't processed before the customer has finished with their post-purchase offers.
The hold is released automatically in the following situations:
* The customer accepts or declines all post-purchase offers - the hold releases immediately.
* The customer's offer timers run out all the way - the hold releases immediately.
* The customer closed the tab without deciding - the hold releases automatically after **60 minutes**.
The settings below give you more control over how and when those holds are released.
### Release fulfillment holds from post-purchase offers when offer timer ends
By default, if a customer closes their browser while on the post-purchase page, the order stays On Hold for **60 minutes** before automatically releasing.
When this setting is enabled, the hold release time is reduced to match your upsell offer timer duration. For example, if your timer is set to 10 minutes, the hold will release after 10 minutes instead of 60.
This setting only affects the release timing when a customer closes the browser mid-flow. If the customer accepts or declines all offers, or their timers run out, the hold releases immediately regardless of this setting.
**When to enable this:** Enable this if you want orders to move to fulfillment faster after a customer abandons the post-purchase page.
***
### Release fulfillment holds when the post-purchase offer never loaded for the customer
In rare cases, Shopify places a fulfillment hold on an order even when the post-purchase offer never appeared to the customer, for example if the customer closed their browser before the page fully loaded. This is an occasional Shopify quirk rather than a common occurrence.
When enabled, a 5-minute release window is scheduled as a safety net for these situations, automatically releasing the hold on orders where no offer was ever shown.
Only enable this if you are actively seeing orders stuck on hold that never received a post-purchase offer. It is disabled by default and is not needed for most stores.
This setting is only available when **Release fulfillment holds from post-purchase offers when offer timer ends** is enabled. If that setting is turned off, this option will be greyed out.
***
### Allow Aftersell to hold orders with accepted post-purchase offers for fraud review
When enabled, Aftersell will place a hold on orders where Shopify has detected a fraud risk above the level you specify. This gives you time to review potentially fraudulent orders before they are fulfilled.
**Fraud Hold Release**
You can set the fraud risk threshold using the **Fraud Hold Release** dropdown. The available options are:
* **Low Risk** - Orders flagged as low risk or higher will be held for review
* **Medium Risk** - Only orders flagged as medium or high risk will be held
* **High Risk** - Only orders flagged as high risk will be held
Orders where Shopify's detected fraud risk exceeds your selected threshold will be put on hold by Aftersell until you review and release them manually.
If you are seeing a high number of orders stuck on hold, check your fraud threshold setting. A threshold that is too sensitive may be holding legitimate orders.
***
## Partially Paid
A partially paid order can occur in two ways depending on the upsell type:
**Post-purchase upsells**
If a customer accepts a post-purchase upsell but the payment fails, the upsell item is still added to the order. The original items are paid for but the upsell item payment was not processed, resulting in a partially paid order.
**Thank You Page upsells**
When using the Order Merging beta feature for Thank You Page upsells, the item is added to the original order as soon as it is accepted. However the customer still needs to complete a separate checkout to pay for it. If they exit without completing payment, the order becomes partially paid since it now contains an item that has not been paid for.
The settings below control how Aftersell handles these situations automatically.
For a full explanation of partially paid orders and how to resolve them, see [Partially Paid Orders](/aftersell/partially_paid_orders).
***
### Automatically remove unpaid upsell products from orders
When enabled, Aftersell will automatically remove unpaid upsell products from partially paid orders after a set delay if payment has not been collected. This prevents unpaid items from being accidentally fulfilled and shipped.
**Partially paid removal delay**
Controls how long Aftersell waits after a failed payment before removing the unpaid item from the order. The default is 65 minutes.
* A **longer delay** gives customers more time to complete payment via the banner shown on their order confirmation page. Shopify also sends a payment reminder email after 2 hours if payment is still outstanding.
* A **shorter delay** allows you to fulfill the original order more quickly, but reduces the window for customers to pay for the upsell item.
TY page upsells are only affected by this setting when using the order merge feature.
***
### Add 'Aftersell Upsell' tag when payment is confirmed
By default, the 'Aftersell Upsell' tag is added to an order as soon as a upsell is accepted, regardless of whether payment succeeds.
When this setting is enabled, the tag is only added after payment for the upsell is successfully confirmed. This prevents orders from being incorrectly tagged when the upsell payment fails.
**When to enable this:** Enable this if you use the 'Aftersell Upsell' tag to trigger workflows, reports, or fulfillment logic and want to ensure only successfully paid upsells are tagged.
***
**Want to go further?**
* [Fulfillment](/aftersell/fulfillment) - understand how post-purchase fulfillment holds work and how to integrate with 3PL services
* [Partially Paid Orders](/aftersell/partially_paid_orders) - a full guide to handling partially paid orders
* [Potential Workarounds for Fulfillment Flow Issues](/aftersell/potential_workarounds_for_fulfillment_flow_issues) - solutions for fulfillment problems with external services
* [Payment Capture](/aftersell/payment_capture) - manage how and when payments are captured for post-purchase upsells
# How to configure thank-you page widgets
Source: https://docs.aftersell.com/aftersell/how_can_i_set_up_and_customize_thank_you_page_upsells_in_aftersell
Step-by-step guide to setting up and configuring Thank You Page widgets in Aftersell
Thank You Page (TYP) widgets in Aftersell are a powerful way to engage customers after a purchase and increase sales. This guide provides step-by-step instructions for configuring and enabling TYP widgets within your post-purchase funnels. TYP widgets work in conjunction with Post-Purchase offers, providing multiple opportunities to maximize customer conversions after checkout.
***
## What are Thank You Page widgets?
Thank You Page widgets allow you to display additional content and product recommendations to customers immediately after checkout. They are highly customizable and do not face the same [Shopify limitations](/aftersell/why_isnt_my_1_click_offer_displaying) as post-purchase upsells. Thank You Page widgets enable you to:
* Tailor offers to specific customer actions (funnel triggers)
* Showcase personalized product recommendations
* Engage customers in a non-intrusive way
* Add [testimonials](#configure-testimonials-widgets), [FAQs](#configure-faq-widgets), [text content](#configure-text-widgets), [images](#configure-image-widgets) and [custom code](#using-custom-code-widgets) to your Thank You page
Each TYP widget is tied to a specific funnel, ensuring you retain flexibility and control for different customer journeys.
***
## Step-by-step setup guide
### Step 1: Create or select a funnel
1. Navigate to **Post-purchase Funnels** in your Aftersell admin.
2. Click **Create New Funnel** or select an existing manual funnel.
3. Name your funnel (e.g., "Thank You Page Upsells - All Orders").
### Step 2: Configure funnel triggers
Define when your funnel should run. The triggers you set here apply to the entire funnel, including both Post-Purchase offers and Thank You Page widgets.
Thank You Page widgets do not have separate trigger settings. Whatever triggers are configured for the funnel will also determine when the corresponding Thank You Page widgets display.
1. In the funnel settings, click **Triggers**.
2. Select trigger conditions based on:
* Customer tags
* Product purchased
* Cart value
* Order count
* Collection
* Discount codes used
3. Click **Save Triggers**.
For step-by-step instructions on how to configure funnel triggers, including detailed targeting options and examples, refer to our [Funnel Triggers setup guide](/aftersell/how_to_configure_post_purchase_triggers).
***
### Step 3: Add TYP widgets to your funnel
1. Scroll to the **Thank You Page** section in your funnel.
2. Click **Add Widget**.
3. Choose from available widget types:
* [**Product Recommendation**](#configure-product-recommendation-widgets) - Display up to 10 upsell products
* [**Testimonials**](#configure-testimonials-widgets) - Show customer reviews to build trust and social proof
* [**FAQs**](#configure-faq-widgets) - Answer common customer questions
* [**Text**](#configure-text-widgets) - Share messages, discount codes, or brand stories
* [**Image**](#configure-image-widgets) - Display a custom image or banner
* [**Custom Code**](#using-custom-code-widgets) - Add custom React components (advanced)
***
### Configure product recommendation widgets
1. Choose your product selection method:
* **Specific Products** - Manually select products to display
* **Automatic Upsells** - Let Aftersell recommend products based on cart contents
* **Collections** - Display products from a specific collection
2. Set the **maximum number of products** to display (up to 10).
3. Enable **Hide purchased products** to avoid showing items already in the order.
4. Enable **Hide out-of-stock variants** to only show available products.
When browsing the **Products** tab in the product picker, you can check **Active products only** to hide Draft and Archived products from the list. This filter is off by default and only applies to the Products tab — Collections are not affected.
1. Choose **layout orientation** (horizontal or vertical).
2. Add **banner text** to introduce your offer (optional).
3. Configure **compare-at price** display settings.
4. Select **discount price color** from:
* Checkout branding colors (Accent, Decorative, Info, Subdued)
* Preset colors (Success, Warning, Critical)
5. Enable **quantity selector** if you want customers to choose quantities.
6. Set **minimum and maximum quantity limits** (optional).
1. Apply a discount (optional):
* Choose **percentage** or **fixed amount**
* Customize **discount text** and **discount color**
2. Select **order handling** method:
* **Modify original order** - Adds upsell to existing order (free shipping automatically applied)
* **Create new draft order** - Creates separate order for upsell
* These options have different trade-offs. See [Order Handling](/aftersell/thank_you_page_extensions_overview#order-handling) for guidance, especially if your upsell catalog overlaps with your top-sellers.
3. Enable **free shipping** on upsells (if using "Create new draft order").
4. Enable **"Free Shipping" badge** to highlight the benefit (optional).
***
### Configure testimonials widgets
The Testimonials widget displays customer reviews on your Thank You page to reinforce purchase confidence and build social proof.
Testimonials on the Thank You page use **Flex Testimonials**, which pulls reviews directly from your connected review app. To use this widget, you must first configure your review app credentials in **Settings > Product Reviews**. Supported apps include Judge.me, Klaviyo, Okendo, and Yotpo.
Flex Testimonials offers two selection modes:
* **Manual selection** - Choose specific reviews to display
* **Dynamic** - Automatically fetch and display reviews based on products in the customer's order
In dynamic mode, reviews are imported from your review app and refreshed weekly. To import reviews immediately, go to **Settings > Product Reviews** and click **Sync now**.
You can configure:
* **Maximum reviews to show** - Control how many reviews appear
* **Display type** - Choose between horizontal carousel or vertical stack layout
* **Minimum rating** - Set the minimum star rating for reviews to display
* **Truncate review text after (optional)** - Set a maximum character length for review text
For full details on connecting your review app, see [Checkout widget types - Testimonials](/aftersell/checkout_widget_types#testimonials).
***
### Configure FAQ widgets
1. Click **Add FAQ Item**.
2. Enter your **question** text.
3. Enter your **answer** text.
4. Repeat for additional FAQ items.
5. Reorder items by dragging and dropping.
6. Click **Save**.
***
### Configure text widgets
1. Enter your **heading** (optional).
2. Add your **text content** in the editor.
3. Format text using the toolbar (bold, italic, lists, links).
4. Click **Save**.
***
### Configure image widgets
1. Click the upload area to add your image.
2. Upload a JPG, PNG, or supported image file.
3. Adjust the **Image width** slider (50-500px) to control how large the image appears.
4. Click **Save**.
***
### Save your funnel configuration
1. Review all widget settings.
2. Click **Save Funnel** at the top of the page.
3. Set funnel status to **Active**.
***
## Enabling widgets in Shopify
### Step 1: Open Shopify editor
1. In your Aftersell admin, click **Open Shopify Editor**.
2. This opens the Shopify checkout customization editor.
### Step 2: Add widgets to Thank You page
1. In the Shopify editor, navigate to **Thank You page**.
2. Click **Add app block** or **Add section**.
3. Select **Aftersell TY Widgets** from the list.
4. Position the widget block where you want it to appear.
5. Click **Save**.
Place your widget toward the top of the Thank You page for best visibility. Widgets positioned lower on the page may not be seen on all devices, particularly on mobile where customers are less likely to scroll.
### Step 3: Publish your changes
1. Review the page in the preview.
2. Click **Publish** in the top-right corner.
3. Confirm the publication.
Your TYP widgets are now live and will display to customers based on your funnel triggers.
***
## Testing your widgets
Shopify's checkout preview may not always display widgets correctly. Follow these steps to test:
1. **Set triggers to "Show for all customers"** (temporarily) to see widgets in preview.
2. **Place a test order** using a real checkout flow:
* Use Shopify's test payment gateway
* Create a free product for testing
* Use a discount code to make the order \$0
3. **Verify widgets appear** on the Thank You page immediately after checkout.
4. **Test widget functionality:**
* Click product recommendations
* Verify checkout flow for upsells
* Confirm order handling works as configured
5. **Reset triggers** to your desired targeting rules after testing.
***
## Advanced configuration
### Combining with post-purchase upsells
For maximum conversion, combine TYP widgets with post-purchase offers:
1. Add **Post-purchase Offers** to your funnel (before Thank You page).
2. Configure **TYP widgets** as a second touchpoint.
3. Customers who decline post-purchase offers will still see TYP widgets.
4. This creates multiple conversion opportunities in the customer journey.
### Using custom code widgets
For advanced customization, you can create custom widgets using React:
1. Select **Custom Code** widget type.
2. Write your component using [Shopify's Checkout UI Extension library](https://shopify.dev/docs/api/checkout-ui-extensions/2023-10/components).
3. Ensure your code:
* Exports the component as `export default`
* Uses UI extension components (not DOM elements like `div`, `p`)
* Does not import external code
4. Test thoroughly before publishing.
Custom code widgets are recommended for advanced users only. Consider hiring a [Shopify Expert](https://www.shopify.com/partners/directory) if you need assistance.
***
## Troubleshooting
* Verify funnel status is set to **Active**.
* Check that funnel triggers match your test order conditions.
* Confirm widgets are enabled in the funnel configuration.
* Ensure the widget block is added to the Thank You page in the Shopify editor and positioned toward the top of the page.
* Customers sometimes skip the Thank You page if they close the browser immediately after purchase.
* Ensure Thank You page offers are correctly set up in the Shopify editor.
* Verify the widget block is positioned correctly on the page.
***
## Limitations
Countdown timers are not available on the Thank You page. This is a Shopify platform restriction and cannot be changed within Aftersell.
Each funnel's Thank You Page widgets must be customized individually. There is no option to standardize them across multiple funnels. This ensures all offers are specific to the triggers and customer behavior for each funnel.
***
**Want to go further?**
* [Post-Purchase Best Practices](/aftersell/best_practices) - tips to improve conversion across all your offers
* [How to Configure Post-Purchase Offers](/aftersell/how_to_configure_post_purchase_triggers) - set up your full post-purchase funnel
# How do I cancel my Aftersell subscription?
Source: https://docs.aftersell.com/aftersell/how_do_i_cancel_my_aftersell_subscription
Cancelling and unsubscribing from Aftersell
This guide walks through how to cancel your Aftersell subscription. Cancelling Aftersell uninstalls the app from your Shopify store and ends your subscription. Your settings, funnels, widgets, and configurations are retained for up to 1 year, so you can restore them if you reinstall within that window.
## Before you cancel
If you are considering cancelling, these alternatives may address what you are looking to solve:
* **Reduce your bill with Earn & Save.** Eligible stores can lower their Aftersell subscription cost through the Rokt Thanks Earn & Save program. Your Rokt Thanks earnings pay out to you in full, and a matching discount is applied to your monthly bill up to your bill amount. See the Earn & Save Program page for details and eligibility.
* **Contact support before cancelling.** If a specific issue is driving your decision, our support team may be able to resolve it. Reach us via in-app chat or email [support@aftersell.com](mailto:support@aftersell.com).
## How to cancel
To cancel your Aftersell subscription and uninstall the app:
In the Aftersell admin, navigate to **Settings → Billing**.
Scroll to the bottom of the Billing page and click **Uninstall**. A confirmation modal will open.
In the modal, select the reason or reasons that best describe why you are cancelling. Your answer helps the Aftersell team improve the product.
Depending on the reason you select, additional questions may appear. Answering these is optional but appreciated.
Use the "Something else" field to share any additional context you would like to provide.
The Final invoice banner displays any pending usage charges that will appear on your next Shopify invoice. Review these before confirming.
Click **Uninstall** to confirm. Your subscription is cancelled and the app is removed from your Shopify store in a single step.
## What happens after cancellation
* **Your subscription** ends immediately. No new charges will be submitted for the upcoming billing cycle.
* **Pending charges** that were already submitted to Shopify before cancellation will still be collected on your next Shopify invoice. To avoid charges for the next cycle, cancel at least one day before your next billing date.
* **Your data** (settings, funnels, widgets, configurations) is retained for up to 1 year after cancellation.
* **If you reinstall within 1 year**, you can restore your previous configuration during onboarding. After 1 year, data may be removed and a reinstall will start you on a fresh setup.
Shopify collects app charges on its own billing cycle, not on the day a charge is submitted. If you uninstall after a charge has been submitted for the current cycle, that charge will still be collected on the next Shopify invoice. For more on this timing, see the "Why was I billed after uninstalling?" section of the Aftersell Billing & Pricing page.
## Need help?
For questions about cancellation, pending charges, or your final invoice, contact the Aftersell support team via in-app chat or email [support@aftersell.com](mailto:support@aftersell.com).
### Related pages
* Aftersell Billing & Pricing
* Earn & Save Program
# How do post-purchase upsells affect my fulfillment?
Source: https://docs.aftersell.com/aftersell/how_do_post_purchase_upsells_affect_my_fulfillment
Post-purchase upsell offers will edit the original order and not create a separate order. The post-purchase upsell offer will create a fulfillment hold for up to 60 minutes, which will clear if the customer accepts/declines an offer or closes the browser tab.
For detailed documentation on fulfillment, please [read this section on our docs here](/aftersell/fulfillment).
# How to configure checkout widgets
Source: https://docs.aftersell.com/aftersell/how_to_configure_checkout_widgets
Complete step-by-step guide to configuring checkout widgets in Aftersell, including all widget types, placement options, and conversion best practices for mobile and desktop
This guide walks you through how to configure and place checkout widgets in Aftersell, from enabling widgets to optimizing placement in Shopify Checkout for maximum conversion rates..
**Note:** Checkout widgets are only available to Shopify Plus merchants due to Shopify's Checkout Extensibility API restrictions.
***
## Step 1: Enable your widget in Aftersell
Before adding widgets to your checkout, you need to enable them in the Aftersell admin.
1. Navigate to the **Checkout** tab in your Aftersell admin
2. Select the widget type you want to configure ([Upsells](#upsells), [Cart Controls](#cart-controls), [Rewards,](#rewards) [Trust Badges,](#trust-badges) [Testimonials](#testimonials), [Notes](#notes), [Images](#images), or [Text](#text))
3. Click **Create** to build a new widget or select an existing widget to edit
4. Configure your widget settings (see [Widget types and configuration](#widget-types-and-configuration) below)
5. Click the **Enable** toggle in the top right corner of the widget settings
6. For restricted or advanced upsells, make sure you enable custom triggers before proceeding
***
## Step 2: Open the Shopify Checkout Editor
There are two ways to access the Shopify Checkout Editor:
**Option 1: From Shopify Admin**
1. Go to **Settings** in your Shopify Admin
2. Click **Checkout** in the left navigation
3. Click **Customize** next to your desired checkout profile
**Option 2: From Aftersell**
1. Click the **Open Shopify Checkout Editor** button in the bottom right of the Aftersell Checkout editor page
💡 **Tip:** Option 1 gives you more control over which checkout profile you're editing. We recommend testing on a draft version first before setting it live.
***
## Step 3: Add the app block to your checkout
1. In the Shopify Checkout Editor, click **Add app block**
2. Select your desired Aftersell widget from the list of available widgets
3. Choose the correct placement for your widget (see [Placement options](#placement-options) below)
4. If you want your widgets to display in Shop Pay checkout, check the [**Include app block in Shop Pay**](/aftersell/show_checkout_widgets_in_shop_pay) option
5. Click **Save** in the top right corner
***
## Step 4: Position your widget
1. Drag and drop the app block to your desired location within the selected placement area
2. Click **Save** in the top right corner
***
## Widget types and configuration
## Placements
Placements are created in the Aftersell Checkout editor and allow you to run multiple widgets of the same type on the same checkout page.
For example, if you want to display two upsell offers on the same page, each must be assigned to a different placement.
### Available placements
* **Default placement**: The primary placement. Every widget type starts here.
* **Additional placement 1**: A second placement slot for displaying another widget of the same type on the same page.
* **Additional placement 2**: A third placement slot for further separation.
You can also create new placements directly from the placement dropdown in Aftersell by selecting **+ Add new placement**.
***
### When to use multiple placements
Use multiple placements when you want to:
* Display more than one widget of the same type on a single checkout page
* Show widgets in different sections of the page
* Target different audiences with different offers
* Run widgets with similar or overlapping triggers
Aftersell uses a priority system. You cannot run multiple widgets with identical triggers within the same placement. If two widgets share the same trigger conditions in one placement, only one will display based on priority.
To use similar triggers, assign each widget to a different placement so they can run independently without conflict.
***
## Matching placements in the Shopify Checkout Editor
Each placement in Aftersell corresponds to a separate app block in the Shopify Checkout Editor. The placement selected in Shopify must match the placement set in Aftersell.
For example, if a widget is assigned to **Additional placement 1** in Aftersell, the app block in Shopify must also be set to **Additional placement 1**.
If placements do not match, the widget may not appear or may display in the wrong location.
**Important:** A placement mismatch is one of the most common reasons a widget fails to display. If a widget is not appearing, confirm the placement matches in both Aftersell and Shopify before troubleshooting further.
***
### Upsells
Offer products to customers during checkout to increase your average order value (AOV).
**Configuration options:**
**Widget modes:**
* **Single Product Upsell:** Display one product with an Add to Cart button
* **Multi-Product Upsell:** Show multiple products in a stack or carousel layout, allowing customers to accept multiple offers
* **Checkmark Upsell:** Display a single product with a checkbox instead of an Add to Cart button (ideal for low-cost add-ons like shipping protection)
**Product selection methods:**
* **Specific Products:** Manually select individual products to upsell
* **Collection:** Select a collection and display up to 5 random products (products already in cart are automatically excluded)
* **AI Recommendations:** Automatically recommend products based on cart contents
* **Most Expensive Product:** Automatically upsell the most expensive product from the cart
* **Spend Threshold:** Recommend products that help customers reach reward thresholds (requires rewards bar)
**Additional features:**
* Add discounts directly within the widget
* Lock subscription plans to specific options
* Display product review stars (requires compatible review app)
* Set a maximum number of accepted offers per widget (Single and Multi upsell types only)
[Learn more about upsell widgets](/aftersell/checkout_widget_types#upsells)
***
### Cart Controls
Allow customers to modify their cart directly on the checkout page.
**Available controls:**
* **Variant selector:** Change to another in-stock variant
* **Quantity selector:** Adjust product quantities
* **Remove item:** Remove upsell products from cart
* **Subscription selector:** Change subscription frequency
* **Subscription upgrade:** Upgrade one-time purchases to subscriptions
* **Custom text:** Add custom text below line items
**Product targeting:**
* Apply to all products in cart
* Apply only to selected products
* Apply to all products except selected ones
**Additional features:**
* Display product review stars for in-cart products
[Learn more about cart controls](/aftersell/checkout_widget_types#cart-controls)
***
### Rewards
Display a progress bar showing customers how close they are to earning a reward.
**Configuration options:**
* Goal type: Order Value or Item Count
* Amount basis (for Order Value goals): Order total, Subtotal, or Post-discount subtotal
* Reward message and styling
* Progress bar colors and design
**Best practices:**
* Pair with upsell widgets to help customers reach reward thresholds
* Use spend threshold product type in upsells to automatically recommend products that close the gap
* Create rewards in Shopify using Automatic Discounts (for discount rewards) or Shipping Rules (for free shipping)
* Use **Post-discount subtotal** as the amount basis when offering free shipping, so the bar matches Shopify's own threshold evaluation when discount codes are applied
[Learn more about rewards](/aftersell/checkout_widget_types#rewards)
***
### Trust Badges
Build trust with custom icons and text to increase checkout conversion rates.
**Configuration options:**
* Badge layout: Vertical stack or horizontal display
* Custom icons and text for each badge
* Styling and spacing options
**Best practices:**
* Highlight security features (secure checkout, SSL encryption)
* Showcase guarantees (money-back guarantee, free returns)
* Display shipping benefits (free shipping, fast delivery)
[Learn more about trust badges](/aftersell/checkout_widget_types#trust-badges)
***
### Testimonials
Display customer reviews directly on checkout to build trust.
**Configuration options:**
* **Flex Testimonials (recommended):** Automatically pulls real reviews from your review app (Judge.me, Klaviyo, Okendo, or Yotpo)
* Selection mode: Manual (choose specific reviews) or Dynamic (automatically fetch reviews based on cart contents)
* Display type: Horizontal carousel or vertical stack
* Minimum rating filter
**Setup requirements:**
* Configure review app credentials in Settings > Product Reviews
* Reviews sync automatically within 24 hours, then weekly
[Learn more about testimonials](/aftersell/checkout_widget_types#testimonials)
***
### Notes
Allow customers to add notes to their order.
**Configuration options:**
* Manual notes: Free-text field for customer input
* Pre-written notes: Checkboxes for options like gift wrapping or eco-packaging
[Learn more about notes](/aftersell/checkout_widget_types#notes)
***
### Images
Upload and display custom images in your checkout.
**Configuration options:**
* Image upload
* Width adjustment slider
* No minimum size requirement
[Learn more about images](/aftersell/checkout_widget_types#images)
***
### Text
Insert a banner with custom text in your checkout.
**Configuration options:**
* Four banner styles:
* **Information:** Blue background with information icon
* **Success:** Green background with checkmark icon
* **Critical:** Red background with exclamation point icon
* **Warning:** Yellow background with warning triangle icon
* Header size, content size, and spacing adjustments
[Learn more about text](/aftersell/checkout_widget_types#text)
***
## Troubleshooting
### Widgets not displaying
If your widgets aren't showing after setup:
1. Verify widget is enabled in Aftersell admin
2. Check app block is added in Shopify Checkout Editor
3. Confirm app block is saved in Shopify Checkout Editor
4. Verify the correct placement is selected. When adding an app block in the Shopify Checkout Editor, you must choose the matching placement, such as Default placement, Additional placement 1, or Additional placement 2. If the wrong placement is selected, the widget may not appear or may display in the wrong location. Remove the app block and re-add it, ensuring the intended placement is selected.
5. For Shop Pay: Verify "Include app block in Shop Pay" is checked
6. Clear browser cache or try incognito mode
7. Wait a few minutes for changes to propagate
### Shop Pay widgets not showing
To display widgets in Shop Pay checkout:
1. Open the widget in Shopify Checkout Editor
2. Check the **Include app block in Shop Pay** option under Checkout behaviour
3. Save your changes
[Learn more about Shop Pay Widgets](/aftersell/show_checkout_widgets_in_shop_pay)
***
## Next steps
* [Learn about checkout triggers](/aftersell/checkout_triggers) to show widgets conditionally
* [Set up checkout A/B testing](/aftersell/checkout_a_b_testing) to optimize placements
* [Configure checkout branding](/aftersell/checkout_branding_settings) to match your store design
* [Explore advanced upsell strategies](/aftersell/best_practices) to maximize AOV
# How to configure fulfillment locations for post-purchase upsells
Source: https://docs.aftersell.com/aftersell/how_to_configure_fulfillment_locations_for_1_click_upsells
Adjust which location upsells are shipped from
Shopify follows a set of rules to determine which location an upsell order is shipped from.
Stores with two or more active locations should have access to [order routing](https://help.shopify.com/en/manual/fulfillment/setup/order-routing), which can be found in the Shopify admin under `Shipping & Delivery > Order Routing`. If you don't see this option, ensure you have at least two active locations. If you do, and the section is still missing, your store might be using the legacy Location Priority system, which is located under `Locations > Location Priority`.
Shopify applies these default rules for selecting a location for fulfillment as of the time of writing this article. If desired, an additional rule can be added to prioritize specific locations.
Another rule for upsells is that they will only ship from locations designated to fulfill online orders. This setting can be adjusted for each location in the Locations tab.
***
## Customizing Inventory Locations (Advanced)
In Aftersell, you can select which inventory locations are used for post-purchase upsells.
Please note that this is an advanced setting, which requires assistance from our support team to enable.
* Once added by our support team, you can find these inventory settings by navigating to **Aftersell > Settings > Inventory.**
This setting lets you specify which locations you'd like Aftersell to exclude from upselling. **By default, all locations can be sold from.**
**Important**: This setting only applies within Aftersell; however, Shopify ultimately determines the shipping location, and Aftersell cannot direct Shopify on which location to use.
For example, if you set Aftersell to exclude Warehouse A, it will only check inventory at Warehouses B and C when a customer is viewing an upsell offer. If inventory is available at either of those locations, Aftersell will present the offer. However, once the upsell is purchased, Shopify will decide on the shipping location based on the rules set in Order Routing. If location priorities are not aligned, Shopify may still ship from Warehouse A if it has stock, even though Aftersell excluded it for upsell offers.
To avoid this, ensure your Order Routing rules are properly configured to match your Aftersell inventory settings.
***
**Note:** Automatic Upsells use Shopify's Recommendation APIs, which don't allow filtering by inventory location. Aftersell checks stock by location afterward, but the initial recommendations from Shopify can't be limited to a specific location.\
You can read Shopify's documentation on this [here](https://shopify.dev/docs/storefronts/themes/product-merchandising/recommendations/related-products)
# How to configure post-purchase triggers
Source: https://docs.aftersell.com/aftersell/how_to_configure_post_purchase_triggers
Step-by-step guide to setting up and configuring post-purchase funnel triggers in Aftersell
Triggers control when and to whom your post-purchase funnels display. This guide walks you through configuring the most common trigger types and managing funnel priority.
For detailed information about what each trigger does, see the [Post-purchase Triggers reference](/aftersell/post_purchase_triggers).
***
## Getting started with triggers
When you create a new funnel, you'll need to configure at least one trigger to control when it displays. You can combine multiple triggers to create precise targeting rules.
### Where to find triggers
Triggers are configured inside each funnel, not from a global menu. To open them:
1. In the Aftersell admin, go to **Post-purchase Funnels**.
2. Click the funnel you want to edit (or click **Create Funnel** to start a new one).
3. In the funnel editor, open the **Triggers** section.
4. Click **Add Trigger** to add a new trigger, or click an existing trigger to edit it.
5. After making changes, click **Save Triggers**.
Each funnel has its own set of triggers — there are no shared or store-wide triggers.
### Where to find triggers
Triggers are configured inside each funnel, not from a global menu. To open them:
1. In the Aftersell admin, go to **Post-purchase Funnels**.
2. Click the funnel you want to edit (or click **Create Funnel** to start a new one).
3. In the funnel editor, open the **Triggers** section.
4. Click **Add Trigger** to add a new trigger, or click an existing trigger to edit it.
5. After making changes, click **Save Triggers**.
Each funnel has its own set of triggers — there are no shared or store-wide triggers.
### How triggers work together
Post-purchase triggers use two levels of logic: **AND between triggers** and **OR within triggers**.
**AND logic (between triggers)**
All enabled triggers must be met for the funnel to display. If you add multiple triggers, every one must return a match.
Example:
* Customer Location = US
* Order Value > \$50
The customer must be in the US **and** the order must exceed \$50.
**OR logic (within a trigger)**
Within a single trigger, only one selected option needs to match.
Example: Product Category = Shoes, Socks, or Pants. If the order contains any one of these, the trigger passes.
Some triggers (like Product Quantity) allow you to switch this to AND logic.
For a detailed explanation of trigger logic, see [Understanding Conditional Logic](/aftersell/understanding_conditional_logic_for_post_purchase_triggers).
***
## Show for all customers trigger
A "Catch-All" funnel uses the **Show for All Customers** trigger. This funnel activates when an order does not meet the criteria for any other funnel. It serves as a safety net, ensuring no orders slip through without an upsell or Thank You page offer.
To use it effectively, set this funnel to the lowest priority so it only appears if no other funnel triggers.
**Example use cases:**
* You have three funnels: one for orders over \$100, one for specific products, and one with the Show for All Customers trigger. If a customer places an order that doesn't meet the first two funnels' criteria, the Show for All Customers funnel will activate as a fallback.
* You want to ensure every customer sees at least one offer. Create a funnel with the Show for All Customers trigger and set it to the lowest priority.
***
## Product-based triggers
These triggers activate based on the products, collections, or variants in a customer's cart.
Ensure proper configuration to prevent hidden or wholesale-only products from appearing unexpectedly in recommendations. This includes reviewing Shopify's Product Recommendation logic and restricting such products at the add-to-cart stage.
Use the **Product/Collection** trigger to display your funnel when specific products or collections are purchased.
**To configure:**
1. In your funnel settings, click **Add Trigger**.
2. Select **Product/Collection** from the trigger type dropdown.
3. Choose **Contains** or **Does not contain**.
4. Search for and select the products or collections you want to target.
5. Click **Save**.
**Example use cases:**
* Show a protein powder upsell when customers purchase any product from your "Supplements" collection.
* You have a funnel set to products X, Y, and Z. If a customer buys products A, B, and Y, this funnel will activate. If they buy A, B, and C, it will not.
Use the **Product Quantity** trigger to display an offer based on how many of a specific product are in the cart.
**To configure:**
1. Click **Add Trigger**.
2. Select **Product Quantity** from the trigger type dropdown.
3. Choose **Less than** or **More than**.
4. Enter the quantity threshold and select the product.
5. Click **Save**.
**Example use cases:**
* Set to "less than 3" for Product X. If a customer buys 2 units, the funnel activates. If they buy 3 or more, it does not.
* Set to "more than 1" for Product Y. If a customer buys 2 or more units, the funnel activates. If they buy only 1, it does not.
Use the **Product Tag** trigger to display an offer when products with certain Shopify tags are included in the order.
**To configure:**
1. Click **Add Trigger**.
2. Select **Product Tag** from the trigger type dropdown.
3. Choose **Include** or **Exclude**.
4. Enter the product tag(s) you want to target.
5. Click **Save**.
**Example use cases:**
* Exclude discontinued products from receiving upsell offers by setting the trigger to exclude products tagged "discontinued."
* Show a special offer only for products tagged "summer-collection."
Use the **Product Type** trigger to display an offer when purchased products belong to a defined Shopify product type.
**To configure:**
1. Click **Add Trigger**.
2. Select **Product Type** from the trigger type dropdown.
3. Choose **Include** or **Exclude**.
4. Enter the product type(s) you want to target.
5. Click **Save**.
**Example use case:** If you set the trigger to "Shoes," any time a customer purchases a product of type Shoes, the funnel will display. If they purchase a t-shirt (type: Apparel), the funnel will not display.
Use the **Metafields** trigger to display funnels based on custom metafield data associated with products or variants. You can choose between product metafields or variant metafields, but only one type can be matched at a time.
**To configure:**
1. Click **Add Trigger**.
2. Select **Metafields** from the trigger type dropdown.
3. Choose **Include** or **Exclude**.
4. Enter the metafield **name** and **value** exactly as they appear on the product page (both are case-sensitive).
5. Click **Save**.
**How it works:**
* **Include** means there's an overlap between the metafields in the order and those in the trigger list. For example, if the order metafields are `["color: red", "size: m"]` and the trigger list is `["color: red", "ship: warehouse"]`, the condition is satisfied because `color: red` matches.
* **Exclude** means there's no overlap between the metafields in the order and the trigger list. For example, if order metafields are `["color: red", "size: M"]` and the trigger list is `["color: blue", "size: L"]`, the condition is satisfied because there are no matching name:value pairs.
This trigger is especially useful if you use metafields to store detailed product information like materials, sizing, or special attributes.
Use the **Product/Collection Exclusion** trigger to prevent a funnel from displaying when excluded products or collections are present in the cart.
**To configure:**
1. Click **Add Trigger**.
2. Select **Product/Collection Exclusion** from the trigger type dropdown.
3. Search for and select the products or collections to exclude.
4. Click **Save**.
**Example use case:** If a customer has purchased from a heavily discounted product or collection, you may prefer not to show further offers. You can also combine this trigger with the Product/Collection trigger to ensure only selected products activate the funnel while others are excluded.
Use the **Subscription** trigger to display an offer based on whether a subscription product is included in the order.
**To configure:**
1. Click **Add Trigger**.
2. Select **Subscription** from the trigger type dropdown.
3. Choose **Contains** or **Does not contain** subscription products.
4. Click **Save**.
**Example use cases:**
* Set to "Does not contain" subscription products to target one-time purchasers and offer them a subscription upsell.
* Set to "Contains" subscription products to show complementary one-time products to subscribers.
Shopify only supports one subscription product per order, so you cannot upsell a subscription if the original order already includes one.
Use the **Variant on subscription** trigger to display a funnel when the order includes any of the selected products purchased as a subscription. Unlike the Subscription trigger, this trigger matches on a specific product being purchased on a subscription line item — a one-time purchase of the same product does not activate the funnel.
**Managed by the subscription upgrade wizard**
When a funnel has a subscription upgrade offer configured, this trigger is managed automatically by the wizard and kept in sync with the upgrade's source product. The trigger is read-only while the upgrade offer is present. It unlocks if the upgrade offer is removed.
**Manual configuration (funnels without a subscription upgrade offer)**
1. Click **Add Trigger**.
2. Select **Variant on subscription** from the trigger type dropdown.
3. Click **Select** to open the product picker (filtered to subscription products only).
4. Choose the subscription product(s) you want to target.
5. Click **Save**.
**Example use cases:**
* Show a subscription upgrade offer only to customers who subscribe to a specific product, without triggering for one-time purchases of the same product.
* Target customers subscribing to any of several products by selecting multiple products in the trigger.
If a funnel has a subscription upgrade offer, the Variant on subscription trigger is read-only and managed by the wizard. To edit it manually, remove the subscription upgrade offer first.
Use the **Variant Name** trigger to display specific funnels based on the product variant selected by the customer at checkout (e.g., size, color, style).
**To configure:**
1. Click **Add Trigger**.
2. Select **Variant Name** from the trigger type dropdown.
3. Choose **Include** or **Exclude**.
4. Enter the variant name(s) you want to target.
5. Click **Save**.
**Example use cases:**
* Set to include "Large." If a customer purchases a t-shirt in size Large, the funnel activates. Size Small or Medium will not trigger it.
* Set to include "Red" and "Blue." Either color variant will activate the funnel; Green will not.
***
## Cart & discount triggers
These triggers activate based on cart value, contents, or discounts applied.
Use the **Order Value** trigger to target customers based on their cart total.
**To configure:**
1. Click **Add Trigger**.
2. Select **Order Value** from the trigger type dropdown.
3. Choose **Greater than** or **Less than**.
4. Enter the dollar amount threshold.
5. Click **Save**.
**Example use cases:**
* Show premium upsells to customers with orders over \$100.
* Offer free shipping upgrades to customers with orders under \$50.
* A funnel set to "less than \$50.00" will activate for a \$30.00 order but not a \$60.00 order.
Use the **Quantity** trigger to show an upsell offer based on the total item count in a customer's order. This trigger counts all items across every product in the cart, regardless of which specific products they are.
**To configure:**
1. Click **Add Trigger**.
2. Select **Quantity** from the trigger type dropdown.
3. Choose **More than**, **Less than**, or **Exactly**.
4. Enter the item count threshold.
5. Click **Save**.
**Example use cases:**
* Set to "less than 3" - the upsell appears only when there are 1 or 2 total items in the cart.
* Set to "more than 1" - the funnel triggers for orders with 2 or more total items.
* Set to "exactly 3" - the funnel triggers only when there are exactly 3 total items in the cart.
If you need to trigger based on the quantity of a specific product rather than total cart item count, use the Product Quantity trigger instead.
Use the **Discount Code** trigger to include or exclude customers from seeing a funnel based on a discount code they applied. You can also exclude all orders that used any manually-entered discount code, without specifying individual codes.
**To configure:**
1. Click **Add Trigger**.
2. Select **Discount Code** from the trigger type dropdown.
3. Choose one of the three options:
* **Includes** — the funnel shows only when the order includes one of the specified codes.
* **Excludes** — the funnel shows only when none of the specified codes were applied.
* **Excludes any manual discount code** — the funnel shows only when no manually-entered discount code was used at checkout. Automatic and script discounts are ignored, so a site-wide automatic discount will not suppress the funnel.
4. For **Includes** or **Excludes**, enter the discount code(s), pressing **Enter** after each one to save it. No codes are needed for **Excludes any manual discount code**.
5. Click **Save**.
**Example use cases:**
* Show a funnel only to email subscribers by including their specific discount code.
* Exclude all orders that used any manually-entered discount code to prevent upsell offers from showing to customers who already received a discount.
Be sure to press **Enter** after entering a discount code to save it in the funnel.
Use the **Discount Percent** trigger to include or exclude customers from viewing a funnel based on the discount percentage applied to their order.
**To configure:**
1. Click **Add Trigger**.
2. Select **Discount Percent (%)** from the trigger type dropdown.
3. Choose **Include** or **Exclude**, then choose **Greater than** or **Less than**.
4. Enter the discount percentage threshold.
5. Click **Save**.
**Example use cases:**
* Set to exclude discounts "greater than 20%." A customer with a 25% discount won't see the funnel; one with 15% or no discount will.
* Set to include discounts "less than 10%." A customer with a 5% discount will see the funnel; one with 15% will not.
***
## Customer attribute triggers
These triggers use customer data to control funnel visibility.
Use the **Customer Tag** trigger to include or exclude customers from seeing a funnel based on their associated Shopify customer tags.
**To configure:**
1. Click **Add Trigger**.
2. Select **Customer Tag** from the trigger type dropdown.
3. Choose **Include** or **Exclude**.
4. Enter the customer tag(s) you want to target.
5. Click **Save**.
**Example use cases:**
* Set to include "VIP." Only customers with the VIP tag will see the funnel.
* Set to exclude "Wholesale." Wholesale customers won't see retail upsells.
Use the **Customer Order History** trigger to create offers based on a customer's past purchases of specific products.
**To configure:**
1. Click **Add Trigger**.
2. Select **Customer Order History** from the trigger type dropdown.
3. Search for and select the specific products to check for in past orders.
4. Click **Save**.
You must select specific products when using this trigger. If you don't, it will only display "Customer previously ordered \_\_\_\_" without applying any action. If your goal is simply to check whether a customer has ordered before, use the Customer Order Count trigger instead.
This trigger reviews only past orders, not the current order.
Use the **Customer Order Count** trigger to display a funnel specifically for new or returning customers based on how many orders they've previously placed.
**To configure:**
1. Click **Add Trigger**.
2. Select **Customer Order Count** from the trigger type dropdown.
3. Choose **Equal to**, **Greater than**, or **Less than**.
4. Enter the order count threshold.
5. Click **Save**.
**Example use cases:**
* Set to "equal to 0" to target first-time customers only.
* Set to "greater than 3" to target loyal customers who have placed 4 or more previous orders.
* More than 0 orders = returning customer; 0 orders = new customer.
This trigger is based on past purchases, not the current order.
Use the **Customer Language** trigger to tailor offers based on the customer's preferred language. If your store serves customers in more than one language, you can create a separate funnel for each one and display the right offer based on the language the customer checked out in.
**To configure:**
1. Click **Add Trigger**.
2. Select **Customer Language** from the trigger type dropdown.
3. Select the language you want to target.
4. Click **Save**.
**Setting up a multi-language funnel**
Start by creating a funnel for your first language, then duplicate it for each additional language. Rename each funnel so it's easy to identify, update its Customer Language trigger to match, and manually translate all available text fields, including the product title, description, timer, and any custom text widgets.
**Current limitations**
Some elements are controlled globally through the **Translations** section in Aftersell's **Settings**, meaning they can only be set to one language at a time. Changing these will affect all funnels regardless of language.
The Shopify controlled header at the top of the post-purchase page will automatically display in the customer's checkout language. This includes text like "You've paid for your order." and cannot be customized through Aftersell.
Use the **Once per Customer** trigger to ensure a funnel only shows once per customer across all of their orders.
**To configure:**
1. Click **Add Trigger**.
2. Select **Once per Customer** from the trigger type dropdown.
3. Click **Save**.
**Example use cases:**
* A customer who sees this funnel after their first purchase will not see it again on any future purchases, even if all other trigger conditions are met.
* Use it to show a special "welcome offer" exclusively on a customer's first purchase.
***
## Order details & time-based triggers
These triggers depend on checkout details, marketing data, or timing.
Use **UTM Parameter** triggers to display specific funnels based on marketing campaign parameters in the URL.
**To configure:**
1. Click **Add Trigger**.
2. Select **UTM Parameter** from the trigger type dropdown.
3. Choose the UTM parameter type (source, medium, campaign, term, content, or id).
4. Enter the exact value to match.
5. Click **Save**.
**Example use cases:**
* Set to "utm\_source = facebook." Customers arriving via a Facebook link will see the funnel; others will not.
* Set to "utm\_campaign = summer\_sale" to show campaign-specific offers to customers from that campaign.
* Show exclusive offers to customers arriving from your email campaign by targeting `utm_source=email`.
For advanced UTM tracking setup, see [How to use Direct-to-Checkout UTM Links](/aftersell/how_to_use_direct_to_checkout_utm_links).
UTM triggers do not fire when customers use express checkout methods (Shop Pay, Apple Pay, Google Pay, PayPal, etc.) because express checkout bypasses the standard cart flow where UTM parameters are captured. If you're using UTM triggers for campaign tracking, consider using other trigger types (product, collection, order value) as alternatives, or creating separate funnels for general traffic that don't rely on UTM parameters.
Use the **Currency** trigger to control whether customers see a funnel based on the currency they use at checkout.
**To configure:**
1. Click **Add Trigger**.
2. Select **Currency** from the trigger type dropdown.
3. Choose **Include** or **Exclude**.
4. Select the currency or currencies you want to target.
5. Click **Save**.
**Example use cases:**
* Set to "USD." Customers checking out in US Dollars will see the funnel; those in EUR, GBP, or others will not.
* Set to "CAD" and "USD." Customers in either currency will see the funnel.
**Important notes:**
* Thank You Page offers automatically adjust to the customer's checkout currency, making a single funnel viable across markets.
* Post-purchase upsells do not support multi-currency. Customers will not see upsell offers unless your store currency matches their checkout currency. Use Thank You Page offers for universal visibility.
* If your store uses **Shopify Markets**, Aftersell integrates seamlessly to display products in the correct local currency.
Use the **Device Type** trigger to scope a funnel to customers on a specific device — Desktop only or Mobile only.
**To configure:**
1. Click **Add Trigger**.
2. Select **Device Type** from the trigger type dropdown.
3. Choose **Desktop only** or **Mobile only**.
4. Click **Save**.
**Example use cases:**
* Set to **Desktop only** to show an offer that works best on larger screens, such as a detailed product comparison or multi-image layout.
* Set to **Mobile only** to target customers browsing on their phone with a mobile-optimized offer.
* Combine with other triggers (e.g., Order Value) to show a desktop-only offer to high-value customers.
If a customer's device type cannot be detected, the trigger fails closed and the funnel will not display. This matches the behavior of other triggers when required data is unavailable.
Use the **Shipping Country** trigger to include or exclude customers based on their shipping destination.
**To configure:**
1. Click **Add Trigger**.
2. Select **Shipping Country** from the trigger type dropdown.
3. Choose **Include** or **Exclude**.
4. Select the countries you want to target.
5. Click **Save**.
**Example use cases:**
* Exclude international shipping for products only available domestically.
* Show region-specific products to customers in certain countries.
* Create country-specific Thank You Page offers (since Post-purchase upsells don't display for non-default currencies).
Use the **Random Sample** trigger to control funnel visibility for a random subset of customers. This is ideal for A/B testing new funnels or surprising a select group with special offers.
**To configure:**
1. Click **Add Trigger**.
2. Select **Random Sample** from the trigger type dropdown.
3. Enter the percentage of customers who should see the funnel.
4. Click **Save**.
**Example use cases:**
* Set to "25%." The funnel randomly activates for approximately 25% of qualifying customers.
* For A/B testing, create two funnels each with a Random Sample trigger set to "50%." Each funnel will show to roughly half your customers.
Use the **Date/Time** trigger to schedule funnel visibility based on specific dates and times, ideal for time-sensitive promotions, seasonal campaigns, or limited-time deals.
**To configure:**
1. Click **Add Trigger**.
2. Select **Date/Time** from the trigger type dropdown.
3. Use the date picker to select your start date, end date, or both.
4. Use the timezone dropdown to select the timezone your schedule should follow (for example, "GMT-07:00 - (MST) America/Phoenix").
5. Click **Save**.
**Example use cases:**
* Set to activate "between December 1 and December 25" for a holiday promotion.
* Set to activate "after January 1, 2026" to launch a new year promotion.
* Set a start and end date in your store's local timezone to run a weekend flash sale from Friday 12:00 AM to Sunday 11:59 PM.
The timezone you select determines when the trigger starts and stops. Choose the timezone that matches your store's primary market or promotion schedule.
Use the **Shipping Method** trigger to control funnel visibility based on the customer's chosen shipping option at checkout (e.g., standard, expedited, international, pickup).
**To configure:**
1. Click **Add Trigger**.
2. Select **Shipping Method** from the trigger type dropdown.
3. Choose **Include** or **Exclude**.
4. Select the shipping method(s) you want to target.
5. Click **Save**.
**Example use cases:**
* Show an expedited delivery upgrade upsell only to customers who selected standard shipping.
* Exclude "Local Pickup" customers from seeing shipping protection or delivery-related upsells.
* Target customers who chose international shipping with a customs-friendly product bundle.
The shipping method names in Aftersell match the shipping rate names configured in your Shopify admin. Make sure the names in your trigger exactly match your Shopify shipping rate names.
***
## Managing funnel priority
When you have multiple funnels, priority determines which funnel displays when multiple funnels' triggers are met.
**How funnel priority works:**
* Funnels are evaluated in priority order: Priority 1 → Priority 2 → Priority 3, etc.
* The first funnel whose triggers are all met will display.
* Lower priority funnels are only checked if higher priority funnels don't match.
* Smart Funnel (if enabled) is evaluated at Priority 0, before all manual funnels.
### Viewing funnel priority
You can see each funnel's current priority number on the left side of the funnel table in the **Post-purchase Funnels** section.
### Reordering funnels
1. Go to **Post-purchase Funnels** in the Aftersell admin.
2. Click the **Manage Priority** button at the top right of the funnel table.
3. Drag and drop funnels to reorder them.
4. Click **Save** to apply the new priority order.
**Best practices for funnel priority:**
* **Place specific funnels first** - Put funnels with narrow targeting (specific products, high-value orders) at higher priority.
* **Place broad funnels last** - Put funnels with general targeting (collections, low order values) at lower priority.
* **Set Catch-All funnel to lowest priority** - If you have a "Show for All Customers" funnel, make it the last priority so it only displays when no other funnel matches.
* **Test your priority order** - Place test orders to verify the correct funnel displays for different scenarios.
**Example priority structure:**
* Priority 1: High-value orders (\$200+) with specific product
* Priority 2: Orders containing products from premium collection
* Priority 3: Orders with any product from main category
* Priority 4: Catch-All funnel (Show for All Customers)
***
## Combining multiple triggers
You can add multiple triggers to a single funnel to create precise targeting rules. Remember: all triggers must be met for the funnel to display.
### Example: targeting high-value supplement customers
Add these triggers to the same funnel:
* **Product/Collection trigger:** Contains products from "Supplements" collection
* **Order Value trigger:** Greater than \$75
* **Customer Order Count trigger:** More than 0 orders (returning customers only)
This funnel will only display to returning customers who purchase supplements and have a cart value over \$75.
### Example: targeting customers who haven't purchased specific upgrades
This is useful when you sell products with optional upgrades and want to show different upsells depending on what the customer has and hasn't already purchased.
**Scenario:** You sell a base product with two optional upgrades - "Premium Rotor" and "Water Resistance."
**Funnel 1 - Customer bought neither upgrade (highest priority)**
* No product exclusions needed
* Set to **highest priority** so it is evaluated first
* This funnel shows both upgrades as upsell options
**Funnel 2 - Customer bought Premium Rotor but not Water Resistance**
* Add a **Product/Collection trigger** set to **Contains** "Premium Rotor"
* Add a **Product/Collection Exclusion trigger** set to exclude "Water Resistance"
* This funnel shows only the Water Resistance upsell
**Funnel 3 - Customer bought Water Resistance but not Premium Rotor**
* Add a **Product/Collection trigger** set to **Contains** "Water Resistance"
* Add a **Product/Collection Exclusion trigger** set to exclude "Premium Rotor"
* This funnel shows only the Premium Rotor upsell
Funnel priority is critical here. If Funnel 1 is not set to the highest priority, Aftersell may match a single-upgrade funnel first for customers who bought neither upgrade, resulting in only one upsell being shown instead of both.
***
## Next steps
* Learn about all available trigger types in the [Post-purchase Triggers reference](/aftersell/post_purchase_triggers)
* Understand how triggers work together with [Understanding Conditional Logic](/aftersell/understanding_conditional_logic_for_post_purchase_triggers)
* Set up your first funnel with the [Quickstart Guide](/aftersell/quickstart_guide_to_aftersell)
* Review [Best Practices](/aftersell/best_practices) for optimizing your funnel strategy
# How to create a multi-step post-purchase upsell
Source: https://docs.aftersell.com/aftersell/how_to_create_a_multi_step_post_purchase_upsell
This article covers how to display more than two post-purchase upsell pages to customers.
Due to [Shopify post-purchase API limitations](https://shopify.dev/docs/apps/build/checkout/product-offers#limitations-and-considerations), a customer can accept up to two post-purchase upsells. Additionally, customers can only select one product per upsell step due to platform restrictions. However, with Aftersell's multi-step setting, you can display more than two upsell pages to the customer. Multi-step offers split up each page into multiple steps, allowing customers to potentially select products across different steps.
[Analytics](#analytics)
[Best practices](#best-practices)
[Design](#design)
[Steps to set up a multi-step post-purchase upsell](#steps-to-set-up-a-multi-step-post-purchase-upsell%3A)
# Steps to set up a multi-step post-purchase upsell:
* Create a **Multi Product** upsell
* Click *Edit offer > Upsell products > Enable multi-step upsell*
* Click *Add step*
Drag and drop a product to the new step
# Accepting or declining a step
A customer begins on the first step of a page. If they decline, they move to the next step. If they decline the final step, they are taken to the next page. If they accept a step, they are directed to the next page where they can consider additional offers. This sequential approach allows customers to potentially accept products across different upsell pages.
***
# Analytics
You can use product-specific analytics to measure the performance of multi-step post-purchase upsells. These can be found under Top performing products on the Aftersell analytics page or in the Product breakdown for an A/B test.
An impression for a product in a multi-step upsell is only tracked once that product is shown. For example, if a Green Shirt is in Step 3 but the customer accepts Step 2 and never sees Step 3 then there will be no impression tracked for the Green Shirt.
The overall page (e.g., Upsell #1) will track exactly 1 impression even if there are multiple steps.
***
# Design
## How to add custom text on each step:
To show different text for each step, you can use the step text variables. These variables provide text that can be used in other widgets that will automatically update when the step changes.
1. Click *Step 1 > ... > Show text* and write "`` `{first-name}` ``, grab this deal in the next `` `{timer}` `` minutes!" in *Variable `` `{step-header-A}` ``*
2. Repeat for Step 2 and write "No worries, how about this one instead? (`` `{timer}` ``)"
3. In the Timer widget, replace the text with "`` `{step-header-A}` ``". This will automatically show the text from the current step in the timer and change when the customer goes to the next step.
## Steps with only one product each:
To create nice-looking steps with only one product each, you can enable *Edit offer > Upsell products > Layout settings > Spotlight first product*. We recommend also enabling the price breakdown, product reviews, and adding custom text for each product.
# Best practices
* Any page, including Upsell #1, Upsell #2, or Downsell, can utilize multi-step sequences. You can also combine different formats, such as having a multi-step Upsell #1 and a single-step Upsell #2. However, multi-step functionality is only available for Multi-Product upsells and is not supported for Single Product upsells.
* We recommend keeping the number of steps minimal to provide a smooth customer experience.
* While Aftersell does not limit the number of steps you can create, there is a cap of 12 products per page. This allows flexibility, such as creating a page with up to 12 steps, each featuring one product, or 4 steps with 3 products each, and so on.- Consider using sequential offer displays to guide customers through a logical progression of complementary products.
* Customize your flow design to optimize customer engagement based on your specific product relationships.
# Frequently asked questions
## Do customers need to decline one offer to see the next?
When using multi-step upsells, customers who decline an offer will automatically move to the next step in the sequence. If they accept an offer, they will move to the next upsell page in your sequence.
## Can customers select more than one product in a single step?
No, due to platform restrictions, only one product can be selected per upsell step. This is why the multi-step feature is valuable, it enables customers to potentially select multiple products through a sequential approach.
# How to install Rokt Thanks on Tapcart
Source: https://docs.aftersell.com/aftersell/how_to_install_rokt_thanks_on_tapcart
A Setup Guide for TapCart App Studio
## What is Rokt Thanks?
Rokt Thanks displays personalized, non-intrusive offers to your customers on the post-purchase confirmation screen. It's a simple way to generate passive revenue from every order without impacting the customer experience.
This guide walks through how to install Rokt Thanks within your TapCart mobile app using a Custom Code Block. The setup takes just a few minutes.
## Before you start
You will need the following:
* **TapCart Enterprise plan** - Custom Code Blocks are only available on Enterprise. If you're unsure about your plan, check with your TapCart account rep.
* **Your Rokt Account ID** - your Aftersell account manager will provide this. If you don't have it yet, just reach out and we'll send it over.
## Step 1: Create a Custom Block
Log in to your TapCart dashboard and open the App Studio editor. Create a new Custom Block.
## Step 2: Paste the code snippet
In the Custom Block editor, switch to the Dev section. Clear any placeholder code and paste the snippet below:
```jsx theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
import * as React from "react"
export default function RoktPlacement({
blockConfig,
tapcartData,
translations,
pageState,
useActions,
}) {
const containerRef = React.useRef(null)
React.useEffect(() => {
const loadRokt = async () => {
try {
await new Promise((resolve, reject) => {
if (document.getElementById("rokt-launcher")) {
resolve()
return
}
const script = document.createElement("script")
script.type = "text/javascript"
script.src =
"https://apps.rokt.com/wsdk/integrations/launcher.js"
script.fetchPriority = "high"
script.crossOrigin = "anonymous"
script.async = true
script.id = "rokt-launcher"
script.addEventListener("load", () => resolve())
script.addEventListener("error", (error) => reject(error))
document.head.appendChild(script)
})
const launcher = await window.Rokt.createLauncher({
accountId: "YOUR_ACCOUNT_ID",
sandbox: true,
})
await launcher.selectPlacements({
identifier: "TapCart.success",
attributes: {
email: tapcartData?.customer?.email || "",
firstname:
tapcartData?.customer?.firstName || "",
lastname:
tapcartData?.customer?.lastName || "",
},
})
} catch (error) {
console.error("Rokt SDK failed to load:", error)
}
}
loadRokt()
}, [])
return
}
```
### Replace Your Account ID
In the snippet above, find the line `accountId: "YOUR_ACCOUNT_ID"` and replace `YOUR_ACCOUNT_ID` with the Account ID provided by your Aftersell account manager.
Once updated, save the Custom Block.
## Step 3: Add to your Post Purchase page
Navigate to your Post Purchase page in TapCart's visual editor. Drag the Custom Block you just created onto the page and drop it wherever you'd like the offers to appear.
## Step 4: Let us know
Once you've completed the steps above, let your Aftersell account manager know. We'll finalize a quick configuration on our end and confirm when everything is live.
The snippet is initially set to sandbox mode, which loads test offers so you can preview the placement. Once we've confirmed everything looks good together, we'll switch it to live and you'll start earning revenue.
## Summary
| Step | Action |
| ---- | --------------------------------------------------------------------------------------------------- |
| 1 | Create a Custom Block in TapCart's App Studio editor |
| 2 | Paste the code snippet into the Dev section (replace `YOUR_ACCOUNT_ID` with your actual Account ID) |
| 3 | Drag the Custom Block onto your Post Purchase page |
| 4 | Notify your Aftersell account manager so we can finalize setup |
## Frequently asked questions
**Do I need to be on TapCart Enterprise?**
Yes. Custom Code Blocks in App Studio require TapCart's Enterprise plan.
**Will this slow down my app?**
No. The script loads asynchronously and won't block your page from rendering.
**Can I choose where the offer appears on the page?**
Absolutely. Once the Custom Block is saved, you can drag it to any position on your Post Purchase page using TapCart's visual editor.
**What kind of offers will my customers see?**
Rokt Thanks serves relevant, non-intrusive offers from premium advertisers tailored to each customer.
# How to use direct-to-checkout UTM links
Source: https://docs.aftersell.com/aftersell/how_to_use_direct_to_checkout_utm_links
Learn how to trigger post-purchase funnels using UTM parameters, including setup for direct-to-checkout links
Aftersell supports triggering funnels based on UTM parameters, which is an optional feature specifically intended for advanced use cases. You can configure your funnel to activate when a customer visits your site with a specific UTM query string.
This setup is optional and typically required only for advanced tracking needs, such as direct-to-checkout links or campaign-specific offers.
## How UTM triggers work
UTM triggers allow you to show specific post-purchase funnels based on UTM parameters in the URL. This is useful for:
* **Campaign-specific offers** - Show different upsells based on the marketing campaign
* **Direct-to-checkout links** - Trigger funnels when customers skip the storefront
* **Channel attribution** - Personalize offers based on traffic source (email, social media, ads)
* **A/B testing** - Test different offers for different campaign variations
## Quick start: Basic UTM trigger setup
For standard storefront visits (not direct-to-checkout), you can set up UTM triggers using the Aftersell app embed. To see how to quickly get started with UTM triggers, check out this video:
### Enable the UTM app embed
To track UTM parameters on storefront pages:
1. In your Shopify admin, go to **Online Store > Themes**
2. Click **Customize** on your active theme
3. In the theme editor, click the **App embeds** icon (puzzle piece) in the left sidebar
4. Find **Aftersell UTM Tracker** and toggle it **on**
5. Click **Save**
Once enabled, Aftersell will automatically capture UTM parameters when customers visit your storefront with UTM links.
### Configure UTM triggers in your funnel
After enabling the app embed:
1. Go to **Post-purchase Funnels** in the Aftersell admin
2. Create or edit a funnel
3. In the **Triggers** section, add a **UTM Parameter** trigger
4. Configure the UTM parameter and value you want to match
5. Save your funnel
## Supported UTM parameters
Aftersell supports the following standard UTM parameters:
* `utm_source` - Identifies the traffic source (e.g., google, newsletter, facebook)
* `utm_medium` - Identifies the marketing medium (e.g., email, cpc, social)
* `utm_campaign` - Identifies the specific campaign (e.g., spring\_sale, product\_launch)
* `utm_term` - Identifies paid search keywords (e.g., running+shoes)
* `utm_content` - Differentiates similar content or links (e.g., banner\_ad, text\_link)
* `utm_id` - Identifies the campaign ID (e.g., campaign\_123)
All six parameters are tracked and can be used to trigger funnels.
## Partial field matching
When configuring UTM triggers, Aftersell supports **partial matching** for UTM parameter values. This means:
* ✅ **Trigger value:** `spring` → **Matches:** `spring_sale`, `spring_2026`, `early_spring`
* ✅ **Trigger value:** `email` → **Matches:** `email_newsletter`, `promotional_email`
* ✅ **Trigger value:** `sale` → **Matches:** `spring_sale`, `flash_sale`, `sale_2026`
This flexibility allows you to create broader triggers that match multiple campaign variations without creating separate triggers for each one.
**Example:** If you set a trigger for `utm_campaign` contains `sale`, it will match any campaign with "sale" in the name, such as `spring_sale`, `summer_sale`, or `flash_sale_2026`.
## Direct-to-checkout UTM links
The basic setup shown in the video above does **not** support links that send customers **directly to checkout**. By default, Aftersell can only detect UTM parameters on storefront pages. This is because it relies on a theme app embed, which works only on storefront pages and not on the checkout or thank-you page.
### Enable UTM tracking on checkout pages
To track UTM parameters on the checkout page (for direct-to-checkout links), you need to **add a Shopify Pixel** to your store.
⚠️ **Important limitations:**
* This setup requires the visitor to have a **cart token** when they arrive at checkout through a UTM link. Without a cart token, the UTM data will not be captured.
* **Express checkout methods (Shop Pay, Apple Pay, Google Pay) are not supported** because they bypass the cart and do not generate a cart token. Customers using express checkout will not trigger UTM-based funnels.
### Setting up the Shopify pixel
Follow these step-by-step instructions to set up direct-to-checkout UTM tracking:
1. In your Shopify admin, go to **Settings > Customer Events**.
2. Click **Add Custom Pixel** and give it any name you like.
3. Under the **Permission** dropdown, select **Analytics**. This is the only permission required.
4. For the **Data Sale** dropdown, you can choose **Data collected does not qualify as data sale**. Aftersell keeps all collected data private and never shares it with anyone other than you.
5. In the code editor that appears, paste in the code provided below.
6. Click **Save**, then **Connect**.
```text theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
/**
* IMPORTANT: This pixel can only fire on sessions where the
* customer has a cart object, otherwise it will be skipped.
* For example, clicking "Buy Now" on a product page skips the cart,
* going directly to checkout.
**/
function processData({event, cartToken}) {
// TODO: Edit MYSHOPIFY_DOMAIN to your domain. E.g.
// const MYSHOPIFY_DOMAIN = 'example-store.myshopify.com';
const MYSHOPIFY_DOMAIN = '';
const enableDebug = false;
// DO NOT EDIT PAST HERE
const SESSION_STORAGE_KEY = 'as-customer-trigger-data';
const HOST = 'https://start.aftersell.app';
if (!MYSHOPIFY_DOMAIN) {
if (enableDebug) {
console.log("UTM pixel didn't fire because of missing Shopify domain");
}
return;
}
if (!cartToken) {
if (enableDebug) {
console.log("UTM pixel didn't fire because of missing cart token");
}
}
let existingCustomerData = null;
try {
existingCustomerData = JSON.parse(
sessionStorage.getItem(SESSION_STORAGE_KEY) || 'null'
);
} catch (ignore) {
if (enableDebug) {
console.log("UTM pixel didn't fire because malformed user data json");
}
}
const allowedUrlParams = [
'utm_source',
'utm_medium',
'utm_campaign',
'utm_term',
'utm_id',
'utm_content',
];
const searchParams = new URLSearchParams(event.context.window.location.search);
let hasCustomerData = false;
const customerData = {};
for (const param of allowedUrlParams) {
const paramValue = searchParams.get(param) || existingCustomerData?.[param];
if (paramValue) {
hasCustomerData = true;
customerData[param] = paramValue;
}
}
if (hasCustomerData) {
sessionStorage.setItem(SESSION_STORAGE_KEY, JSON.stringify(customerData));
const postBody = {
shop: MYSHOPIFY_DOMAIN,
cartToken,
checkoutToken: event.data.checkout.token ?? undefined,
customerTriggerData: customerData,
};
if (enableDebug) {
console.log("UTM pixel fired with the following data:", postBody);
}
fetch(`\${HOST}/api/v1/storefrontSessions`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(postBody),
});
} else {
if (enableDebug) {
console.log("UTM pixel didn't fire because there was no data to send");
}
}
}
analytics.subscribe('checkout_started', (event) => {
// minimum realistic time between adding item to cart and clicking checkout
const COOKIE_POLLING_INTERVAL_MS = 500;
let currentCookieValue = getCookieValue({ cookie: document.cookie, cookieName: 'cart' });
processData({event, cartToken: currentCookieValue});
setInterval(() => {
const newCookieValue = getCookieValue({ cookie: document.cookie, cookieName: 'cart' });
if (newCookieValue !== currentCookieValue) {
currentCookieValue = newCookieValue;
processData({event, cartToken: newCookieValue});
}
}, COOKIE_POLLING_INTERVAL_MS);
});
function getCookieValue({ cookie, cookieName }) {
const cartCookieRegex = new RegExp(`^\${cookieName}=`);
const cartCookie = cookie
.split(';')
.map((val) => val.trim())
.find((val) => cartCookieRegex.test(val));
if (!cartCookie) return null;
const cartCookieValue = cartCookie.replace(`\${cookieName}=`, '');
return cartCookieValue;
}
```
**Important configuration notes:**
* **Edit `MYSHOPIFY_DOMAIN`:** You must replace the empty string with your store's myshopify.com domain (e.g., `'example-store.myshopify.com'`)
* **Enable debug mode (optional):** Set `enableDebug = true` to see console logs for troubleshooting
* **Supported parameters:** The pixel tracks all six standard UTM parameters listed in the `allowedUrlParams` array
## Testing your UTM trigger setup
After setting up UTM triggers, use this checklist to verify everything is working correctly:
### For storefront UTM tracking (app embed)
* ✅ **App embed enabled:** Verify the Aftersell UTM Tracker app embed is toggled on in your theme settings
* ✅ **Test URL:** Visit your store with a UTM parameter (e.g., `yourstore.com?utm_campaign=test`)
* ✅ **Complete purchase:** Add a product to cart and complete checkout
* ✅ **Check funnel:** Verify the correct funnel appears on the thank-you page
* ✅ **Order browser:** Check the Aftersell Order Browser to confirm the UTM trigger was detected
### For direct-to-checkout UTM tracking (Shopify pixel)
* ✅ **Pixel installed:** Verify the custom pixel is saved and connected in Settings > Customer Events
* ✅ **Domain configured:** Confirm `MYSHOPIFY_DOMAIN` is set correctly in the pixel code
* ✅ **Cart token present:** Ensure the customer has items in cart before going to checkout (required for tracking)
* ✅ **Test URL:** Use a direct-to-checkout link with UTM parameters (e.g., `yourstore.com/checkout?utm_campaign=test`)
* ✅ **Complete purchase:** Complete the checkout process
* ✅ **Check funnel:** Verify the correct funnel appears on the thank-you page
* ✅ **Order browser:** Check the Aftersell Order Browser to confirm the UTM trigger was detected
* ⚠️ **Express checkout:** Remember that Shop Pay, Apple Pay, and Google Pay will NOT work with UTM triggers
### Troubleshooting tips
If UTM triggers are not working:
1. **Enable debug mode:** Set `enableDebug = true` in the pixel code and check browser console for error messages
2. **Verify cart token:** Ensure customers have items in cart before reaching checkout (pixel requires cart token)
3. **Check trigger configuration:** Verify the UTM parameter and value in your funnel trigger match the URL parameters
4. **Test partial matching:** Remember that triggers use partial matching - `sale` will match `spring_sale`, `flash_sale`, etc.
5. **Check funnel priority:** If multiple funnels match, only the highest priority funnel will show
6. **Review Order Browser:** Use the Aftersell Order Browser to see which triggers fired for each order
## Best practices for UTM triggers
* **Use consistent naming:** Establish a naming convention for your UTM parameters (e.g., `utm_campaign=email_spring_2026`)
* **Leverage partial matching:** Use broader trigger values to match multiple campaign variations
* **Test before launching:** Always test your UTM links and triggers before sending to customers
* **Document your campaigns:** Keep a record of which UTM parameters you're using for each campaign
* **Combine with other triggers:** Use UTM triggers alongside product or order value triggers for more precise targeting
* **Monitor performance:** Regularly check the Order Browser to see which UTM campaigns are driving the most upsells
# Checkout upsells
Source: https://docs.aftersell.com/aftersell/implementing_strategies_checkout_upsells
Use a Strategy to dynamically choose the product shown in a Shopify Plus checkout upsell widget.
## Overview
When configuring a checkout upsell widget, you can fill the product slot in a few ways: hand-pick a specific product, let AI recommend one, or attach a **Strategy**. Each is a different tool for a different job.
Strategies are for **dynamic merchandising in real time** - pairing the right accessory with a parent product, suggesting a complementary item, or surfacing a different product depending on what's already in the cart. Where checkout **triggers** decide *which* widget appears for a given shopper, a Strategy decides *what product goes inside it*. Triggers are the gateway, Strategies are the brain behind the experience.
***
## Attaching a Strategy to a Checkout Widget
Strategies are attached **per widget**, not to the checkout as a whole. You can mix Strategy-driven widgets and static-product widgets in the same checkout.
1. Open the checkout widget you want to edit.
2. In the **Select product type** menu, choose **Strategy**.
3. In the Strategy picker, search for and select the Strategy you want to use.
4. Click **Confirm**, then save the widget.
Once attached, the widget displays the Strategy's name in place of a specific product. Each time the checkout loads, the Strategy is evaluated and the returned product is rendered in the widget.
Give your Strategies clear, descriptive names. The Strategy name is what shows up in the widget editor once attached, and it's the easiest way to know at a glance which Strategy is driving which widget.
***
## What the Strategy Sees
Checkout has a **narrower context** than post-purchase. The Strategy is evaluated as the checkout page loads, before the order is placed - so customer history and session attribution aren't available yet. The following is what gets sent automatically:
#### Product context
The line items currently in the cart are sent as the input products. Triggers like **product tags**, **product collections**, **product type**, **vendor**, **selling plan**, and **product metafields** all evaluate against these items.
#### Cart context
* **Subtotal** - the cart subtotal.
* **Item count** - total quantity across all lines.
* **Line count** - number of distinct line items.
**Customer and session triggers won't match in checkout.** Customer tags, order count, country, locale, and UTM parameters are not part of the checkout payload. If a Strategy used in a checkout widget relies on these triggers, those rules will never fire, and only product- or cart-scoped rules (or the Catch all) will be able to return a product.
***
## What Happens When the Strategy Returns
The product(s) returned by the Strategy **replace** the placeholder in the widget - they don't add to it. The shopper sees the widget as if you had hand-picked that product yourself.
The widget fills its slots from the returned products in priority order, up to the number of offers the widget is configured to show. A single-offer widget uses the first returned product.
***
## When No Product Is Returned
If no rules match and the Strategy returns no products, the widget is **not shown** to the shopper - the slot disappears entirely from the checkout.
To keep your widget firing, configure a **Catch all** in the Strategy so there is always a fallback product to return. See the [Building Strategies](/aftersell/strategies_building_in_app) page for how to set up a Catch all.
***
## Evaluation Timing
By default, a Strategy on a checkout widget is evaluated **once, when the checkout page loads**. The product chosen at page load remains the product shown, even if the shopper adds or removes items during checkout.
If the widget has **flexible trigger re-checking** enabled, the Strategy is instead re-evaluated whenever the cart changes during checkout, and the widget updates to reflect the new cart - similar to how the [Upcart integration](/aftersell/implementing_strategies_upcart_upsells) behaves. Plan your rules around whichever mode the widget uses: a fixed snapshot at checkout load, or a live re-evaluation on every cart change.
***
## Tips for Checkout Strategies
* **Design around products and cart only.** Customer- and session-scoped triggers will never match in checkout, so build Strategies around product attributes (tags, collections, metafields) and cart shape (subtotal, item count, line count).
* **Use Catch all as a safety net.** A Strategy without a Catch all will hide the widget if nothing matches. A simple Catch all keeps the slot showing *something*.
* **Mix dynamic and static widgets.** Not every widget has to be Strategy-driven. A common pattern is a Strategy on the primary upsell widget (most personalized) and a static product on a secondary widget (proven seller).
# Custom integration
Source: https://docs.aftersell.com/aftersell/implementing_strategies_custom_integration
Call the Strategies API directly to power custom storefront experiences - PDP carousels, custom cart upsells, and anywhere else Aftersell's native surfaces don't reach.
## Overview
When neither Aftersell's native surfaces (post-purchase, checkout, Upcart) nor a packaged integration fits, you can call the Strategies API yourself from your Shopify theme and render the returned products however you like.
The pattern is the same in every case: build a context payload from Liquid (so Shopify attributes like the current product, cart contents, and customer fields are filled in at render time), `POST` it to `/api/public/strategy/evaluate`, and render the response.
This page covers two implementation patterns:
* **PDP context** - drop a section onto product pages that calls the API with the **currently-viewed product** and renders a carousel of returned recommendations.
* **Cart context** - render an upsell block inside a custom cart that calls the API with **all current cart line items** and renders the returned products.
The shape of the **product context** is what differs between the two: a single product on PDP, an array of all line items in cart.
***
## What You'll Need
1. **Your Strategy API key.** In Aftersell, go to **Settings → Product Strategy** and, in the **Security Token** card, copy your token (this is your Strategy API key).
2. **The Strategy ID.** Open the Strategy you want to run in the Aftersell Strategy editor and copy its ID.
3. **Theme code access.** You'll be adding a Liquid section (PDP) or block (custom cart) to your Shopify theme - Online Store → Themes → ... → Edit code.
Your Strategy API key sits in client-side theme code, which makes it visible to anyone who views the page source. Treat it as a public storefront credential and rotate it from Aftersell **Settings → Product Strategy** if it's ever exposed in a way you didn't intend.
***
## PDP Context: Section Snippet
This pattern adds a Shopify section to your product page. When the page renders, Liquid embeds the current product, cart, and customer attributes into the payload, then JavaScript posts to the Strategies API and renders the returned products in a Splide carousel.
### Installing
1. In your Shopify admin, go to **Online Store → Themes**, click **...** on your theme, and select **Edit code**.
2. Under the **Sections** folder, create a new file named `aftersell-upsell-carousel.liquid`.
3. Paste the snippet below into the new file and replace `YOUR_STRATEGY_API_KEY` with the API key from Aftersell.
4. Save.
5. Open your product template (typically `templates/product.json` or `sections/main-product.liquid`) and add the **Aftersell Carousel** section where you want the carousel to appear. From the theme editor, you can also drag it onto the product page directly.
6. In the section's settings, paste your **Strategy ID**.
### What the section sends
For each PDP view, the payload includes:
* **products** - a single-element array containing the currently-viewed product (productId, variantId, quantity, price, handle, title, vendor, productType, tags, collections, sellingPlan).
* **cart** - subtotal, item count, line count of the shopper's current cart (omitted if the cart is empty).
* **cartToken** - so the API can stitch this evaluation into the same session.
* **customer** - tags, country, province, locale, order count, total spent, and accepts-marketing flag, but **only if the shopper is logged in**.
* **session** - currency code from `shop.currency`.
The section does not send UTM parameters by default. If you want UTM-based targeting on PDP, capture them client-side and add them to the `session` object before the fetch.
### The snippet
```liquid theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
{% comment %}
Aftersell Carousel (Splide)
Type: Section — save to sections/aftersell-upsell-carousel.liquid
{% endcomment %}
{% if product %}
{{ section.settings.heading | default: 'You might also like' }}
{% endif %}
{% schema %}
{
"name": "Aftersell Carousel",
"settings": [
{ "type": "text", "id": "strategy_id", "label": "AfterSell Strategy ID", "default": "ADD_ID_HERE" },
{ "type": "text", "id": "heading", "label": "Heading", "default": "You might also like" },
{ "type": "text", "id": "cta_label", "label": "CTA Button Label", "default": "Add to cart" },
{ "type": "range", "id": "max_products", "label": "Max Products to Show", "default": 8, "min": 1, "max": 20, "step": 1 }
],
"presets": [{ "name": "Aftersell Carousel" }]
}
{% endschema %}
```
### Customizing
The section schema exposes four merchant-editable settings: **Strategy ID**, **Heading**, **CTA Button Label**, and **Max Products to Show**. Add or remove settings in the `{% schema %}` block to expose more knobs to the theme editor.
The CSS is scoped under `.aftersell-*` class names and includes a Splide-driven 4-up carousel that drops to 2-up at 768px and 1-up at 480px. Edit it freely to match your theme - none of it is required for the API call to work.
***
## Cart Context: Custom Cart Upsell Block
This pattern is structurally the same as the PDP one, with one key difference: the **product context array** is built from the cart's line items instead of the currently-viewed product. The Strategy then receives every item the shopper has added and returns recommendations based on the cart as a whole.
The implementation lives wherever your custom cart code lives - a Liquid section that renders the cart drawer, a custom block in a headless storefront, or a theme template like `cart.liquid`. The shape of the API call and the response handling are identical to the PDP example - only the `products` array differs.
The structure looks like:
```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
var products = {{ cart.items | json }}.map(function(item) {
return {
productId: 'gid://shopify/Product/' + item.product_id,
variantId: 'gid://shopify/ProductVariant/' + item.variant_id,
quantity: item.quantity,
price: item.price / 100
// ...other fields as needed
};
});
```
The rest of the payload (cart, customer, session, cartToken) and the `fetch` call to `/api/public/strategy/evaluate` are unchanged from the PDP pattern above - only the `products` array swaps from `[productContext]` to the cart-derived array.
***
## What Happens When the Strategy Returns
The response shape is the same regardless of which context you sent:
```json theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
{
"success": true,
"products": [ /* enriched recommended products */ ],
"evaluationId": "f3a1c2e0-...",
"resolution": { "strategyId": "...", "matchedRuleIds": [...], "fallbackUsed": false },
"meta": { "servedFromCache": false, "processingTimeMs": 12, "data": {} }
}
```
The `evaluationId` is a unique id for this evaluation. If you capture it and attach it to the products you render, you can attribute the resulting order back to the exact recommendation that produced it - see [Attribution](#attribution) below.
How you render the `products` array is entirely up to your theme code. The PDP snippet above renders them as a carousel of cards with variant pickers and add-to-cart buttons; a custom cart block might render them as a vertical list inside the drawer.
For the full request and response schema, see the [Evaluate Strategy API reference](/aftersell/strategies_api_reference_evaluate_strategy).
***
## When No Product Is Returned
If the Strategy returns no products (`products: []`), it's up to your code how to handle it. The PDP snippet above hides the carousel entirely. A custom cart block might fall back to the cart's default upsell list, or simply render nothing.
To avoid an empty response, configure a **Catch all** in the Strategy so there is always a fallback product to return. See the [Building Strategies](/aftersell/strategies_building_in_app) page for how to set up a Catch all.
***
## Tips for Custom Integrations
* **Build context in Liquid.** Liquid runs at render time and has access to the full Shopify object graph - product, cart, customer, shop, request. Use it to populate the payload server-side rather than reaching for client-side calls.
* **Keep the API key out of public repos.** It will end up in your theme code, which is shipped to the browser - that's fine. But don't paste the same theme into a public repository or share the bundle externally.
* **Use a Catch all.** Storefront experiences look broken when a slot disappears. A Catch all with a small set of safe defaults keeps the UI consistent.
* **Cache where it makes sense.** The Strategies API does light caching server-side (`meta.servedFromCache`), but for high-traffic PDPs you may also want to debounce or memoize calls on the client (e.g. don't re-call when the same product is rendered twice in a session).
***
## Attribution
When a shopper clicks the add-to-cart button in the snippet, the `/cart/add.js` call attaches **line item properties** to the cart item:
```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
properties: {
"_source": "Aftersell",
"_attribution": "CTA"
}
```
These properties travel with the line item all the way through to the Shopify order, where they appear on the line item record. You can use them downstream to attribute revenue, filter orders, or feed analytics tools that read line item properties.
The keys and values are conventions, not requirements - the API call works the same regardless of what you put here. Change them to fit your own attribution model. For example:
```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
properties: {
"_source": "PDP Carousel",
"_strategy_id": "{{ section.settings.strategy_id }}",
"_campaign": "summer-2026"
}
```
Property keys that begin with an underscore (`_`) are hidden from the cart and checkout UI but still attach to the order. Use the underscore prefix for attribution-only metadata you don't want shoppers to see.
Apply the same pattern in the cart-context implementation - any add-to-cart call you make from a custom upsell block can carry whatever properties you need.
### Attributing back to the evaluation
To tie an order back to the **exact evaluation** that recommended the product - rather than just "came from a Strategy" - capture the `evaluationId` from the response and attach it to the line item under the `__as_offer_id` property. AfterSell reads this key, so orders tagged with it attribute to the specific evaluation in reporting.
In the `evaluate()` handler, hold onto the id from the response:
```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
.then(function(data) {
if (!data || !data.success || !data.products || !data.products.length) {
clearSkeletons(); return;
}
evaluationId = data.evaluationId; // declare `var evaluationId;` alongside your other state
renderCards(data.products.slice(0, MAX_PRODUCTS));
})
```
Then include it in the add-to-cart properties:
```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
properties: Object.assign(
{ "_source": "Aftersell", "_attribution": "CTA" },
evaluationId ? { "__as_offer_id": evaluationId } : {}
)
```
Keep the double underscore on `__as_offer_id` - it's the key AfterSell looks for, and the underscore prefix keeps it hidden from shoppers. If `evaluationId` is absent (for example, no products were returned), skip the property rather than sending an empty value.
# Post-purchase upsells
Source: https://docs.aftersell.com/aftersell/implementing_strategies_post_purchase_upsells
Use a Strategy to dynamically choose the product shown in a post-purchase upsell offer.
## Overview
When configuring a post-purchase offer, you can fill the product slot in a few ways: hand-pick a specific product, let AI recommend one, or attach a **Strategy**. Each is a different tool for a different job.
Strategies are for **dynamic merchandising in real time** - pairing the right accessory with a parent product, suggesting the next step in a routine, or surfacing a complementary item. Where triggers initiate a funnel + layout; a Strategy then decides what products go inside it. Triggers are the gateway, Strategies are the brain behind the experience.
***
## Attaching a Strategy to a post-purchase offer
Strategies are attached **per offer step**, not to the funnel as a whole. You can mix strategy-driven steps and static-product steps in the same funnel.
1. Open the funnel you want to edit and go to the **Upsells** section.
2. On the upsell slot you want to configure, click **Create your first offer** (or **+** to add another offer).
3. Under **Select type**, choose **Single product upsell** or **Multi product upsell**.
4. Under **Select product type**, choose **Strategy**.
5. In the Strategy picker, search for and select the Strategy you want to use.
6. Click **Confirm**, then save the funnel.
Once attached, the offer step displays the Strategy's name in place of a specific product. Each time the offer is shown, the Strategy is evaluated and the returned product is rendered.
Give your Strategies clear, descriptive names. The Strategy name is what shows up in the funnel editor once attached, and it's the easiest way to know at a glance which Strategy is driving which offer step.
***
## What the Strategy sees
When a post-purchase offer evaluates a Strategy, the following context is sent automatically. You don't need to configure any of it - it's pulled from the shopper's order and session as the offer is prepared.
#### Product context
The line items from the just-completed order are sent as the input products. Triggers like **product tags**, **product collections**, **product type**, **vendor**, **selling plan**, and **product metafields** all evaluate against these items.
#### Cart context
* **Subtotal** - the order subtotal.
* **Item count** - total quantity across all lines.
* **Line count** - number of distinct line items.
#### Customer context
* **Customer tags**
* **Order count** (lifetime orders for the customer)
* **Country / province**
* **Locale**
Country, province, and locale are read from the order itself and are available for every checkout. Customer tags and order count come from the Shopify customer record - they populate as soon as the checkout is linked to a customer (which Shopify does once a recognized email is entered, or when a new customer record is created).
#### Session context
UTM parameters captured when the shopper arrived at the store:
* **UTM source**
* **UTM medium**
* **UTM campaign**
* **UTM content**
* **UTM term**
This makes it possible to tailor post-purchase offers to the campaign or channel the shopper came from.
***
## What happens when the Strategy returns
The product(s) returned by the Strategy **replace** the placeholder in the offer step - they don't add to it. The shopper sees the offer as if you had hand-picked that product yourself.
A single-product offer uses the first returned product. A multi-product offer fills its slots from the returned products in priority order.
***
## When no product is returned
If no rules match and the Strategy returns no products, the post-purchase upsell is **not shown** to the shopper.
To keep your funnel firing, configure a **Catch all** in the Strategy so there is always a fallback product to return. See the [Building Strategies](/aftersell/strategies_building_in_app) page for how to set up a Catch all.
***
## Tips for post-purchase Strategies
* **Use Catch all as a safety net.** A Strategy without a Catch all will skip the offer step if nothing matches. A simple Catch all keeps the funnel showing *something*.
* **Mix dynamic and static steps.** Not every step has to be Strategy-driven. A common pattern is a Strategy on the first offer (most personalized) and a static fallback offer on the second offer (proven seller).
# Thank you page upsells
Source: https://docs.aftersell.com/aftersell/implementing_strategies_thank_you_page_upsells
Use a Strategy to dynamically choose the products shown in a Thank You Page product recommendation widget.
## Overview
When configuring a Thank You Page **product recommendation** widget, you can fill it in a few ways: hand-pick specific products, return a collection, let AI recommend products, or attach a **Strategy**. Each is a different tool for a different job.
Strategies are for **dynamic merchandising in real time** - pairing the right add-on with what the shopper just bought, surfacing a complementary item, or recommending the next step in a routine. Where the Thank You Page widget decides *where* recommendations appear, a Strategy decides *what products go inside it* - evaluated fresh against each order.
A Strategy on the Thank You Page can also override each card's copy and apply a per-product discount, so different products can carry different messaging and pricing. See [Rule copy and per-product discounts](#rule-copy-and-per-product-discounts).
***
## Attaching a Strategy to a Thank You Page Widget
A Strategy is the product source for a single product recommendation widget. It is **exclusive** - a widget sourced by a Strategy can't also use specific products, a collection, or AI recommendations.
1. Open the Thank You Page funnel and edit the **product recommendation** widget you want to configure.
2. In the **Add upsell products** menu, choose **Strategy**.
3. In the Strategy picker, search for and select the Strategy you want to use.
4. Confirm, then save the widget.
Once attached, the widget shows the Strategy's name in place of specific products. Each time the Thank You Page loads, the Strategy is evaluated and the returned products are rendered in the widget.
Give your Strategies clear, descriptive names. The Strategy name is what shows up in the widget editor once attached, and it's the easiest way to know at a glance which Strategy is driving which widget.
***
## What the Strategy Sees
When a Thank You Page widget evaluates a Strategy, the following context is sent automatically. You don't need to configure any of it - it's pulled from the completed order and session as the page loads.
#### Product context
The line items from the **just-completed order** are sent as the input products. Product triggers - **product tags**, **product collections**, **product type**, **vendor**, **title**, **handle**, and **product metafields** - all evaluate against these items. Their attributes are resolved automatically, so you only need rules; you don't have to supply product data yourself.
The products the shopper just bought are automatically **excluded** from the results, so a Strategy never re-recommends an item that's already in the order.
#### Cart context
* **Subtotal** - the order subtotal (in the store's major currency units, e.g. dollars).
* **Item count** - total quantity across all lines.
* **Line count** - number of distinct line items.
#### Customer context
* **Customer tags**
* **Order count** (lifetime orders for the customer)
* **Country / province** (the order's destination)
* **Locale**
#### Session context
UTM parameters captured when the shopper arrived at the store:
* **UTM source**
* **UTM medium**
* **UTM campaign**
* **UTM content**
* **UTM term**
**Some triggers won't match on the Thank You Page.** Cart notes and cart attributes, customer total spent and accepts-marketing, the selling-plan trigger, and the shipping/store-currency triggers are not part of the Thank You Page payload. Rules that rely on these triggers will never fire here - build Thank You Page Strategies around product attributes, cart shape, customer tags / order count / location, and UTM parameters.
***
## Rule copy and per-product discounts
A Strategy gives you per-product control over both the **copy** and the **discount** shown on each Thank You Page card.
* **Rule copy** - a matching rule can set a **title**, **subtitle**, and **button (CTA) label** for the products it returns. When present, the rule's title appears above the product title (it doesn't replace it), the subtitle shows as a secondary line, and the CTA overrides the widget's button text. Cards whose products didn't come from a rule with copy render unchanged.
* **Per-product discount** - a matching rule can set a discount (a percentage, or a fixed amount) that applies to the products it returns. This **overrides** the widget's configured discount, per product - so different rules can show different discounts on different cards. The discount shown on the card is the discount actually charged when the shopper accepts.
The widget's own discount setting becomes the **default**: it applies to any returned product that the Strategy doesn't set a discount for.
A **fixed-amount** discount in a currency other than the order's currency can't be applied, so the card falls back to the widget's configured discount instead. **Percentage** discounts always apply regardless of currency.
***
## What Happens When the Strategy Returns
The widget renders the products the Strategy returns, in priority order, up to the widget's **maximum products to show**. Only products that are available for purchase are shown.
The Strategy's products **replace** the widget's placeholder - the shopper sees the widget as if you had hand-picked those products yourself.
***
## When No Product Is Returned
If the Strategy returns no products, the widget renders **nothing** - it's hidden from the Thank You Page. The page never breaks: if a Strategy can't be evaluated for any reason, the widget simply doesn't show.
To keep the widget firing, configure a **Catch all** in the Strategy so there is always a fallback product to return. See the [Building Strategies](/aftersell/strategies_building_in_app) page for how to set up a Catch all. (Catch-all fallback products are shown without rule copy or a per-product discount.)
***
## Evaluation Timing
A Strategy on a Thank You Page widget is evaluated **once, when the Thank You Page loads**. The order is already placed, so there's nothing to re-evaluate against - the products chosen at load are the products shown.
***
## How Shoppers Accept
How an accepted upsell is processed depends on the funnel's order-handling setting:
* **New order** - the shopper completes a separate, discounted checkout for the upsell product.
* **Modify original order** - the upsell is merged into the order the shopper just placed.
Either way, the product, variant, and discount are re-validated against what the Strategy returned before the order is created or edited - so the price charged always matches the price shown.
***
## Tips for Thank You Page Strategies
* **Design around the order.** Product attributes (tags, collections, type, vendor, metafields), cart shape (subtotal, item/line count), customer tags / order count / location, and UTM parameters are the signals available here.
* **Lean on copy and per-product discounts.** Use rule copy to tailor the pitch per product, and per-product discounts to vary pricing by rule - with the widget discount as a safe default.
* **Use Catch all as a safety net.** Without one, the widget shows nothing whenever no rule matches.
# Upcart upsells
Source: https://docs.aftersell.com/aftersell/implementing_strategies_upcart_upsells
Use a Strategy to dynamically choose the products shown in Upcart's upsells module.
## Overview
Upcart is a separate app from Aftersell, so Strategies aren't baked into the Upsells module the way they are in Aftersell's post-purchase and checkout flows. Instead, you bridge the two apps with a small script that calls the Strategies API directly and feeds the result into Upcart's existing Upsells module via Upcart's public API.
The script is **drop-in** - paste it once into Upcart's custom HTML, replace two values (your Strategy API key and the Strategy ID), and the Upsells module will start surfacing whatever products the Strategy returns.
***
## What You'll Need
1. **Your Strategy API key.** In Aftersell, go to **Settings → Product Strategy** and, in the **Security Token** card, copy your token (this is your Strategy API key).
2. **The Strategy ID.** Open the Strategy you want to run in the Aftersell Strategy editor and copy its ID.
3. **The Upsells module enabled in Upcart.** The script overrides the list of products shown in the existing upsell block, so the module needs to be turned on for anything to render.
***
## Adding the Script
In Upcart, go to **Settings → Custom HTML → Scripts (before load)** and paste the script below. Replace `STRATEGY_ID` and `STRATEGY_API_KEY` with the values from Aftersell, then save.
```html theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
```
Your Strategy API key authorizes calls against your shop's Strategies. The script above places it in client-side code, which is the only practical way to invoke the API from the cart drawer. Treat the key as you would any other public storefront credential and rotate it from Aftersell **Settings → Product Strategy** if it's ever exposed in a way you didn't intend.
***
## What the Strategy Sees
Because this runs from the storefront cart, the context is a slim subset of what's available on Aftersell's native surfaces:
#### Product context
The line items currently in the Upcart cart are sent as the input products. Triggers like **product type**, **vendor**, **product handle**, **product title**, and any **product ID / variant ID** triggers all evaluate against these items.
#### Cart context
* **Subtotal** - cart subtotal in the store's major currency units (e.g. dollars). Upcart's `total_price` is in minor units (cents), so the script divides by 100 to match the units the rest of the Strategies API uses - and the units your `cart_subtotal` rules are authored in.
* **Item count** - total quantity across all lines.
* **Line count** - number of distinct line items.
#### Session context
* **Currency code** - taken from `window.Shopify.currency.active`.
**Customer triggers and UTM triggers won't match.** The default script doesn't send customer tags, order count, location, or UTM parameters - so any rule using those triggers will never fire. Use product, cart, and currency triggers, or a Catch all, to make sure something always returns.
***
## What Happens When the Strategy Returns
The products returned by the Strategy fully **replace** the list Upcart would otherwise show in the Upsells module. The merchant-defined upsell list is overridden for the duration of that cart - it's not merged in.
Each Strategy product is mapped to Upcart's expected product shape (variants, images, options, metafields, etc.) so it renders inside the upsell block exactly like any other product.
***
## When No Product Is Returned
If the Strategy returns no products, the Upsells module renders **empty** - no upsells are shown.
To avoid this, configure a **Catch all** in the Strategy so there is always a fallback product to return. See the [Building Strategies](/aftersell/strategies_building_in_app) page for how to set up a Catch all.
***
## Re-Evaluation on Cart Changes
Unlike checkout upsells, the Upcart implementation **re-evaluates the Strategy every time the cart changes** - items added, removed, or quantity-updated. The script subscribes to Upcart's `cartUpdated` event, sends the new cart to the Strategies API, and refreshes the cart drawer with the new upsell list.
A cart-signature check skips redundant calls if the line items and quantities haven't actually changed, so back-to-back cart events that don't materially change the cart won't re-hit the API.
***
## Tips for Upcart Strategies
* **Design around the cart.** Cart-shape and product triggers are the strongest signals you have here. Customer history and UTM-based targeting aren't sent by the default script.
* **Use Catch all as a safety net.** Without one, the Upsells module will show nothing whenever no rule matches.
* **Cache-friendly by default.** The cart-signature guard prevents re-firing the API if the cart hasn't materially changed - good for shoppers who toggle the cart open and closed without editing it.
# Installing Aftersell
Source: https://docs.aftersell.com/aftersell/installing_aftersell
How to install Aftersell on your Shopify store
**This guide will walk you through the process of installing Aftersell on your Shopify store. It is a quick and easy process, and only takes 2 minutes!**
## Step 1: Shopify App Store
Navigate to the Shopify App Store. Use the search bar at the top to search for "Aftersell." Look for Aftersell in the search results and click on it.
[Aftersell on Shopify App Store](https://apps.shopify.com/aftersell)
## Step 2: Install Aftersell
On the Aftersell app page, click the "Install" button. You will be redirected to a page where you can review the permissions the app requires.
## Step 3: Configure Aftersell
After successful installation, you will be redirected to the Aftersell dashboard. Follow the on-screen prompts to complete the initial setup and configure Aftersell according to your preferences.
# Aftersell & Judge.me reviews integration
Source: https://docs.aftersell.com/aftersell/judgeme_reviews_integration
This article explains how to set up the Aftersell and Judge.me Reviews integration for the testimonials widget.
Judge.me reviews work automatically with Aftersell for displaying review stars on upsell offers. To use Judge.me reviews in the testimonials widget, you need to provide your API key.
## Setting up Judge.me integration
1. Install the [Judge.me app](https://apps.shopify.com/judgeme) from the Shopify app store
2. In your Judge.me app, go to `Settings > Integrations > API token`
3. Copy your **Private API token**
4. Open the Aftersell app, then go to `Settings > Product Reviews`
5. Select **Judge.me** from the review integrations list
6. Paste your Private API token in the **Judge.me API key** field
7. Click **Save changes**
The integration is complete. You can now use Judge.me reviews in your Flex Testimonials widget.
## Syncing reviews
Aftersell imports reviews from Judge.me and stores them so they can be displayed in the testimonials widget. The first import happens automatically within 24 hours, and then once a week after that.
To import reviews immediately:
1. Go to `Settings > Product Reviews`
2. Find the **Judge.me reviews** section
3. Click **Sync now**
The sync status shows when reviews were last imported and when the next sync is available.
# Aftersell & Klaviyo reviews integration
Source: https://docs.aftersell.com/aftersell/klaviyo_reviews_integration
This article explains how to set up the Aftersell and Klaviyo Reviews integration for the testimonials widget.
To use Klaviyo reviews in the Aftersell testimonials widget, you need to provide your Klaviyo private API key.
## Setting up Klaviyo integration
1. In Klaviyo, navigate to your account settings
2. Go to `Integrations > Developers > Manage API keys`
3. Click **Create Private API Key**
* You can name it "Aftersell API key"
* Select **read-only** permissions
4. Copy the generated API key
5. Open the Aftersell app, then go to `Settings > Product Reviews`
6. Select **Klaviyo** from the review integrations list
7. Paste your private API key in the **Klaviyo private API key** field
8. Click **Save changes**
The integration is complete. You can now use Klaviyo reviews in your Flex Testimonials widget.
## Syncing reviews
Aftersell imports reviews from Klaviyo and stores them so they can be displayed in the testimonials widget. The first import happens automatically within 24 hours, and then once a week after that.
To import reviews immediately:
1. Go to `Settings > Product Reviews`
2. Find the **Klaviyo reviews** section
3. Click **Sync now**
The sync status shows when reviews were last imported and when the next sync is available.
# Managing checkout discounts
Source: https://docs.aftersell.com/aftersell/managing_checkout_discounts
Learn how to view, edit, and delete discounts created for checkout upsells in Aftersell
The discount library in Aftersell allows you to manage all discounts created for your checkout upsells. You can view which upsells use each discount, edit discount details, and delete unused discounts.
## Accessing the discount library
To access your discount library:
1. Open the **Aftersell** app in your Shopify Admin
2. Navigate to **Checkout** > **Discounts**
The discount library displays all discounts you've created through Aftersell. These discounts also appear under "Aftersell Discounts" on your Shopify Discounts page.
## Understanding discount status
Each discount in the library shows its status on Shopify:
* **Active on Shopify** - The discount is active and working correctly
* **Inactive on Shopify** - The discount may be missing or deactivated on your Shopify Discounts page
If a discount shows as inactive, check your Shopify Admin > Discounts page to verify the discount exists and is active.
## Editing a discount
To edit an existing discount:
1. Click on the discount you want to edit from the list
2. The discount details appear in the right panel
3. Modify the **title**, **discount type** (percentage or fixed amount), or **amount**
4. Click **Save** to apply your changes
⚠️ Changes apply to all upsells using this discount. The "Used in" section shows which widgets and products currently use the discount.
## Deleting a single discount
To delete a discount:
1. Click on the discount you want to delete
2. Click the **Delete** button in the right panel
3. Confirm the deletion in the modal
The discount is removed from all upsells that use it. This action cannot be undone.
## Bulk deleting unused discounts
If you have discounts that aren't currently used in any upsells, you can delete them all at once:
1. In the discount library, look for the **Delete X unused discount(s)** button
2. Click the button to see a list of all unused discounts
3. Review the list in the confirmation modal
4. Click **Delete X discount(s)** to confirm
This feature only appears when you have unused discounts. The system automatically identifies which discounts aren't applied to any upsell offers.
## Searching discounts
Use the search bar at the top of the discount library to quickly find specific discounts by title or discount code.
## Creating new discounts
Discounts are created when you add them to upsell offers in the Checkout editor. You cannot create standalone discounts in the discount library.
To create a new discount:
1. Go to **Checkout** > **Editor**
2. Edit or create an upsell widget
3. Click **Add discount** when configuring an offer
4. Choose **Create new** and set the title and amount
The new discount appears in your discount library and can be reused in other upsells by selecting **Pick existing** when adding discounts.
## Related articles
* [Checkout widget types](/aftersell/checkout_widget_types) - Learn about adding discounts to upsell widgets
* [Creating your first checkout widget](/aftersell/creating_your_first_checkout_widget) - Step-by-step guide to creating checkout widgets
# Post-purchase multivariate testing
Source: https://docs.aftersell.com/aftersell/multivariate_testing
Learn how to set up and analyze multivariate tests for your post-purchase offers in Aftersell
# Post-purchase multivariate testing
Multivariate testing lets you test multiple offer variables at once - like discounts, timers, and product selections - to find the best-performing combination. You define the variables and select the options you want to test, and Aftersell combines them into all possible layout combinations for testing.
It's one of the most powerful ways to optimize your post-purchase upsell strategy.
In multivariate testing, you define individual variables and their options, and Aftersell combines them into all possible layout combinations for testing. If you want to configure complete layouts individually and test them against each other (up to 5 layouts), use [Post-Purchase A/B Testing](/aftersell/post_purchase_a_b_testing) instead.
Multivariate testing is only available for post-purchase upsells. Multivariate testing for Thank You page offers is not currently available. For checkout widget testing, see [Checkout A/B Testing](/aftersell/checkout_a_b_testing).
***
## 1. Define your goal
Before setting up your multivariate test, take a moment to define what success looks like for your store. Setting a clear objective helps you choose the right variables to test and measure what truly matters. Some popular goals include:
* Increasing conversion rates on upsell offers
* Boosting average order value (AOV)
* Identifying the most effective product or incentive
Need inspiration? Check out our [Best Practices](/aftersell/best_practices) article for ideas that drive real results.
## 2. Choose the variables to test
Select 1-5 high-impact variables that could affect buyer behavior. For example:
* **Product selection:** Specific product vs. AI recommendations
* **Discount type:** Percentage vs. fixed dollar vs. no discount
* **Urgency timer:** 5 min vs. 15 min
* **Shipping:** Free vs. flat-rate
Too many variables means harder analysis. Keep it focused.
## 3. Create your variations
Set up options for each variable. For example:
* **Discounts:** 10%, 20%, 30%
* **Timers:** 5, 10, or 15 minutes
* **Products:** Single product vs. multi-product offer
Aftersell combines your selected options into all possible layout combinations for testing.
## 4. Set up your multivariate test
1. Open the **Aftersell Dashboard**
2. Go to **Post-Purchase Funnels**
3. Create a new funnel or open an existing one
4. Click **Create test** and select **Multivariate Test**
5. Select your desired variations
6. Click **Start test**
Each combination is automatically labeled as **Layout A**, **Layout B**, and so on for easy reference in your analytics.
Be sure to press Enter after typing in each variable to save it properly.
### How traffic is split
Traffic is automatically distributed evenly across all layouts generated by the test. There is no way to manually adjust the traffic percentage for each layout. For example, if your variable combinations produce 4 layouts, each layout will receive approximately 25% of traffic.
There is no option to set custom percentages (for example, you cannot set Layout A to 80% and Layout B to 20%).
***
## 5. Review the results
Once your test has been running for a sufficient amount of time, ideally 2-4 weeks, you'll have enough data to make informed decisions. Shorter test durations may not yield statistically reliable insights, especially if traffic is low.
To view your results, go to the **Tests** tab in your Aftersell Analytics dashboard.
For a complete breakdown of all Tests tab metrics, including group-level analytics, Performance by Variable, the All Groups table, and how to select a test, see [Post-Purchase Analytics](/aftersell/analytics_in_aftersell).
Your test will show the impressions needed to be statistically viable, helping you know when the data is ready to act on. Look for consistent performance across multiple metrics, not just a spike in one area.
## 6. Apply the winning variation
Once a winner emerges:
1. Apply that variation across your funnel
2. Monitor performance to ensure it continues delivering strong results
3. Consider testing again with a new set of variables
***
## Limitations
### Multivariate testing is within a single funnel only
Multivariate testing runs within the same funnel. You cannot run a multivariate test across multiple funnels.
### Multivariate testing is for post-purchase (one-click) upsells only
Multivariate testing is not currently available for Thank You page offers. It is only supported for post-purchase upsell funnels.
### Custom traffic percentages are not supported
Traffic is always split evenly across all layouts generated by the test. There is no option to assign custom percentages to individual layouts.
***
## Multivariate test vs. A/B test
Not sure which testing method to use?
| | **Multivariate Test** | **A/B Test** |
| ------------------------ | -------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- |
| How it works | You define individual variables and their options, and Aftersell combines them into all possible layout combinations for testing | You manually configure each layout as a complete offer and test them against each other |
| Layouts | Based on your selected variable combinations (Layout A, B, C, etc.) | Up to 5 layouts (Layout A through E), each manually configured |
| Best for | Finding the best combination of individual variables (discount, timer, product, etc.) | Comparing complete offer designs against each other |
| Traffic split | Evenly across all combinations | Evenly across all layouts |
| Statistical significance | Requires more traffic due to more combinations | Faster to reach with fewer layouts |
| Results | More complex - identifies best combination of variables | Easier to interpret - one layout wins |
**Use Multivariate Testing when:**
* You want to test multiple variables simultaneously and find the best combination
* You have high traffic levels
* You want to define variables and have Aftersell combine them into layout combinations for testing
[**Use A/B Testing when:**](/aftersell/post_purchase_a_b_testing)
* You want to compare complete offer configurations
* You have moderate traffic levels
* You want clear, straightforward results
***
## Best practices
* **Start simple:** Don't overload with too many variables
* **Be patient:** Let tests run long enough to collect data (minimum 2-4 weeks)
* **Keep testing:** Use winners to inspire your next round of tests
***
## Need help?
If you have questions about setting up or analyzing your multivariate tests, chat with our support team using the live chat at the bottom right of the app.
# Aftersell & Okendo reviews integration
Source: https://docs.aftersell.com/aftersell/okendo_reviews_integration
This article explains how to set up the Aftersell and Okendo Reviews integration for the testimonials widget.
Okendo reviews work automatically with Aftersell for displaying review stars on upsell offers. To use Okendo reviews in the testimonials widget, you need to provide your User ID.
## Setting up Okendo integration
1. Install the [Okendo app](https://apps.shopify.com/okendo-reviews) from the Shopify app store
2. In your Shopify admin, open the Okendo platform
3. Go to `Settings > Integrations > Credentials`
4. Copy your **User ID**
5. Open the Aftersell app, then go to `Settings > Product Reviews`
6. Select **Okendo** from the review integrations list
7. Paste your User ID in the **Okendo User ID** field
8. Click **Save changes**
The integration is complete. You can now use Okendo reviews in your Flex Testimonials widget.
## Syncing reviews
Aftersell imports reviews from Okendo and stores them so they can be displayed in the testimonials widget. The first import happens automatically within 24 hours, and then once a week after that.
To import reviews immediately:
1. Go to `Settings > Product Reviews`
2. Find the **Okendo reviews** section
3. Click **Sync now**
The sync status shows when reviews were last imported and when the next sync is available.
# Post-purchase upsells vs. thank you page upsells
Source: https://docs.aftersell.com/aftersell/one_click_upsells_vs_thank_you_page_upsells
This article outlines the key differences between post-purchase and Thank You page upsells.
Comparison:
| | | |
| --------------------------------------------------------------------------------- | ------------------------ | ------------------ |
| | **Post-purchase upsell** | **Thank You Page** |
| --- | --- | --- |
| Subject to [Shopify limitations](/aftersell/why_isnt_my_1_click_offer_displaying) | ✅ | ❌ |
| Adds to original order | ✅ | ✅ |
| Doesn't require re-entering payment | ✅ | ❌ |
## Here's a rundown of how these work:
To make the most of Aftersell's potential, understanding the functional and strategic differences between these upsell options is imperative.
## **Post-purchase upsells**
* Display **immediately after Checkout** but **before the Thank You Page**.
* Your customer's **payment information is already saved**, allowing them to **accept the offer with just one click**.
* This makes it easy to convert, helping you **generate extra revenue effortlessly**.
* The upsell is **combined with the original order**, which means **no additional shipping costs** or fulfillment steps for your team.- This bundling ensures **reduced shipping costs** and facilitates easier order tracking for your team.
## Can a customer see both?
Yes. If a funnel contains both a post-purchase offer and a Thank You Page widget, a single customer who uses a supported payment method (such as credit card or Shop Pay) will see **both**: the post-purchase offer first, then the Thank You Page offer after. This is intentional—every customer is shown at least one offer, and shoppers on unsupported payment methods (such as Apple Pay, Google Pay, or other wallets) only see the Thank You Page offer because Shopify skips the post-purchase step for those payments. See [Payment methods](/aftersell/payment_methods) and [Why isn't my 1-click offer displaying?](/aftersell/why_isnt_my_1_click_offer_displaying).
There is no built-in setting to suppress the Thank You Page widget based on payment method. If you want to avoid showing two offers to supported-payment customers, configure your funnel with **only** a post-purchase offer or **only** a Thank You Page widget rather than both.
## **Thank You Page Upsells**
* Appear on the **Thank You Page**, which displays after the post-purchase page. This page may also be referred to as the **Order Status** or **Order Confirmation** page.
* Payment information is not saved at this point, since checkout has already been completed. Customers must re-enter their payment details and complete checkout again to accept the offer.
Thank You Page upsells can be configured in one of two ways:
* **Merged with the original order** - the upsell is combined with the initial purchase into a single order.
* **Created as a separate order** - the upsell generates a second order that is distinct from the original.
When configured as a separate order, if the customer abandons the second checkout, the upsell order remains in **Draft** status.
Additional limitations to consider:
* Shopify restricts Thank You Page upsells to **one product per upsell offer**, and all products must be visible across the entire site.
* Because the checkout phase has ended, customization options for Thank You Pages remain limited, requiring thorough planning.
* Shopify restrictions mean products used in Thank You Page upsells must always be visible sitewide.
* Aftersell provides settings to automatically hide already-purchased products to enhance customer alignment and avoid redundancy.
# Order browser troubleshooting
Source: https://docs.aftersell.com/aftersell/order-browser-troubleshooting
Fix common issues with offer statuses, funnel gaps, and ineligible orders in the Order Browser.
Use this guide to investigate unexpected statuses or gaps you're seeing in the [Order Browser](/aftersell/order_browser_overview).
If your offer isn't showing up at all before you even get to the Order Browser, start with [Why isn't my post-purchase offer displaying?](/aftersell/why_isnt_my_1_click_offer_displaying) or [Widget Not Displaying on the Thank You Page](/aftersell/widget_not_displaying_on_the_thank_you_page).
For a complete overview of all Order Browser statuses, see the [Order Browser Overview.](/aftersell/order_browser_overview) Use this guide when you're investigating a specific status or unexpected gap.
## Why are so many orders showing as Ineligible?
Ineligible orders are controlled entirely by Shopify, not Aftersell. The most common causes are unsupported payment methods (digital wallets, BNPL, full gift card), orders under \$0.50, multi-currency, and duties or landed costs.
To investigate: use the **Ineligibility reason filter** in the order table to group orders by the specific reason. Then click into an individual order to confirm the payment method or order details behind it.
For a full breakdown of every ineligibility reason and what to do about each one, see the [Order Browser Overview](/aftersell/order_browser_overview). For supported and unsupported payment methods specifically, see [Payment Methods](/aftersell/payment_methods).
> **Tip:** If a large share of your orders are ineligible due to payment method, setting up [Thank You Page upsells](/aftersell/how_can_i_set_up_and_customize_thank_you_page_upsells_in_aftersell) is the best way to recover that traffic since TYP is not subject to Shopify's post-purchase restrictions.
***
## What does "Not configured" mean?
Not configured means a funnel has an offer slot (e.g., Offer 2) that exists but has no offer set up in it yet.
To fix it: click the **PPU Funnel** link in the order table to go directly to that funnel, then add an offer to the empty slot.
***
## What does "Products excluded" mean and how do I fix it?
Products excluded on a PPU offer slot means every product in your offer was excluded at the time of that order. Click into the order and open the PPU tab, the timeline will show a Products excluded warning with the specific reason listed below.
* **Product already in order:** the offer product was already in the customer's cart. Turn off "Hide offer if already purchased" in your offer settings, or add different products to the offer.
* **Product OOS:** the offer product was out of stock. Add more products so there's always something available to show.
* **Product Inactive:** the offer product was unpublished or deactivated in Shopify. Republish the product or swap it for an active one.
* **All products filtered:** every product was excluded by a combination of rules. Review your offer's filter settings and expand the eligible product pool.
> **Tip:** To reduce this over time, add more products to each offer as fallbacks and periodically check that your offer products are in stock and published.
***
## A lot of orders are showing No interaction. What can I do?
No interaction means the offer was shown but the customer left without clicking Accept or Decline. Some of this is normal behavior, but a consistently high rate can point to offer design issues.
A few things that help:
* **Fewer products per offer.** More than four items in a single offer can cause decision paralysis. Keep it focused and relevant to what the customer just bought.
* **Enable Require Confirmation Click to Accept** in your offer settings. This makes the Accept/Decline action more intentional and typically drives cleaner conversion data.
* **Check offer relevance.** If the offer doesn't feel connected to the original purchase, customers are more likely to ignore it.
**Note on fulfillment holds:** When an order shows 'No interaction', a fulfillment hold is placed for up to 60 minutes. The hold lifts when the customer accepts, declines, or the session closes. See the [Fulfillment](/aftersell/fulfillment) doc for more detail.
***
## Orders are showing Customer skipped. Is something broken?
Not necessarily. Customer skipped means the customer closed their browser or left before the post-purchase page had a chance to load. Common causes:
* The customer navigated away immediately after checkout
* The browser was closed before the post-purchase redirect completed
* The checkout completed through an accelerated flow that bypassed the post-purchase step
If you're seeing an unusually high volume of skips, check whether there have been any recent changes to your checkout configuration, or whether a specific sales channel is generating more skips than others.
***
## PPU Funnel is showing "No funnel triggered." How do I fix it?
No funnel triggered means the order was eligible but no funnel matched its trigger conditions. Common causes:
* No funnel has a trigger set to "All orders" as a catch-all fallback
* Funnel trigger conditions (product tags, customer tags, order value) no longer match the incoming orders
* Multiple funnels are competing and the expected one lost priority
To fix this long-term: make sure you have at least one low-priority funnel with a trigger set to all orders so there's always a fallback. Click the **PPU Funnel** link in the order table (or the **Offer triggered** event in the order timeline) to review and update your trigger logic directly.
***
## The Improvement Opportunities panel is flagging gaps. What should I do?
**Funnel & Offer opportunities** means one or more of your funnels has an unconfigured or missing offer slot. Use the Offer opportunities filter in the order table to find the specific orders, then click through to the funnel to set up the missing offer.
**Product opportunities** means an offer is configured but its products are frequently being filtered out or are unavailable. Use the Product opportunities filter to surface those orders, review which products are causing the gap, and either replace them or loosen the filter settings.
***
## I'm seeing "Timer expired" on PPU offers
Timer expired means the post-purchase session clock ran out while the offer was on screen. Shopify's post-purchase page has a time limit, and if the customer was on the page too long without interacting, the session expires.
This is expected for a small percentage of orders. If you're seeing it frequently, check whether your offer has an unusually large number of products or steps that might be slowing down load or review time.
***
## My test order's PPU timeline is empty or incomplete
If you placed a test order and the PPU tab shows no events or partial data, it's likely because the order ID wasn't available when the earliest events fired. This resolves automatically as the order completes - give it a few minutes and refresh.
***
## The PPU timeline is showing "Not loaded"
Not loaded means the post-purchase experience failed to load for this order. This is different from Ineligible (where Shopify blocked it) - the session started but something prevented the page from rendering.
Common causes include browser issues on the customer's side, a network interruption mid-redirect, or a transient Shopify platform error. It is not typically caused by your Aftersell configuration.
If you're seeing Not loaded on a small number of orders, no action is needed. If you're seeing it consistently across many orders, contact support and share the order numbers so the team can investigate whether there's a platform-level issue.
***
## I'm seeing "Shopify skipped" - what does that mean?
Shopify skipped means Shopify bypassed the post-purchase page for this order at a platform level. When you click into the order and open the PPU tab, you'll see:
> Shopify skipped can occur in a wider range of situations than just extreme platform load - including on development stores. If you're testing on a dev store and seeing this status, that is expected behavior. If you're seeing it at high volume on a live store with no clear cause, raise it with Shopify directly as it may indicate a Shopify platform issue.
Before reaching out to Shopify, use the **Ineligibility reason** filter in the Order Browser and select **Shopify skipped** to isolate only those orders. Many ineligible orders have a clear reason (payment method, duties, minimum order value, etc.) that can be resolved without involving Shopify at all. Only orders specifically tagged Shopify skipped are ones where Aftersell has no visibility and Shopify needs to be contacted.
Once you've confirmed the orders are genuinely Shopify skipped, use the **See Shopify docs** button in the order detail view or contact Shopify support directly for further context.
***
## I'm seeing "Pending conversion" on TYP widget
Pending conversion means the Thank You Page offer was displayed but a final decision hasn't been recorded yet. The most common cause is that the page is still open in the customer's browser. It typically resolves to Accepted or No interaction once the session closes.
If you're seeing a persistent volume that never resolves, reach out to support.
***
## I'm seeing "No products found" on TYP widget
No products found means the Thank You Page experience couldn't load any products to display. This is different from Products filtered out (where products exist but were excluded by a rule). No products found usually points to a configuration issue with the TYP offer itself, such as all products being unpublished or unavailable.
To fix it: review your TYP offer product selection and make sure at least one product is published and in stock.
***
## I'm seeing "Technical issue" on TYP widget
Technical issue means there was a problem loading the Thank You Page experience for that order. This appears as a badge in the TYP tab of the order detail view.
Like Not loaded on PPU, this is usually caused by a transient rendering or platform error rather than a configuration issue. If it's affecting a small number of orders, no action is needed. If you're seeing it consistently, reach out to support with the affected order numbers.
***
## I'm seeing "Products filtered out" on TYP widget
Products filtered out on the TYP widget means the Thank You Page offer had products configured but all of them were excluded before the widget could display anything.
This is distinct from No products found (where no products could be loaded at all). Products filtered out specifically means the products exist but your offer settings excluded them all.
To fix it: review your TYP offer's filter settings - check for "hide if already purchased," out-of-stock exclusions, or tag-based filters that may be eliminating all available products. Add more fallback products to the offer so there's always something eligible to show.
***
Still stuck? Reach out via chat or email us at [support@aftersell.app](mailto:support@aftersell.app).
# Order browser overview
Source: https://docs.aftersell.com/aftersell/order_browser_overview
The Order Browser gives you a centralized, order-level view of Aftersell performance. Use it to see which orders were eligible for a post-purchase offer, whether an offer was shown, how customers interacted with each offer slot, and where there are gaps in your setup.
The Order Browser currently covers Post-Purchase (PPU) and Thank You Page (TYP) experiences. **Coming soon:** Checkout and Rokt Thanks timeline data will be added in a future update.
## Accessing the Order Browser
To access it, navigate to: **Apps → Rokt Aftersell → Order Browser** in your Shopify admin.
***
## Summary Bar
At the top of the Order Browser, three metrics give you a quick pulse on performance for your selected date range.
| Metric | What it means |
| ------------------------- | -------------------------------------------------------- |
| **Total eligible orders** | Orders that qualified to receive a post-purchase offer |
| **Total offers shown** | How many of those orders actually had an offer displayed |
| **Upsell Revenue** | Total revenue generated from accepted offers |
The Order Browser defaults to the Last 30 days. Use the date picker in the top-right corner to adjust the range. Data is available from **February 25, 2026 onward**, and the Total Orders view shows all available data across your full history.
Use the **Export button** (also top-right) to download the current view as a CSV. The export respects any filters you have active, so filter first if you only want a subset of orders.
Order data updates every few minutes. Use the Last Updated timestamp and refresh button in the interface to check how current your data is.
***
## Performance Panels
Below the summary bar, three panels break down your performance in more detail. Together they help you quickly spot eligibility issues, configuration gaps, and opportunities to improve coverage.
#### Eligible Post-Purchase Orders
Shows the total count of eligible orders with a donut chart breaking them down by Shown vs Not shown. A high "Not shown" proportion usually points to funnel configuration gaps, product filtering, or Shopify eligibility issues. See the Order Browser Troubleshooting guide for next steps.
#### Improvement Opportunities
This panel highlights eligible orders where at least one offer didn't render because of funnel, offer, or product configuration gaps. Some of these orders may have shown other offers — fixing these gaps widens overall coverage. The panel is split into two categories: Funnel & Offer opportunities and Product opportunities. For each reason, the panel shows how many eligible orders were affected.
**Funnel & Offer opportunities**
**What it means:** An eligible order came through but no funnel matched its trigger conditions.
**What to do:** Create a catch-all funnel using the **Show for All Customers** trigger and set it to the lowest priority so it fires whenever no other funnel matches.
**What it means:** A funnel ran but one or more offer slots had no offer set up.
**What to do:** Go to the funnel and add an offer to the empty slot.
**What it means:** A funnel exists but hasn't been fully set up.
**What to do:** Open the funnel and complete the configuration.
**What it means:** A funnel was configured and matched the order, but every product across all offer slots was filtered out by your targeting or filter rules before anything could display.
**What to do:** Review your funnel's product filters and targeting rules. Broaden the filter criteria or add fallback products to ensure at least one offer has something eligible to show.
**What it means:** An individual offer slot ran but every product in it was filtered out before the offer could display.
**What to do:** Review the offer's filter settings and add more fallback products so there is always something eligible to show.
Opportunities are tagged based on the customer's actual journey, not the funnel's configuration. For example, if a funnel has no offer set up in slot 3 but the customer declined slot 2 and never reached slot 3, it will not be flagged. The flag only appears if the customer's journey would have reached that step.
You can click on any opportunity category to filter the order table to orders affected by that specific gap.
**Product opportunities**
**What it means:** The replacement upsell failsafe was triggered because the shop hit its replacement-failure threshold within the past 7 days. Replacement upsells are paused shop-wide until the rolling 7-day error count drops below the threshold or you reset the failsafe. Orders attributed to this reason never attempted a replacement.
**What to do:** Go to **Settings → Replacement Upsells** to see the failsafe status card and your current rolling error count. Once you've resolved the underlying issue, click **Reset failsafe** to resume. If errors have stopped, the failsafe also clears automatically once the 7-day window passes. If you're unsure of the root cause, contact support before resetting.
**What it means:** No line item in the order matched the replacement target's variant ID, so the replacement was skipped.
**What to do:** Review the replacement upsell configuration and confirm the target variant is present in the orders you expect it to match.
**What it means:** A recommended product is sold as a subscription only, but the customer's checkout already included a subscription, so it couldn't be added as a post-purchase upsell.
**What to do:** Consider replacing subscription-only products in this offer with non-subscription alternatives, or move subscription offers to the Thank You Page where this restriction doesn't apply.
These aren't errors. They're flags that something can be fixed to improve coverage.
### Ineligible Post-Purchase Orders
Shows orders that couldn't receive a post-purchase offer, broken down by the specific reason. The panel surfaces exact counts per reason so you can see where the biggest eligibility gaps are.
Shopify does not tell Aftersell exactly why an order was skipped for post-purchase. The system identifies likely reasons based on Shopify's documented limitations. Because a single order can match multiple reasons, the individual reason counts do not add up to the total ineligible number. No percentages are shown for this section for that reason.
You can click on any ineligibility reason to filter the order table to just those orders.
**What it means:** Order value was under \$0.50 (e.g., fully discounted orders).
**What to do:** Shopify restriction — no fix. Set up Thank You Page upsells to capture these orders.
**What it means:** Order included duties or landed costs.
**What to do:** Shopify restriction — no fix. TYP upsells are not affected.
**What it means:** Order was paid entirely with a gift card.
**What to do:** Shopify restriction — no fix. TYP upsells are not affected.
**What it means:** Order used a BNPL method (Klarna, Afterpay, Shop Pay Installments).
**What to do:** Shopify restriction — no fix. TYP upsells are not affected.
**What it means:** Order used a local delivery method not supported for post-purchase.
**What to do:** Shopify restriction — no fix. TYP upsells are not affected.
**What it means:** Order was placed in a currency other than the store's default.
**What to do:** Shopify restriction — no fix. TYP upsells support multi-currency and will show to these customers.
**What it means:** Shipping address was missing a country code.
**What to do:** Typically a data issue on the order. No fix available for past orders.
**What it means:** Order used a non-credit-card payment method not supported by Shopify.
**What to do:** Shopify restriction — no fix. TYP upsells are not affected.
**What it means:** Order used a third-party payment gateway that doesn't support post-purchase.
**What to do:** Check if your gateway supports Shopify's post-purchase API. See Payment Methods for the full supported gateway list.
**What it means:** Order used a digital wallet (Apple Pay, Google Pay, PayPal).
**What to do:** Shopify restriction — no fix. Set up Thank You Page upsells to capture wallet orders — TYP is not affected.
**What it means:** Shopify bypassed post-purchase for this order. Aftersell has no visibility into why — the error code shown in the order detail is `no_activity`.
**What to do:** Contact Shopify support directly. Aftersell cannot investigate or resolve this — it is entirely within Shopify's platform.
**What it means:** Order came through a channel that doesn't support post-purchase (e.g., draft orders, POS).
**What to do:** \[do you have a "what to do" for this one? I don't see one in your data — let me know and I'll add it in]
Payment wallet and Unsupported sales channel tend to be the largest contributors for most stores. For payment method restrictions, [Thank You Page upsells](/aftersell/how_can_i_set_up_and_customize_thank_you_page_upsells_in_aftersell) are the best way to recover that traffic since TYP is not subject to Shopify's post-purchase restrictions.
For a full breakdown of supported and unsupported payment methods, see [Payment Methods](/aftersell/payment_methods)
***
## The Order Table
Below the performance panels is a detailed, order-level table. Each row is a single order. This is where you can search, filter, and drill into exactly what happened for any order.
### Columns
| Column | What it shows |
| ----------------------- | ----------------------------------------------------------------------------------------------- |
| **Order** | Shopify order number. Click to open the order detail view. |
| **Date** | When the order was placed |
| **Eligibility** | Whether the order was eligible or ineligible for a post-purchase offer |
| **Sales channel** | e.g. Online Store |
| **Country** | The shipping country for the order, displayed as an ISO country code (e.g. US, GB, AU) |
| **Total** | Order value |
| **PPU Funnel** | Which post-purchase upsell funnel was shown. Click to open the funnel editor. |
| **PPU offer 1 / 2 / 3** | The interaction status for each post-purchase offer slot |
| **TYP Funnel** | Which Thank You Page funnel was shown |
| **TYP widget** | The widget status on the Thank You Page |
| **Rokt Thanks** | The Rokt Thanks offer status for the order (only visible if your store has Rokt Thanks enabled) |
PPU stands for Post-Purchase Upsell. TYP stands for Thank You Page. Each post-purchase funnel can have up to three offer slots (PPU offer 1, 2, and 3), each shown or resolved independently.
### Offer Status Definitions
**PPU offer statuses** (columns PPU offer 1, 2, 3)
| Status | What it means |
| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Accepted** | The customer accepted the offer. The item was added to their order. |
| **Declined** | The customer actively declined the offer by clicking the decline button. |
| **No interaction** | The offer was shown, but the customer closed the tab or navigated away without clicking Accept or Decline. The offer was seen, just not acted on. |
| **Customer skipped** | The customer skipped the post-purchase page entirely, or closed their browser before the offer loaded. The offer never had a chance to display. |
| **Timer expired** | The post-purchase session timer ran out before the customer interacted with the offer. |
| **Not configured** | An offer slot exists in the funnel but no offer has been set up in that slot yet. |
| **Products excluded** | The offer has products configured, but all of them are being excluded by your offer settings (e.g., hide if already purchased, out of stock, unpublished). Nothing was available to show. |
| **No stock at location** | Every candidate product for this offer was out of stock at the locations required by the offer's per-location inventory filter. Restock at those locations, or adjust the inventory filter on the offer strategy. |
| **Ineligible** | Shopify skipped the post-purchase page for this order due to a platform-level eligibility rule. This is a Shopify restriction, not an Aftersell configuration issue. |
| **Subscription upgrade issue** | The customer accepted the offer and the item was added to their order, but the downstream subscription upgrade at your subscription provider (Recharge, Loop, or Skio) failed. Open the order to see the specific cause and what to do to fix it. |
**TYP widget statuses** (TYP widget column)
Which Thank You Page funnel was shown. The Post Purchase funnel and Thank You Pafe funnel for an order can be the **same or different.**
| Status | What it means |
| -------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Accepted** | The customer accepted an offer on the Thank You Page. |
| **Declined** | The customer declined an offer on the Thank You Page. |
| **No interaction** | A TYP offer was shown but the customer didn't interact with it. |
| **Pending conversion** | The customer has seen the Thank You Page offer but a decision hasn't been recorded yet (the page may still be open). |
| **Products filtered out** | The TYP offer had products configured but all were filtered out, so nothing was displayed. |
| **No products found** | The TYP offer couldn't load any products to display. |
| **Technical issue** | There was a problem loading the Thank You Page experience for this order. |
| **Products excluded** | The offer has products configured, but all of them are being excluded by your offer settings (e.g., hide if already purchased, out of stock, unpublished). Nothing was available to show. |
| **Upsell hidden due to order merging** | The widget is set to "Modify original order" mode and every configured variant is already in the customer's order. Shopify does not allow duplicate variants in an order edit, so the upsell was hidden. Switch to **Create new draft order** in the widget's [order handling settings](/aftersell/thank_you_page_extensions_overview#order-handling) if you want to re-offer products the customer already purchased. |
| **Subscription conflict** | The offer included a subscription product but the order already contains a subscription. Shopify does not allow subscription upsells in this case. Consider moving subscription offers to the Thank You Page. |
**Rokt Thanks statuses** (Rokt Thanks column)
This column is only visible if your store has Rokt Thanks enabled.
| Status | What it means |
| ------------------ | -------------------------------------------------------------------------------------- |
| **Accepted** | The customer engaged with the Rokt Thanks offer (positive engagement recorded). |
| **Shown** | The Rokt Thanks placement loaded and was interactive, but the customer did not engage. |
| **No interaction** | The Rokt Thanks placement loaded but the customer did not interact with it. |
| **Not loaded** | The Rokt Thanks placement did not load for this order. |
**Funnel column statuses** (PPU Funnel, TYP Funnel columns)
| Status | What it means |
| --------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **No funnel triggered** | No funnel matched this order's trigger conditions. The order was eligible but no funnel fired. |
| **Funnel not set up** | A funnel matched the order but has no placements configured, so no offer was shown. Open the funnel and add an offer to at least one slot. |
| **All offers filtered out** | A funnel was configured and matched the order, but all products across every offer slot were filtered out by your targeting or filter rules. Review your funnel's product filters and targeting to ensure at least one offer has eligible products. |
Statuses that are frequently confused:
* **Customer skipped** = the offer never loaded (the customer left before the page could show)
* **No interaction** = the offer loaded and was visible, but the customer didn't click anything
* **Timer expired** = the session timed out while the offer was on screen
* **Ineligible** = Shopify blocked post-purchase from running at all for this order
* **No funnel triggered** = the order was eligible but no funnel matched its trigger rules
* **Funnel not set up** = a funnel matched but has no offer slots configured
* **All offers filtered out** = a funnel matched and had offers configured, but every product was filtered out by targeting or filter rules
* **Subscription upgrade issue** = the offer was accepted and the item added to the order, but the subscription upgrade at your provider failed — open the order for the specific cause and fix
***
## Searching and Filtering Orders
### Search
Use the search bar at the top to find a specific order by name.
### Filters
Click **Add filter +** to filter the order table. Multiple filters can be combined to narrow down results. Click **Clear all** to remove active filters.
| Filter | What it does |
| ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Post-purchase status | Filter by the overall post-purchase outcome, grouped into four buckets: **Not eligible**, **No offer shown**, **Shown, not accepted**, and **Accepted**. Use this as a quick top-level filter to find all orders where a customer accepted, declined, or never saw an offer. |
| Post-purchase eligibility | Filter by whether an order was eligible or ineligible |
| PPU Funnel | Filter by which post-purchase upsell funnel was shown |
| Post-purchase offer 1 / 2 / 3 | Filter by the status of each offer slot |
| TYP Funnel | Filter by which Thank You Page funnel was shown |
| Thank You page status | Filter by the outcome on the Thank You Page |
| Payment status | Filter by payment method or status |
| Post-purchase shown | Filter by whether the post-purchase page was shown |
| Thank You page shown | Filter by whether the Thank You Page was shown |
| Funnel opportunities | Filter by orders with funnel-level improvement opportunities |
| Product opportunities | Filter by orders with product-level improvement opportunities |
| Offer opportunities | Filter by orders with offer-level improvement opportunities |
| Ineligibility reason | Filter by the specific reason an order was ineligible |
***
## Viewing an Individual Order
### Viewing an Individual Order
Click any order number to open the order detail view. This is a complete record of Aftersell activity for that order. Use **View in Shopify** in the top right to open the order directly in Shopify.
The detailed timeline view is only available for orders placed after the Order Browser launch. Orders placed before that date will show limited timeline data.
The detail view has two collapsible sections: **Post Purchase** and **Thank You Page**. Click the section header (the chevron on the left) to expand or collapse each one. Each section displays a status badge at a glance, for example **1 Accepted** or **No interaction**, so you can understand the outcome without expanding the section. The right sidebar shows order info, customer details, payment method, tags, and discounts.
### Order Summary (right sidebar)
Shows all products in the order including any accepted upsells, quantities, pricing, shipping address, customer tags, payment method, order tags, and discount codes. This sidebar pulls from Shopify directly and requires no additional configuration.
### Post Purchase (PPU tab)
A step-by-step milestone timeline of the post-purchase experience for this order.
| Milestone | What it means |
| ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Offer triggered** | The funnel fired for this order. Shows the funnel name (click to edit triggers) and the reason the funnel was selected. |
| **Offer shown** | An offer was displayed. Shows the products that were presented, with thumbnails. |
| **Offer accepted** | The customer accepted the offer, including revenue amount. If the offer included a subscription upgrade and the upgrade failed at your subscription provider, a red banner appears beneath this milestone showing the specific cause and what to do to fix it. |
| **Offer declined** | The customer declined the offer. |
| **Ineligible** | Shopify blocked the post-purchase page for this order. Shows the specific Shopify eligibility reason. |
| **Not loaded** | The post-purchase experience failed to load. |
| **Subscription upgrade failed** | The subscription upgrade at your provider failed after the offer was accepted. This row shows the specific failure cause and remediation steps. |
If products were excluded from an offer, you'll see a **Products excluded** warning beneath the milestone with the specific reason. Possible reasons include:
**What caused it:** Shopify blocked the order at a platform level.
**What caused it:** No funnel matched this order's trigger conditions.
**What caused it:** Every product in the offer was filtered out by your settings.
**What caused it:** The offer slot exists but no offer has been set up.
**What caused it:** The offer product was already in the customer's original order.
**What caused it:** The offer product was out of stock at the time of the order.
**What caused it:** The offer product was unpublished or inactive in Shopify.
**What caused it:** The offer product was out of stock at the locations required by the offer's per-location inventory filter. Restock at those locations, or adjust the filter on the offer strategy.
**What caused it:** The offer product was excluded by a product-tag filter on the offer strategy. Review the filter or widen the product pool in your offer strategy.
**What caused it:** The offer product was excluded by a product-metafield filter on the offer strategy. Review the filter or widen the product pool in your offer strategy.
**What caused it:** The offer product was excluded by a product filter on the offer strategy. Review the filter or widen the product pool in your offer strategy.
**What caused it:** The post-purchase session timer ran out before the offer had a chance to load.
If you placed a test order and the PPU timeline shows no events or incomplete data, it may be because the order ID wasn't available when the earliest events fired. This resolves automatically as the order completes.
### Thank You Page (TYP tab)
Shows the same milestone structure as the PPU tab, filtered to Thank You Page events. A **Technical issue** badge means there was a problem loading the TYP experience for this order.
***
Something not looking right? See the [Order Browser Troubleshooting](/aftersell/order-browser-troubleshooting) guide, or reach out via chat or email us at [support@aftersell.app](mailto:support@aftersell.app).
# Pages vs standalone widgets
Source: https://docs.aftersell.com/aftersell/pages-vs-standalone-widgets
In Checkout , there are two ways to add widgets to your Checkout: **Pages** and **Standalone widgets**. This article explains how each works, when to use them, and how to get them placed in your Shopify Checkout.
### **Which should I use?**
| | **Pages** | **Standalone widgets** |
| :------------------ | :--------------------------------------- | :--------------------------- |
| **Best for** | Displaying multiple widgets together | Displaying a single widget |
| **Triggers** | Shared across all widgets in the page | Set individually per variant |
| **Block limit** | Max 5 blocks per widget type | Max 3 blocks per widget type |
| **Block placement** | One app block per widget inside the page | One app block per widget |
***
## **Pages**
A Page is a group of widgets that share a single group of triggers. When the trigger conditions are met, all widgets within the page are displayed together. Pages are ideal when you want to show multiple widgets to the same audience at the same time.
### [****](/aftersell/pages-vs-standalone-widgets#creating-a-page)
**Creating a Page**
When creating a page, you have two options: **Guided setup** or **Start from scratch**.
**Guided setup**
The Guided setup walks you through a recommended configuration based on a goal you choose. The setup follows four steps: **Goal, Triggers, Widgets, and Placement.**
**Step 1: Goal**
Choose the goal that best fits what you want to achieve. Each goal comes with a recommended set of widgets pre-configured for you.
| **Goal** | **Recommended widgets** |
| :----------------------------------------------------- | :------------------------------------- |
| Increase Average Order Value (AOV) and conversion rate | Upsells, Trust Badges, Testimonials |
| Build customer trust and reduce abandonment | Trust Badges, Cart Controls, Text |
| Promote add-ons and accessories | Checkbox Upsells, Images, Testimonials |
| Encourage customers to reach free shipping threshold | Upsells (with Rewards), Text |
**Important:** Your goal cannot be changed after saving. If you need a different goal, you will need to delete the page and create a new one. However, widgets can be added to or removed from a page at any time. Take a moment to choose the goal that best fits your strategy before proceeding.
Once you’ve selected your goal, click **Save and next** to continue.
**Step 2: Triggers**
Set the conditions under which your page will be shown, or choose to show the page to all customers with no conditions. For a full list of available triggers, see[ Checkout Triggers](/aftersell/checkout_triggers).
**Step 3: Widgets**
Review the widgets that have been recommended for your goal. You can add or remove widgets at this stage, and access advanced settings for each widget. For a full list of available widget types and their settings, see[ Checkout Widget Types](/aftersell/checkout_widget_types).
**Step 4: Placement**
Each widget in your page needs to be placed individually in your Shopify Checkout editor. Each widget is assigned a **BlockID** (e.g., page-upsell-001, page-upsell-002) which is used to identify it when adding the app block in Shopify.
Location recommendations are provided to help you decide where to place each widget on the Checkout Page to place a widget:
1. Note the **BlockID** assigned to your widget in the Aftersell dashboard.
2. Open the **Shopify Checkout editor**.
3. Add the **Aftersell app block**.
4. From the dropdown, select the BlockID that matches your widget (e.g., page-upsell-003).
**Note:** Each widget within a page **has its own BlockID and must be added as a separate app block in the Shopify Checkout editor.** A widget will not display until it has been placed.
***
**Start from scratch**
Start from scratch follows the same process as Guided setup, but skips the Goal step. You configure your triggers, add your widgets manually, and then place them in your Shopify Checkout editor using their BlockIDs.
**Editing a Page**
You can edit a page at any time after creation, including adding or removing widgets and updating triggers. The only thing that cannot be changed is the goal. If you need to change the goal, delete the page and create a new one.
**Duplicating a Page**
To create a copy of an existing page, click the **Duplicate** icon on the page row in the dashboard. The duplicated page is created in an inactive state with the name prefixed by "(Duplicated)" and includes all the same widgets and trigger configuration as the original. You can rename and activate it when ready.
***
## **Standalone widgets**
Standalone widgets are individual widgets, each with their own triggers and priority and are best suited for when you only need to display a single widget all the time or to a targeted group of customers.
### [****](/aftersell/pages-vs-standalone-widgets#creating-a-standalone-widget)
**Creating a Standalone widget**
Click **Create widget** from the dashboard. You will be prompted to select two things:
* **Widget type**: The type of widget you want to create (Upsells, Rewards, Trust Badges, Testimonials, Cart Controls, Notes, Text, or Images). For a full breakdown of each widget type and its settings, see[ Checkout Widget Types](#checkout_widget_types).
* **Block**: Which block to add the widget to. There are three blocks available, and the naming follows the widget type you selected. For example:
* Upsells: Default upsell, Additional upsell 1, Additional upsell 2
* Trust Badges: Default trust badge, Additional trust badge 1, Additional trust badge 2
* And so on for each widget type
Each block can hold multiple variants, The block counter in the top-right of the selector shows how many of the 3 available blocks you have created (e.g., 2/3 means 2 blocks created, 1 remaining).
### [****](/aftersell/pages-vs-standalone-widgets#block-limit)
**Block limit**
A maximum of **3 blocks** can be used for Standalone widgets. Once all 3 blocks are in use, the **Add new block** option will be unavailable and no additional widgets of the same type can be created until an existing block is removed.
### [****](/aftersell/pages-vs-standalone-widgets#placement)
**Placement**
Each Standalone widget must be placed in your Shopify Checkout editor as its own app block. When adding an app block in Shopify, you will see BlockID options for your standalone widgets listed as:
* Default placement
* Additional placement 1
* Additional placement 2
These placement options determine the order in which widgets appear in your checkout experience.
**Note:** For upsell widgets, placement also corresponds to the sequence in which upsell offers are shown (e.g., first, second, third upsell displayed).
To place a widget:
1. Open the **Shopify Checkout editor**.
2. Add the **Aftersell app block** in your desired location.
3. From the dropdown, select the BlockID that corresponds to your widget.
***
## **Analytics**
Analytics are available for both Pages and Standalone widgets. You can view performance data for any individual page or widget by clicking the **bar chart icon** next to it on the dashboard, from within the editor itself or from the Analytics tab in the side navigation
# Partially paid orders
Source: https://docs.aftersell.com/aftersell/partially_paid_orders
# What causes a Partially paid order?
In some cases, when your customer attempts to accept a post-purchase upsell they might receive a **payment declined** message. The payment could fail for a number of reasons, the most likely causes of payment failure are insufficient funds on the card or if the payment processor denies the transaction. If the payment for a post-purchase upsell item fails, Shopify will still add the upsell item to the order. This results in a **Partially paid order** where the initial items are paid for, but the payment for the upsell item was not processed.
### **🔖 If you are seeing a high number of Partially paid orders**
A high number of **Partially paid orders** indicates that there is likely an issue with the payment capture process. Do any of the following apply to you?
* Your store's **Payment capture** setting is set to **Manual**, or
* You use a fraud detection app such as **NoFraud** or **Riskified**, or
* You use a **Shopify Flow** to capture payment or send emails about high-risk orders
If any of the above points apply to you, read more about how to deal with payment capture for post-purchase upsells [here](/aftersell/payment_capture).
If none of the above points apply to you, continue reading to learn how to deal with partially paid orders.
## **What do you see in Shopify Admin for Partially paid orders?**
In your Shopify admin, a **Partially paid order** can be identified by the order payment status of **Partially paid** as shown in the image below.
**Partially paid orders** will also show a failed payment processing attempt in the order timeline.
## **What does a customer see for Partially paid orders?**
### **"Payment needed" banner on order confirmation page**
If a customer accepts a post-purchase upsell and the payment is declined, your customer will be redirected to the order confirmation page. On the order confirmation page, the customer will see a message notifying them that the product was added to the order, but payment is still required. The message will prompt the customer to pay for the outstanding amount.
### **Invoice email after 2 hours**
If payment for the upsell item is still outstanding after 2 hours, Shopify will send an **invoice email**. If payment for the additional item has already been received, or the item has been removed from the order, this email will not be sent. For more details on resolving **Partially paid orders**, continue reading below.
***
# **Resolving and fulfilling a Partially paid order**
### **🚧 A partially paid order should not be fulfilled until the issue is resolved**
You may lose money if a post-purchase upsell item is fulfilled without processing payment for the item. Please ensure that you are resolving **Partially paid order** issues using the steps below to avoid accidentally shipping unpaid items.
## **Resolving Partially paid orders**
A **Partially paid order** can be resolved in one of two ways:
1. **Collecting payment for the unpaid product.** This is the preferred case. If possible, we want the customer to pay for the additional product using a different card or payment method. This relies on the customer clicking on the message on the order status page. It is not guaranteed that the customer will go through the payment process again for the additional product. Please read the next option below to handle any orders where the customer does not pay for the additional item.
2. **Remove the unpaid item from the order.** If the customer does not choose to pay for the additional item, then we still want to be able to fulfill the original order. To ensure that the unpaid additional item doesn't get fulfilled without payment, we want to remove the item from the order. **Aftersell has a built-in setting that automates this process of removing items for you.** To enable this feature:
* Navigate to **Settings > Fulfillment and Payment > Partially Paid**
* Toggle on *"Automatically remove partially paid items"* This setting will automatically remove unpaid upsell items from **Partially paid orders** after the specified delay if the payment is not collected. You can customize the time duration to align with your business needs, setting values such as 6 minutes or 65 minutes. Selecting a longer delay will give your customers a longer period to hopefully pay for the additional item. Selecting a shorter delay will allow you to fulfill orders more quickly, but may result in fewer customers paying for the additional item.
## **Fulfillment considerations with Partially paid orders**
**Benefits of automating unpaid item removal** By using Aftersell's automatic removal feature for unpaid upsell items, you can:
* Avoid mistakenly shipping unpaid items, reducing potential revenue loss
* Ensure that only fully paid orders proceed to fulfillment, avoiding unnecessary delays
* Save time and manual effort involved in tracking and removing unpaid items
This automation streamlines your order management process, letting you focus more on growing your business.
We do not want to accidentally fulfill unpaid upsell items in **Partially paid orders**. Because there are many different ways to handle fulfillment, the best way to ensure that **Partially paid orders** are handled properly in fulfillment is to **test on your store**, or on a sandbox/development store.
### **Testing Partially paid orders**
To test a **Partially paid order**, we need to simulate a failed payment on the post-purchase page. To simulate a failed payment, we can take advantage of a Shopify limitation: *Shopify fails to process transactions under \$0.50 (USD or CAD)*. You can set up a test funnel on Aftersell and discount a product so that the total price (after tax and shipping) is under \$0.50 as shown in the image below. The item must be at least \$0.01, it cannot be free. Accepting a post-purchase upsell for less than \$0.50 will result in a partially paid order.
### **Solutions to potential fulfillment problems with Partially paid orders**
If you have tested a **Partially paid order** and are having problems with fulfillment, the safest solution is to ensure that orders are not imported into your fulfillment service until the order hold has been released and the order is fully paid. For details on customizing fulfillment workflows, see the [Fulfillment article](/aftersell/fulfillment).
# Payment capture
Source: https://docs.aftersell.com/aftersell/payment_capture
How to avoid missing payments on your post-purchase upsell orders
***
## Payment Capture
If your store is using Manual Payment Capture, you may be seeing some orders in a partially paid status. This article will show you how to resolve this issue while retaining your Manual Payment Capture settings.
***
## Why This Happens
If your store is using a fraud detection app (e.g. **NoFraud** or **Riskified**), the fraud detection app might not natively support post-purchase upsells. In these cases it will often capture payment for the order too early, before the post-purchase upsell is added. The post-purchase upsell payment will be authorized, but only the initial payment would be captured. Such an order would be shown as **Partially paid**.
Additionally, the timing of the fraud app's payment capture can interfere with Aftersell's item cleanup logic. If the fraud app captures the original payment **after** the upsell authorization fails, Aftersell may not remove the unpaid upsell item from the order as expected. This can result in customers receiving free product.
***
## How to Fix It
First, you'll need to confirm that you're currently on Manual Payment Capture. If you aren't, then unfortunately the rest of this article won't apply to you.
### Confirm Your Payment Capture Settings
Your store may have an automatic payment capture system set up, yet still have the Shopify Manual Payment Capture setting enabled. You can confirm your store's payment capture settings:
**Shopify Admin > Settings > Payments > Payment Capture Method**
If you're currently on Manual Payment Capture, continue reading!
### Creating a Shopify Flow
The simplest solution to ensure that all payments for an order are captured is to use a **Shopify Flow**. Below is an image of a Shopify Flow that achieves this:
### Explaining the Flow
This flow has 3 steps:
1. **A Trigger** is put in place to ensure you only start the flow when an order transaction has been created. The first transaction for an order is created when the customer places the order. An additional transaction is created if the customer accepts the Aftersell post-purchase upsell. Our goal is to capture payment on the second transaction, so we will check some conditions in the next step.
2. **Conditions** are put in place to ensure the flow only continues in certain scenarios. We only want this flow to continue if the transaction that was created is from a post-purchase upsell. We also don't want to run this flow if payment for the original order hasn't been captured yet. This flow is only supposed to capture additional payment that was missed. If there hasn't been any payment captured yet, then we will do nothing in this flow and assume that the regular payment capturing system will capture the full amount.
3. **Capture payment** once all of your checks have passed. This will capture the payment only for the extra amount from the post-purchase upsell. Problem solved!
After implementing the flow above, if you are using external fulfillment services please ensure that the payment capture Flow doesn't have unintended effects on your fulfillment. For more details on fulfillment, please see our [Fulfillment Documentation](/aftersell/fulfillment).
***
## Post-Purchase Upsell Payment Capture Not Working
\
This section applies if you are experiencing a **recent spike** in Partially paid orders specifically on post-purchase upsells, even if you do not use a fraud detection app.
\
### What Changed
Shopify updated their built-in automation template **"Capture payment if order is not high fraud risk"** around **March 31, 2026**. This update changed how Shopify evaluates fraud risk on order edits, which broke the automatic payment capture for post-purchase upsells.
Previously, Shopify would re-run fraud analysis when an order was edited (such as when a post-purchase upsell item was added). This risk-level change would re-trigger the payment capture template flow, capturing the upsell payment. Shopify no longer re-runs fraud analysis on order edits, so the template flow does not re-trigger and the upsell payment is not captured.
This issue affects stores **with or without** a fraud detection app.
### Symptoms
You may be experiencing this issue if:
* You have noticed a sudden spike in **Partially paid** orders on post-purchase upsells
* Only orders where a customer accepted a post-purchase upsell are showing as Partially paid
* Payment for the original order is captured, but the upsell payment is **authorized and not captured**
* You did not change anything in your store settings around the time the issue started
### How to Fix It
**Use the Aftersell Flow template for a one-click setup.** Aftersell publishes a pre-built Flow template called **"Capture post-purchase upsell payment"** in Shopify's Flow template library. You can install it directly from the Flow app without building the workflow manually. Search for it in the Flow template library under the **Orders** or **Risk** categories.
If you prefer to build the flow manually, create a new **Shopify Flow** with the following configuration:
1. **Trigger:** "Aftersell Post Purchase Offer Accepted" - This fires when a customer accepts an Aftersell post-purchase upsell offer and the item is successfully added to the order.
2. **Condition:** "Order capturable is equal to True" - This ensures the flow only attempts to capture payment when the order is in a state where capture is possible.
3. **Action:** "Capture payment" - If the condition is true, the flow captures the outstanding payment for the upsell amount.
\
**Do not add a presentment money amount condition.** Some stores have experienced issues where Shopify incorrectly returns the presentment money amount as 0, even when there is an outstanding balance. Adding a condition like "presentment money amount is greater than 0" can cause the flow to skip payment capture on valid orders. This can result in customers receiving invoice emails instead of having their payment captured automatically. Keep the flow simple: trigger, capturable check, capture payment.
\
\
Your existing Shopify automation for capturing payment on the original order can stay as-is. This new flow runs alongside it and only handles the post-purchase upsell payment.
\
### After Setting Up the Flow
* **Test the flow** on a development or sandbox store before enabling it in production.
* **Monitor your orders** for a few days after enabling the flow to confirm payments are being captured as expected and no invoice emails are being sent to customers.
* **Check your fulfillment workflow.** If you use external fulfillment services, make sure this payment capture flow does not trigger fulfillment before you are ready. For more details, see our [Fulfillment Documentation](/aftersell/fulfillment).
* **Review your order hold settings.** If you have had orders ship without completed payment, confirm your order hold settings are configured to prevent fulfillment until payment is fully captured.
***
## Summary
| Situation | Cause | Fix |
| --------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------- |
| Sudden spike in Partially paid orders on post-purchase upsells (with or without a fraud app) | Shopify updated the "Capture payment if order is not high fraud risk" automation template around March 31, 2026, changing how fraud analysis is run on order edits | Create the "Aftersell Post Purchase Offer Accepted" Shopify Flow |
| Fraud detection app (e.g. Riskified, NoFraud) captures payment too early, or customers receiving free product from failed upsells | Fraud app captures original payment before upsell is added, or interferes with item cleanup timing | Create the "Order transaction created" Shopify Flow from the manual capture section above |
| Customers are receiving invoice emails after accepting a post-purchase upsell | The Shopify Flow may include a presentment money condition that Shopify is returning incorrect data for | Remove the presentment money condition from the flow (keep only the "Order capturable" condition) |
| You are not on Manual Payment Capture | Different issue - this article does not apply | See [Partially Paid Orders](/aftersell/partially_paid_orders) for other causes |
***
## Frequently Asked Questions
### I don't use a fraud app. Why are my post-purchase upsell payments not being captured?
Shopify updated their built-in "Capture payment if order is not high fraud risk" automation template around March 31, 2026. Previously, Shopify would re-run fraud analysis when an order was edited (like when a post-purchase upsell was added), which re-triggered the payment capture flow. Shopify no longer does this, so the upsell payment is not captured. Creating the "Aftersell Post Purchase Offer Accepted" Shopify Flow described above will resolve this issue.
### Will the new flow capture the full order amount or just the upsell amount?
The flow only captures the outstanding upsell amount. It does not re-capture or double-capture the original order payment.
### What happens if the order is not capturable when the flow runs?
The flow checks the "Order capturable" condition first. If the order is not yet capturable, the flow will not attempt to capture payment. This prevents errors from running the capture too early.
### I already have a Shopify automation for capturing payment. Do I need to change it?
No. Your existing Shopify automation (such as "Capture payment if order is not high fraud risk") can stay as-is. The new Shopify Flow runs alongside it and specifically handles the post-purchase upsell payment gap.
### My customers are receiving invoice emails after accepting a post-purchase upsell. What is happening?
This can happen if the Shopify Flow includes a presentment money amount condition. Shopify sometimes returns the presentment money amount as 0 even when there is an outstanding balance. When this happens, the flow skips payment capture, and Shopify sends an invoice email to the customer instead. The fix is to remove the presentment money condition from the flow and keep only the "Order capturable" check.
### I use Riskified / NoFraud and my customers are getting free product from upsells. What is happening?
When a customer accepts a post-purchase upsell but the upsell payment authorization fails, Aftersell should remove the unpaid item from the order after a set amount of time (configured in Aftersell > Settings > Fulfillment and Payment > Partially Paid). However, if your fraud app captures the original payment at a specific point in the sequence, it can interfere with Aftersell's cleanup logic, causing the unpaid item to stay on the order and get fulfilled for free. The Shopify Flow fix above will help by ensuring payment is captured promptly. You should also review your Partially Paid auto-removal settings and your order hold settings to prevent fulfillment before payment is confirmed.
### Is Aftersell involved in payment capture?
No. Aftersell is not involved in payment authorization or capture. Aftersell tells Shopify to add the upsell product to the order via Shopify's post-purchase API. Shopify handles the rest of the payment process. The Shopify Flows described in this article are the recommended way to ensure payment is captured.
### Where can I learn more about Partially paid orders?
See our [Partially Paid Orders](/aftersell/partially_paid_orders) article for details on what causes Partially paid orders and how to resolve them.
# Payment methods
Source: https://docs.aftersell.com/aftersell/payment_methods
This article will cover the payment methods supported for post-purchase offers.
Post-purchase upsells may not display due to **limitations in Shopify's Post-Purchase Extensions API**. For more information, you can refer to [Shopify's documentation](https://shopify.dev/docs/apps/checkout/product-offers/post-purchase#limitations-and-considerations) on these limitations. While post-purchase upsells are a powerful way to increase AOV, their availability depends largely on the **payment method used at checkout** and a few other Shopify-enforced conditions.
The most common reason post-purchase upsells don't appear is the use of an **unsupported payment method**. In the funnel editor, you can hover over the info icon next to the funnel active/inactive toggle to see a quick summary of which payment methods skip post-purchase offers.
***
## **Supported Payment Methods**
Post-purchase upsells will display as long as the order meets [Shopify's requirements](/aftersell/why_isnt_my_1_click_offer_displaying) and uses a supported payment method. Here's the full list of these **supported payment methods:**
* **Shopify payments** (for Credit Cards)
* **Shop Pay**
* **PayPal Pro & PayPal PayFlow** (when used with a credit card)
* **PayPal Express** (with Automatic Payments enabled, PayPal knows them as Reference Transactions)
* See the [PayPal Automatic Payments article](/aftersell/paypal_automatic_payments) for more information on how to check this.
* **NOTE:** Shopify automatically sends a request for Automatic Billing/Reference Transaction Approval on your behalf when you install Aftersell. It usually gets accepted within a few days but we recommend checking its status until approved.\
If you've been declined, you'll need to reach out to PayPal Support directly and ask them about your Reference Transaction Application being denied.
* There's a known PayPal limitation affecting post-purchase offers. PayPal Express only supports one upsell after checkout due to how it processes additional charges. As a result, only the first upsell or downsell will appear, and any further offers will be skipped. This is a PayPal system restriction that Shopify and Aftersell cannot override. Impressions for Upsell #2 and beyond should still appear when using other supported payment methods.
We're aware that some PayPal versions are currently not working with post-purchase offers. Our team is investigating the issue. We also recommend contacting Shopify Support for any questions related to this PayPal issue.
* **Braintree** (without CVV verification enabled)
* **Authorize.net**
* **Note:** *Replacement* *Upsells* are an exception, and are not supported by Authorize.net. This is because the settlement process necessary to enable transaction refunds happens once a day, making the refund of an item that was just purchased infeasible.
* **Stripe**
* **Note:** Newer versions of stripe are no longer supported by Shopify's Post-Purchase API. Ensure compatibility by using officially supported versions of Stripe or other direct credit card processors fully embedded in Shopify's checkout workflow.
* It is also important to note that newer versions of Stripe are no longer supported by Shopify's Post-Purchase API. Merchants should ensure compatibility by using officially supported Stripe versions or other fully embedded direct credit card processors within Shopify's checkout workflow.
* Any other **direct credit card payment processor** that is embedded within Shopify's checkout.
***
## **Unsupported Payment Methods**
The following payment methods are currently **unsupported for post-purchase upsells:**
#### **Buy Now, Pay Later / Installments**
* Affirm, Afterpay, Klarna, Sezzle, Shop Pay Installments, etc.
#### **Digital Wallets**
* Apple Pay, Google Pay, Amazon Pay, PayPal Wallet
#### **PayPal Billing Agreement**
* Orders paid via PayPal Billing Agreement skip post-purchase offers.
#### **Bank Transfers**
* iDEAL, Bancontact, PayPlus, etc.
#### **Regional / Alternative Payment Gateways**
* Mollie, Adyen, Checkout.com, Worldpay, and similar gateways that are not embedded directly into Shopify's checkout as a supported credit card processor.
* If your store's primary gateway isn't listed in the **Supported Payment Methods** section above, assume it is **not** supported by Shopify's Post-Purchase Extensions API and use Thank You Page offers instead.
#### **Other**
* Gift cards (fully paid with gift cards)
* Partial gift card payments *will* still show upsells
* Cash on Delivery
* Shopify store credit
These limitations apply to **all post-purchase apps**, as required by Shopify's API.
***
## Additional Shopify Requirements
Additionally, orders must meet the following conditions to support post-purchase upsells:
* The order value must be at least \$0.50
* The order must be placed on the Online Store sales channel.
* The order must be completed in the store's default currency.
* Duties and landed costs must not be included.
***
## **What If Most Of My Orders Use Unsupported Payment Methods?**
If your customers frequently uses BNPL, wallets, or bank transfers, we recommend using **Thank You Page offers** instead.
Thank You Page upsells:
* Work with **all payment methods**
* Do not rely on Shopify's Post-Purchase API
* Appear on the Thank You / Order Status page
Here's how you can set them up:
1. **Access Your Funnel Settings**
* Open your Aftersell account.
* Navigate to the final step of your funnel and select `Edit Extensions Page`. This allows you to configure and add Thank You Page widgets or product recommendations.
2. **Open the Shopify Editor**
* In the Aftersell dashboard, locate the blue banner and click `Open Shopify Editor` to add Aftersell widgets.
3. **Add Widgets to Shopify**
* In the Shopify Editor, add the Aftersell widgets to the following locations:
* Thank You Page
* Order Status Page
* Ensure that the widgets display upsell offers or product recommendations.
4. **Save and Test**
* After completing the configuration, save changes and simulate an order using an unsupported payment method to confirm the Thank You Page upsell is displayed.
## Benefits of Thank You Page Upsells
* **Universal Compatibility:** Thank You Page upsells work with all payment methods, bypassing Shopify's API limitations.
* **Simplified Checkout Process:** Offers appear on the order status page, providing a seamless post-purchase experience without altering the payment mechanism.
* **Customizable Recommendations:** You can highlight relevant product recommendations, enhancing the likelihood of additional purchases.
***
# Troubleshooting Payment Method Issues
If your funnels or upsell offers are not triggering as expected, consider these steps:
1. **Verify Payment Method Compatibility:** Ensure the customer used a supported payment method listed above.
2. **Check Store Configuration:** Confirm conditions like default currency, sales channel, order minimum value, and absence of duties or landed costs are met.
3. **Review Documentation:** Consult our [documentation](/aftersell/why_isnt_my_1_click_offer_displaying) for updates and guidelines. Additionally, Thank You Page offers are compatible with all payment methods, making them a versatile option for orders placed with unsupported payment methods, such as Buy Now Pay Later services or digital wallets.
4. **Check Widget Placement:** Ensure the widgets are correctly placed on the Thank You Page and Order Status Page through the Shopify Editor.
5. **Activate Thank You Page Settings:** Verify that your Thank You Page setup is activated in Aftersell to avoid default redirection to the product page.
# PayPal automatic payments
Source: https://docs.aftersell.com/aftersell/paypal_automatic_payments
How PayPal Reference Transactions work and how to check your approval status for post-purchase upsells
Reference Transactions allow applications to charge customers without requiring them to re-enter their payment details, making them essential for post-purchase upsells to display to PayPal customers. When you first install Aftersell, an approval request is automatically sent to PayPal on your behalf.
**Checking your approval status**
1. Go to your Shopify admin and click **Settings** in the bottom left
2. Click **Payments** in the left column
3. Find your PayPal payment method and click **Manage** in the top right
4. Check the **Automatic Payments** line for your current status
**What does my status mean?**
**Approved:** PayPal customers will be able to see your post-purchase upsells, assuming all other Shopify requirements are met.
**Pending:** PayPal hasn't reviewed your application yet. Check back daily until the status changes.
**Declined:** PayPal has denied access to Reference Transactions for your account. This is outside of Aftersell and Shopify's control. Contact PayPal support directly and ask them why your account was not approved for reference transactions, then follow their recommendations to appeal the decision.
**My status shows "Approved" but PayPal customers still aren't seeing upsells**
Shopify can occasionally display an incorrect approval status. If eligible customers still aren't seeing upsells despite an approved status, contact PayPal support directly and ask them to confirm whether your account is approved for reference transactions. If they confirm approval, take a screenshot of that confirmation and reach out to our support team for further assistance.
# Post-purchase offer types
Source: https://docs.aftersell.com/aftersell/post-purchase-offer-types
The offer structures and product-selection methods available for Aftersell post-purchase offers, including Most Expensive and Least Expensive in Cart.
Every post-purchase offer is built from two choices: the **offer structure** (how many products the offer shows) and the **product-selection method** (how Aftersell decides which product to put in the offer). This page covers the options available for each so you can pick the right combination for your funnel.
Only **one product per offer** can be accepted at a time, unless you use [multi-step offers](/aftersell/how_to_create_a_multi_step_post_purchase_upsell). Post-purchase offers **add** to the customer's order; they do not replace items already purchased (except [Replacement Upsells](/aftersell/replacement_upsells)).
***
## Offer structures
When you create an offer, you first choose how many products it presents.
* **Single Product** — Shows one product to the customer. Best for a clear, focused offer with a single accept/decline decision.
* **Multi Product** — Shows several products at once (in a stack or carousel). The customer picks one to accept.
***
## Product-selection methods
Within each structure, you choose how the product (or products) is selected. The available methods depend on whether the offer is Single or Multi Product.
| Method | Available in | What it does |
| -------------------------------------------- | -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Specific product(s)** | Single & Multi | Hand-pick the exact product(s) to show. Use this to promote a hero product, bestseller, or item you want to move. |
| **Collection** | Multi only | Pick a Shopify collection; Aftersell shows products from it. Items already in the order are excluded automatically. |
| **Automatic upsell (AI)** | Single & Multi | Uses Shopify's Recommendation API to suggest complementary products based on the customer's order. |
| **Most Expensive / Least Expensive in Cart** | Single only | Re-offers the highest- or lowest-priced item from the customer's original order at a discount. See [below](#most-expensive-and-least-expensive-in-cart). |
| **Strategy** | Single & Multi | Attaches a [Strategy](/aftersell/implementing_strategies_post_purchase_upsells) to the offer for dynamic, rule-based merchandising evaluated each time the offer is shown. |
***
## Most Expensive and Least Expensive in Cart
The **Most Expensive in Cart** and **Least Expensive in Cart** methods automatically identify either the highest- or lowest-priced item in your customer's order and offer it again at a discount, right after checkout. They are a quick way to boost average order value without manually selecting products for each offer.
### How it works
When a customer completes a purchase, Aftersell scans their order and surfaces either the most or least expensive product as a post-purchase upsell at the discount you configure.
**Most Expensive in Cart**
* If the order contains one product, that product is the upsell.
* If the order contains multiple products, only the most expensive one is targeted.
**Least Expensive in Cart**
* If the order contains one product, that product is the upsell.
* If the order contains multiple products, only the least expensive one is targeted.
To further enhance this functionality, Aftersell leverages Shopify's Recommendation API, enabling more accurate, personalized suggestions based on factors such as customer behavior and product affinity.
Both options work best for stores where customers are likely to want a second unit of a product, such as consumables, gifts, or everyday essentials. They are less suited to categories like clothing, where repeat purchases of the same item are uncommon. For those stores, AI-driven upsells that suggest complementary products tend to perform better.
### How to set it up
1. In Aftersell, create a new upsell offer.
2. Choose **Single Product** and select either **Most Expensive in Cart** or **Least Expensive in Cart**.
3. Set your desired discount percentage.
4. Save and place a test order to confirm the offer is displaying correctly.
The Most Expensive in Cart and Least Expensive in Cart options only appear if your offer is set to target a single product. If you do not see them, check that multiple product targeting is not enabled.
### Running an A/B test
You can compare either option (Variant A) against AI-recommended products (Variant B). Variant A shows the most or least expensive item at your configured discount. Variant B shows up to four AI-recommended products. Traffic is split 50/50 between the two. See [Post-Purchase A/B Testing](/aftersell/post_purchase_a_b_testing) for details.
### Best practices
**Start simple.** Get the basic offer running and tested before adding downsells or additional steps to the flow. Too many offers in a row can reduce conversions.
Most Expensive in Cart drives higher revenue per upsell. Least Expensive in Cart is a lower-friction option that is easier for customers to say yes to.
**Match the method to your catalog.** If your customers are unlikely to buy the same item twice, consider switching to AI-driven recommendations instead.
**Use A/B testing to decide.** If you are unsure which approach suits your store, run a split test and let performance data guide your decision.
### Troubleshooting
This error means Aftersell cannot find a valid product to upsell, usually because too many products or collections are excluded.
To fix it:
1. Open your funnel and go to the exclusions section for the upsell offer.
2. Remove any unnecessary exclusions that may be blocking eligible products.
3. Save and place a test order to check if the offer now appears.
This option only appears when the offer is set to target a single product. If you have multiple product targeting enabled, the option will be unavailable. Switch to single-product targeting to unlock it.
This is not supported with either option. If you need to hide already-purchased items from the upsell offer, use a multi-product upsell instead and configure it to skip or hide specific products.
### Limitations
* Both options only work with single-product offer configurations.
* Aftersell cannot dynamically select the most or least expensive item when multiple product targeting is enabled.
* It is not possible to hide the originally purchased product from the upsell.
* For more flexibility, consider multi-product upsells or AI-driven recommendations.
***
## Related offer modes
These features extend or change how an offer behaves and have dedicated guides:
* **[Subscription offers](/aftersell/subscriptions_in_post_purchase_offers)** — Offer a subscription-enabled product as one-time only, subscription only, or both.
* **[Replacement Upsells](/aftersell/replacement_upsells)** — Swap a one-time product in the order for a different product or a subscription version.
* **[Subscription Upgrades](/aftersell/subscription-upgrades)** (Beta) — Modify a subscription the customer already purchased in this order.
***
**Want to go further?**
* [How to configure post-purchase triggers](/aftersell/how_to_configure_post_purchase_triggers) — control when each offer shows.
* [Configuring post-purchase offer settings](/aftersell/configuring_post_purchase_offer_settings) — discounts, tags, and product options.
* [Post-purchase best practices](/aftersell/best_practices) — tips to improve conversion across all your offers.
# Post-purchase A/B testing
Source: https://docs.aftersell.com/aftersell/post_purchase_a_b_testing
Learn how to set up, manage, and analyze A/B tests for your post-purchase offers in Aftersell
# Post-purchase A/B testing
A/B testing (also known as split testing) allows you to compare up to five versions of a post-purchase offer within a single funnel to determine which performs better. Each version is called a **layout** (Layout A, Layout B, Layout C, Layout D, Layout E). Traffic is automatically split evenly across all active layouts, and performance is tracked separately so you can identify the higher-performing version.
By testing variations of your offers, you can improve conversion rates, increase revenue, and make data-driven decisions about your upsell strategy.
A/B testing lets you manually configure each layout as a complete offer and test them against each other. If you want to define individual variables (like discount type, timer duration, product type) and have Aftersell combine them into all possible layout combinations for testing, use [Multivariate Testing](/aftersell/multivariate_testing) instead.
A/B testing is only available for post-purchase upsells. A/B testing for Thank You page offers is not currently available. For checkout widget A/B testing, see [Checkout A/B Testing](/aftersell/checkout_a_b_testing).
***
## What you can test
You can test nearly any element of your post-purchase offer, including:
* **Products:** Different products, single product vs. multi-product offers, or AI recommendations vs. specific products
* **Discounts:** Different discount amounts or types (percentage vs. fixed dollar)
* **Copy:** Headlines, descriptions, and call-to-action text
* **Images:** Product images or lifestyle photos
* **Urgency elements:** Countdown timers with different durations
* **Quantities:** Default quantity of 1 vs. 2 (or more)
* **Offer design:** Different layouts or visual styles
For best results, test one element at a time so you can clearly identify what drives performance changes. If you want to define multiple variables and have Aftersell combine them into layout combinations for testing, use [Multivariate Testing](/aftersell/multivariate_testing) instead.
***
## How to set up an A/B test
### Step 1: Create or open a funnel
1. Open the **Aftersell app** from your Shopify Admin
2. Navigate to **Post-purchase Funnels** in the left sidebar
3. Either create a new funnel or open an existing funnel you want to test
### Step 2: Create your test
1. In your funnel, click **Create Test**
2. Select **A/B Test** from the options
### Step 3: Set up your layouts
Configure each layout as a complete offer. You can create up to 5 layouts (Layout A through Layout E).
For each layout, you can customize:
* Product selection
* Discount amount and type
* Offer copy and messaging
* Images and visual elements
* Countdown timer settings
* Default quantity
* Any other offer settings
### Step 4: Start the test
1. Review all layouts to ensure they're configured correctly
2. Click **Start Test** to begin splitting traffic across layouts
3. Ensure your funnel is **enabled** and **published**
Your A/B test is now live.
### How traffic is split
Traffic is automatically distributed evenly across all layouts in the test. There is no way to manually adjust the traffic percentage for each layout. For example:
* If you have **2 layouts**, traffic will split **50% / 50%**
* If you have **3 layouts**, traffic will split approximately **33% / 33% / 33%**
* If you have **4 layouts**, traffic will split **25% each**
* If you have **5 layouts**, traffic will split **20% each**
All layouts within the same test receive equal traffic distribution. There is no option to set custom percentages (for example, you cannot set Layout A to 80% and Layout B to 20%).
***
## Managing your test
Once your A/B test is live, its status will show as **In progress**. From here, you can pause, edit, reset, delete, or select a winner.
### Test statuses
* **Not started**: The test has been created but is not active. Traffic is not being split. If you see 100% of traffic going to one layout, click **Start test**.
* **In progress**: Traffic is being split evenly across all layouts.
* **Paused**: Traffic splitting has stopped.
* **Finished**: The test has completed. Results are available in the Analytics > Tests tab.
* **Not Running**: The test has been created and configured but is not currently active. This may appear if the test was paused or stopped.
Hover over the status badge to see a date tooltip. The tooltip shows:
* **Started \[date]** — for tests that are in progress, paused, or finished
* **Last reset \[date]** — for tests that are not started but have had their analytics reset
* **Created \[date]** — for tests that have not yet been started and have never been reset
### Pause the test
Click **Pause** to temporarily stop traffic splitting. When a test is paused:
* Traffic is no longer split between layouts
* Only the first layout created, Layout A, will be shown
* You cannot choose which layout displays while paused
To permanently display a different layout, you must select a winner or delete the test. When you unpause the test, traffic splitting resumes evenly.
### Edit the test
Use the three-dot menu to select **Edit test** if you need to adjust products, pricing, layout, or messaging. For accurate results, avoid making major changes while a test is running.
### Reset analytics
Select **Reset analytics** to clear current test data and restart tracking from zero. This resets only the A/B test data. Historical lifetime offer data is not deleted.
### Delete the test
Select **Delete test** to permanently remove the A/B test. If deleted:
* Traffic will no longer be split
* The offer returns to normal behavior
* Lifetime offer analytics become visible again
### Select a winner
When you are ready to end the test:
1. Click **Select winner**
2. Choose the layout to keep
3. Confirm
This ends the test and applies the selected layout as the active offer. All customers will see the chosen layout moving forward.
***
## How A/B test analytics work
Once your test is running, you can track performance in the **Analytics** section of your Aftersell dashboard under the **Tests** tab.
For a complete breakdown of all Tests tab metrics, including group-level analytics, Performance by Variable, the All Groups table, and how to select a test, see [Post-purchase Analytics](/aftersell/analytics_in_aftersell).
***
## Limitations
### A/B testing is within a single funnel only
A/B testing compares layouts within the same funnel. You cannot A/B test one funnel against another funnel.
### A/B testing is for post-purchase upsells only
A/B testing is not currently available for Thank You page offers. It is only supported for post-purchase upsell funnels.
### Custom traffic percentages are not supported
Traffic is always split evenly across all active layouts. There is no option to assign custom percentages to individual layouts.
***
## Best practices for A/B testing
### Run tests long enough
* **Minimum duration:** 2-4 weeks
* **Minimum impressions:** At least 100-200 impressions per layout (more is better)
* Shorter tests may not produce statistically reliable results, especially with low traffic.
The analytics dashboard will show you the impressions needed to be statistically viable, helping you know when the data is ready to act on.
### Test one element at a time
When you change multiple elements simultaneously, you won't know which change drove the results. Test one variable at a time for clear insights:
**Good**: Test 10% discount vs. 20% discount (one variable)
**Avoid**: Test 10% discount + Product A vs. 20% discount + Product B (two variables)
### Look for consistent performance
Don't make decisions based on a single metric. A winning layout should perform well across multiple metrics:
* Higher conversion rate
* Higher revenue per visit
* Comparable or better average upsell value
### Consider statistical significance
Before declaring a winner, ensure your results are statistically significant. Look for:
* Clear performance differences (not just 1-2% variations)
* Consistent trends over time
* Sufficient sample size (impressions)
### Apply the winning layout
Once you've identified a clear winner:
1. Stop the test
2. Apply the winning layout to your funnel
3. Monitor performance to ensure results remain consistent
4. Consider running a new test to further optimize
***
## A/B test vs. Multivariate test
Not sure which testing method to use?
| | **A/B Test** | **Multivariate Test** |
| ------------------------ | --------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| How it works | You manually configure each layout as a complete offer and test them against each other | You define individual variables and their options, and Aftersell combines them into all possible layout combinations for testing |
| Layouts | Up to 5 layouts (Layout A through E), each manually configured | Automatically generated based on variable combinations (Layout A, B, C, etc.) |
| Best for | Comparing complete offer designs against each other | Finding the best combination of individual variables (discount, timer, product, etc.) |
| Traffic split | Evenly across all layouts | Evenly across all combinations |
| Statistical significance | Faster to reach with fewer layouts | Requires more traffic due to more combinations |
| Results | Easier to interpret - one layout wins | More complex - identifies best combination of variables |
**Use A/B testing when:**
* You want to compare complete offer configurations
* You have moderate traffic levels
* You want clear, straightforward results
[**Use Multivariate Testing when:**](/aftersell/multivariate_testing)
* You want to test multiple variables simultaneously and find the best combination
* You have high traffic levels
* You want to define variables and have Aftersell combine them into layout combinations for testing
***
## Common A/B test ideas
Need inspiration? Here are proven A/B tests to try:
### Product-based tests
* **Same product vs. complementary product:** Test whether customers prefer to buy more of what they just purchased or try something new
* **Single product vs. multi-product offer:** Compare a single item offer against a multi-product offer with complementary products
* **AI-powered vs. static product:** Test dynamic AI recommendations against manually selected products
### Discount tests
* **Discount amount:** Test 10% off vs. 20% off vs. 30% off
* **Discount type:** Compare percentage discounts (20% off) vs. fixed dollar amounts (\$5 off)
* **No discount vs. discount:** Test whether a discount is necessary for your audience
### Quantity tests
* **Default quantity:** Test quantity of 1 vs. quantity of 2 (especially effective for consumables)
### Copy and messaging tests
* **Headline variations:** Test different value propositions or messaging angles
* **Urgency messaging:** Test with vs. without urgency language
* **CTA button text:** Test different call-to-action phrases
### Design tests
* **Long-form vs. short-form:** Test detailed product descriptions against concise offers
* **Image variations:** Test different product images or lifestyle photos
* **Timer duration:** Test 5-minute vs. 10-minute vs. 15-minute countdown timers
For more detailed strategies and examples, check out our [Best Practices](/aftersell/best_practices) guide.
***
## Need help?
If you have questions about setting up or analyzing your A/B tests, chat with our support team using the live chat at the bottom right of the app.
# Post-purchase branding settings
Source: https://docs.aftersell.com/aftersell/post_purchase_branding_settings
How to edit Aftersell branding, colors, buttons
Your post-purchase branding in Aftersell automatically matches your Shopify checkout branding. As a result, there are no options within Aftersell to customize colors, fonts, or other elements. However, you can make these changes in the Shopify checkout editor. To access the Shopify checkout editor, follow the steps shown in the gif below:
***
Many of the fields in the Shopify checkout editor are linked to Aftersell's post-purchase page. The image below shows this mapping, with numbered elements in the Shopify checkout settings corresponding to the same elements on the post-purchase upsell page.
* For instance, the button color in the Shopify checkout is directly reflected in the button color on the post-purchase page:
***
Please note that Aftersell's editor preview may occasionally display a visual bug, but your branding should match the Shopify checkout settings on a live offer. If necessary, we recommend placing a test order to verify this.
# Post-purchase overview
Source: https://docs.aftersell.com/aftersell/post_purchase_overview
This guide explains what post-purchase offers are, how they work, and how to start using them with Aftersell.
# Overview
Aftersell's Post-purchase offers help increase your average order value (AOV) by presenting relevant upsell offers after the initial purchase. These offers are shown either immediately after checkout or on the Thank You page, allowing customers to buy more.
***
## What is a post-purchase offer?
A post-purchase offer is an additional product offer shown after a customer completes their initial checkout. Offers can appear in two places:
* Right after checkout, before the order confirmation. (Post-purchase upsells)
* After the order is confirmed, as part of the order status page. (Thank you page upsells)
In both cases, offers are designed to be quick and easy to accept and this helps you generate more revenue without interrupting the customer's checkout experience.
***
## How the post-purchase page works
The post-purchase page is a Shopify-hosted page shown between checkout and the order confirmation. This is where Aftersell can display Post-purchase upsells, based on what the customer just purchased.
## Funnel flow:
1. Customer completes checkout.
2. Aftersell shows the first upsell offer.
3. Customer accepts or declines.
* If accepted, the product is added to the original order. and you can set more "if accepted" follow ups.
* If declined, a downsell offer can be shown.
4. Customer is taken to the Thank you page.
***
## How the thank you page works
The Thank You page is the final page of the checkout experience where customers view their order summary and tracking info. With Aftersell, you can turn this page into another opportunity to increase sales by adding:
* Product recommendations
* FAQs
* Text
* Image
* Custom Code
Thank You Page upsells can be configured in one of two ways:
* **Merge with the original order** - the upsell is combined with the initial purchase into a single order.
* **Create as a separate order** - the upsell generates a second order that is distinct from the original. When configured as a separate order, if the customer abandons the second checkout, the upsell order remains in **Draft** status.
***
## Key benefits
* **Boost average order value.** Post-purchase and Thank You Page offers help customers add more to their purchase.
* **Acceptance on the post-purchase page.** No extra steps or friction.
* **Completely native to Shopify.** Offers match your brand and are hosted by Shopify.
* **Highly targeted.** Use conditions to control when and what offers show.
* **Visual aid features.** Implement the 'Show progress bar on funnel' to guide customers through multi-step funnels.
***
## How to create a post-purchase funnel
When you open **Post-purchase Funnels** for the first time (or when you have no funnels), you'll see a template gallery to help you get started quickly.
### Starting from a template
The template gallery shows ready-made funnel options to help you get started quickly:
* **Classic upsell** — A 4-step funnel: Upsell 1 (most expensive product), Upsell 2 (4 AI-recommended products), Downsell 1 (most expensive product), and Downsell 2 (AI-recommended product).
* **Bestseller bundle** — A 4-step funnel: Upsell 1 (4 AI-recommended products), Upsell 2 (most expensive product), Downsell 1 (most expensive product), and Downsell 2 (most expensive product).
* **Subscription Upgrades** — Builds a funnel that offers existing subscribers a post-purchase change to their active subscription. This template appears only when the Subscription Upgrades Beta feature is enabled on your account, and it opens its own setup wizard rather than the confirmation modal below. See [Subscription Upgrades](/aftersell/subscription-upgrades).
#### Confirmation modal for Classic upsell and Bestseller bundle
When you click **Use this template** on the Classic upsell or Bestseller bundle, a confirmation modal opens before the funnel is created. The modal lets you:
* **Preview the offer flow** — See each step in the funnel with the product type and discount that will be applied.
* **Set a max discount** — Enter a whole number from 0 to 100. Upsell 1 receives half this amount (rounded up); the remaining steps receive the full amount. The default is 30%.
* **Choose the funnel's starting status** — Toggle the funnel active or inactive before saving. An active funnel starts showing to customers immediately after creation.
Click **Save** to create the funnel, or **Cancel** to exit without creating anything. After the funnel is created, you land directly in the funnel editor to customize triggers, offers, and design.
### Bulk actions on funnels
You can perform bulk actions on multiple funnels at once from the **Post-purchase Funnels** list using the **More actions** button (the kebab menu icon) in the filter bar.
#### Enabling or disabling multiple funnels at once
1. Select the checkboxes next to the funnels you want to update. Use the header checkbox to select all funnels on the current page.
2. Click the **More actions** button (the kebab menu icon) in the filter bar.
3. Select **Enable funnel** / **Enable N funnels** or **Disable funnel** / **Disable N funnels**. The option is greyed out if all selected funnels are already in that state, or if nothing is selected.
Only funnels that need to change are updated — funnels already in the target state are skipped. Your selection is preserved after the operation, so you can chain enable and disable actions without re-selecting.
#### Deleting multiple funnels at once
1. Select the checkboxes next to the funnels you want to delete. Use the header checkbox to select all funnels on the current page.
2. Click the **More actions** button (the kebab menu icon) in the filter bar.
3. Select **Delete funnel** (singular) or **Delete N funnels** (plural, showing the count of selected funnels). The option is disabled until at least one funnel is selected.
4. Confirm the deletion in the modal that appears.
Deleting a funnel removes it and all its associated widgets, split tests, and Thank You Page widgets. This action cannot be undone. Historical analytics data for deleted funnels is preserved — see [Analytics in Aftersell](/aftersell/analytics_in_aftersell) for details.
***
### Adding more funnels
Once you have at least one funnel, use the **Add funnel** button to create additional funnels. The button opens a dropdown where you can:
* Pick a template to start from (same options as the gallery). Selecting Classic upsell or Bestseller bundle opens the confirmation modal described above.
* Select **Create manually** to build a funnel from scratch with no presets.
### Manual setup steps
1. Go to **Post-purchase Funnels** in the Aftersell admin.
2. Click **Add funnel** and choose **Create manually**, or select a template.
3. Set [trigger conditions](/aftersell/post_purchase_triggers) to control when the funnel shows.
4. Add upsell offers.
5. Customize the offer design and messaging.
6. Enable the funnel and publish it.
You can create multiple funnels and prioritize them to control which one runs when multiple conditions match. You can also track the triggers for post-purchase upsells using Aftersell's Order Browser, which displays a "shown" status to confirm successful activation of the funnel.
***
## Summary
Post-purchase and Thank You Page offers give you two powerful ways to drive more revenue after the sale is complete. With Aftersell, you can easily create personalized upsells that feel native to your store and are proven to convert.
Need help getting started? Visit our [Post-purchase Help Center](/aftersell/best_practices) or our [Thank You Page guides](/aftersell/how_can_i_set_up_and_customize_thank_you_page_upsells_in_aftersell), or contact our support team.
# Post-purchase strategies by industry
Source: https://docs.aftersell.com/aftersell/post_purchase_strategies_by_industry
Upsell playbooks tailored to your industry with product selection, discount ranges, funnel triggers, and testing priorities to help you get the most out of your post-purchase funnels
# Post-purchase strategies by industry
Different product categories have different upsell dynamics. Use these playbooks as a starting point for your vertical, then A/B test to refine. For universal best practices that apply to all industries, see [Post-purchase Best Practices](/aftersell/best_practices).
Want real-world examples from top brands? [Download our Upsell Playbook](https://www.aftersell.com/upsell-playbook) for proven strategies and case studies you can apply to your store today.
The discount ranges listed below are starting points for testing, not guarantees. Your optimal discount depends on your margins, product pricing, and customer behavior. Always A/B test to find what works for your store.
***
## Fashion and apparel
Fashion stores convert best on complementary accessories. A customer who just bought a dress is far more likely to accept earrings, a clutch, or a scarf than another dress.
* **Upsell #1:** Complementary accessory (jewelry, bags, scarves, belts, shoes)
* **Upsell #2 (accept path):** A second complementary item from the same collection
* **Downsell (decline path):** Lower-price accessory from the same collection
* **Discount range:** 10-20% off
* **Funnel triggers:** Use [collection-based triggers](/aftersell/how_to_configure_post_purchase_triggers) so the upsell adapts to what the customer is buying
* **Thank You Page:** "Complete the Look" product recommendations using automatic upsells
* **Testing priority:** Single product vs. multi-product offers, AI vs. manual product selection
For fashion stores, avoid upselling the same item the customer just purchased. A diversified approach that shows complementary products increases resonance with buyers.
***
## Supplements and health
Supplements are ideal for quantity-based upsells because customers use them regularly and replenishment is expected.
* **Upsell #1:** Same product at quantity 2 or 3, or a complementary supplement (for example, vitamin D with a multivitamin)
* **Upsell #2 (accept path):** A related supplement that pairs with the first (for example, fish oil after accepting a multivitamin)
* **Downsell (decline path):** Single unit of a related product at a smaller size or lower price point
* **Discount range:** 15-30% off (higher discounts work well here because margins are typically strong)
* **Funnel triggers:** Product-specific triggers for your top sellers
* **Testing priority:** Default quantity 1 vs. 2, percentage vs. fixed dollar discount
* **Subscriptions:** Supplements are one of the strongest use cases for subscription upsells. For example, a customer who makes a one-time purchase of a probiotic could be offered "Love your probiotics? Subscribe and save 20% with automatic monthly delivery." You can offer "Subscription only," or give the customer the choice between one-time and subscription with subscription preselected as the default. You can also use a [replacement upsell](/aftersell/replacement_upsells) to swap the one-time purchase for a subscription version of the same product after checkout. Note: replacement upsells are currently a beta feature. Contact support to enable this for your account. Place your subscription offer as Upsell #1 since Shopify only allows one subscription offer per funnel. See [Subscriptions in Post-purchase Offers](/aftersell/subscriptions_in_post_purchase_offers) for setup details.
***
## Food and beverage
Similar to supplements, food and beverage products lend themselves to quantity upsells and variety offers.
* **Upsell #1:** Same product at a higher quantity, or a different flavor or variety
* **Upsell #2 (accept path):** A complementary product (for example, a sauce after accepting pasta, a snack after accepting a beverage)
* **Downsell (decline path):** Sampler or trial size of a related product
* **Discount range:** 15-30% off
* **Funnel triggers:** Product or collection-based
* **Testing priority:** Same product replenishment vs. variety cross-sell
* **Subscriptions:** Recurring food and beverage purchases are a natural fit for subscription upsells. For example, a customer who places a one-time order for a bag of coffee could be offered "Never run out: subscribe and save 15% with monthly delivery." A customer who buys a variety pack of protein bars could see "Get a fresh box every 4 weeks." Offer the choice between one-time and subscription with subscription preselected, or use a [replacement upsell](/aftersell/replacement_upsells) to swap the one-time purchase for a subscription version. Note: replacement upsells are currently a beta feature. Contact support to enable this for your account. Place your subscription offer as Upsell #1 in the funnel. See [Subscriptions in Post-purchase Offers](/aftersell/subscriptions_in_post_purchase_offers) for setup details.
***
## Beauty and skincare
Beauty customers respond well to routine-building upsells. Products that pair naturally with what they just bought tend to convert well.
* **Upsell #1:** Next step in the skincare routine (for example, serum after moisturizer, SPF after cleanser)
* **Upsell #2 (accept path):** Another routine step or a tool/applicator that goes with the products
* **Downsell (decline path):** Travel size or sample of the original upsell product
* **Discount range:** 10-20% off
* **Funnel triggers:** Collection-based, or product-specific for hero SKUs
* **Thank You Page:** "Build Your Routine" product recommendations using automatic upsells
* **Testing priority:** AI recommendations vs. curated routine sets
* **Subscriptions:** Skincare routines are naturally recurring, making beauty products a strong fit for subscription upsells. For example, a customer who makes a one-time purchase of a daily moisturizer could be offered "Subscribe for 15% off and get a fresh jar delivered every 60 days." A customer who buys a retinol serum as a one-time order could see "Start your routine: subscribe and save on monthly refills." Offer subscription as the default option or use a [replacement upsell](/aftersell/replacement_upsells) to swap the one-time purchase for a subscription. Note: replacement upsells are currently a beta feature. Contact support to enable this for your account. Place your subscription offer as Upsell #1 in the funnel. See [Subscriptions in Post-purchase Offers](/aftersell/subscriptions_in_post_purchase_offers) for setup details.
***
## Electronics and accessories
Electronics upsells work best with protective accessories and add-ons that enhance the primary purchase.
* **Upsell #1:** Primary accessory (case, screen protector, charger)
* **Upsell #2 (accept path):** Secondary accessory (cable, stand, cleaning kit)
* **Downsell (decline path):** Lower-tier version of the primary accessory (for example, basic case instead of premium case)
* **Discount range:** 5-15% off (customers expect smaller discounts on tech accessories)
* **Funnel triggers:** Product-specific triggers matching accessories to each device
* **Testing priority:** Accessory type (protection vs. enhancement), single vs. multi-product
***
## Home goods
Home goods customers often buy in projects or collections. They are furnishing a room, not buying a single item.
* **Upsell #1:** Complementary item from the same collection or room category
* **Upsell #2 (accept path):** Another piece from the same collection or a functional add-on
* **Downsell (decline path):** Smaller accent piece (candle, throw pillow, organizer)
* **Discount range:** 10-20% off
* **Funnel triggers:** Collection-based triggers
* **Testing priority:** Same-collection cross-sell vs. AI recommendations
***
## Car parts and automotive
Car parts customers are often completing a specific repair or upgrade project and are open to related components.
* **Upsell #1:** Related part for the same repair (for example, brake pads with rotors, oil filter with oil)
* **Upsell #2 (accept path):** Another related component for the same project (for example, brake fluid after accepting pads and rotors)
* **Downsell (decline path):** Maintenance consumable (cleaning supplies, fluids, small hardware)
* **Discount range:** 5-15% off
* **Funnel triggers:** Product or collection-based, matching related parts to each primary product
* **Testing priority:** Related repair part vs. maintenance consumable
***
## Don't see your industry?
These playbooks cover the most common verticals, but the core principles apply to any product category:
1. **Lead with a complementary product** that feels like a natural extension of what the customer bought
2. **Always configure a downsell** on the decline path with a lower commitment offer
3. **Include Thank You Page upsells** in every funnel so no order goes without an opportunity
4. **A/B test** AI recommendations vs. manual product selection to see which performs better for your catalog
5. **Start with a discount** and test to find the minimum level that maintains your conversion rate
For more detail on each of these principles, see [Post-purchase Best Practices](/aftersell/best_practices).
***
## Need help?
If you have questions about building upsell funnels for your specific industry, chat with our support team using the live chat at the bottom right of the app.
# Post-purchase triggers
Source: https://docs.aftersell.com/aftersell/post_purchase_triggers
This article explains how post-purchase triggers function.
Triggers can be utilized to display a funnel in particular situations, and they can be combined to effectively highlight funnels for specific scenarios.
***
Show for all customers trigger
[Product-Based Triggers](#product-based-triggers)
* [Product/Collection Trigger](#product-collection)
* [Product Quantity Trigger](#product-quantity)
* [Product Tag Trigger](#product-tag)
* [Product Type Trigger](#product-type)
* [Metafields](#metafields)
* [Product/Collection Exclusion Trigger](#product-collection-exclusion)
* [Subscription Trigger](#subscription)
* [Variant on Subscription Trigger](#variant-on-subscription)
* [Variant Name Trigger](#variant-name)
[Cart & Discount Triggers](#cart-%26-discount-triggers)
* [Order Value Trigger](#order-value)
* [Quantity Trigger](#quantity)
* [Discount Code Trigger](#discount-code)
* [Discount Percent (%) Trigger](#discount-percent-%28%25%29)
[Customer Attribute Triggers](#customer-attribute-triggers)
* [Customer Tag Trigger](#customer-tag)
* [Customer Order History Trigger](#customer-order-history)
* [Customer Order Count Trigger](#customer-order-count)
* [Customer Language Trigger](#customer-language)
* [Once per Customer Trigger](#once-per-customer)
[Order Details & Time-Based Triggers](#order-details-%26-time-based-triggers)
* [UTM Parameter Trigger](#utm-parameter)
* [Currency Trigger](#currency)
* [Device Type Trigger](#device-type)
* [Shipping Country Trigger](#shipping-country)
* [Random Sample Trigger](#random-sample)
* [Date/Time Trigger](#date-time)
* [Shipping Method Trigger](#shipping-method)
***
# Show for All Customers Trigger
A "**Catch-All" funnel** uses the "Show for All Customers" trigger.
This funnel activates when an order does not meet the criteria for any other funnel.
It serves as a **safety net**, ensuring no orders slip through without an upsell or thank-you page offer. To use it effectively, set this funnel to the **lowest priority** so it only appears if no other funnel triggers.
Here are some examples:
* You have three funnels: one for orders over \$100, one for specific products, and one with the Show for All Customers trigger. If a customer places an order that doesn't meet the first two funnels' criteria, the Show for All Customers funnel will activate as a fallback.
* You want to ensure every customer sees at least one offer. Create a funnel with the Show for All Customers trigger and set it to the lowest priority. This funnel will catch any orders that don't match your other targeted funnels.
***
# Product-Based Triggers
\*These triggers activate based on the products, collections, or variants in a customer's cart.\*Additionally, ensure proper configuration to prevent hidden or wholesale-only products from appearing unexpectedly in recommendations. This includes reviewing Shopify's Product Recommendation logic and restricting such products at the add-to-cart stage, mitigating unintended visibility issues.
## **Product/Collection**
The Product/Collection Trigger displays the funnel when a customer purchases a specific product or a product from a particular collection.
Here are some examples:
* You have a funnel with a Product/Collection Trigger set to products X, Y, and Z. If a customer buys products A, B, and Y, this funnel will activate, showing the upsells within that funnel to the customer.
* You have a funnel with a Product/Collection Trigger set to products X, Y, and Z. If a customer buys products A, B, and C, this funnel will not activate since none of the specified products (X, Y, or Z) were purchased.
## **Product Quantity**
The Product Quantity Trigger displays the offer based on how many of a specific product are included in the cart. Unlike the Product/Collection Trigger (which checks whether a product is present at any quantity), the Product Quantity Trigger lets you set a quantity threshold for a specific product.
**To configure a Product Quantity trigger:**
1. Check the **Product quantity** box in your trigger settings.
2. In the condition row, choose an operator from the dropdown: **More than**, **Less than**, or **Exactly**.
3. Enter the quantity threshold in the number field.
4. Use the product selector to choose which product the condition applies to.
5. Click **Save**.
**Example use cases:**
* Set to "more than" 2 of Product A (the upsell only appears when a customer has 3 or more of Product A in their cart).
* Set to "exactly" 1 of Product A (the upsell fires only for single-unit orders of that product).
* Set to "less than" 3 of Product A (the upsell appears when there are 1 or 2 of that product in the order).
**Using multiple condition rows:**
You can add multiple rows to target different products or quantity ranges within the same trigger. Each row specifies its own operator, threshold, and product. Use the **Condition Logic** toggle in the top right corner to connect rows with AND or OR logic.
For example:
* Row 1: "more than" 1 of Product A **AND** Row 2: "exactly" 1 of Product B (the upsell only appears when both conditions are met simultaneously).
* Row 1: "exactly" 2 of Product A **OR** Row 2: "more than" 3 of Product B (the upsell appears when either condition is met).
## **Product Tag**
The Product Tag Trigger displays the offer when products with certain Shopify tags are included in the order.
Here are some examples:
* You want to exclude discontinued products from receiving upsell offers. Set the Product Tag Trigger to exclude products tagged "**discontinued**." If a customer purchases a product with this tag, the funnel will not activate.
* You want to show a special offer only for products tagged "**summer-collection**." Set the Product Tag Trigger to include products with this tag. If a customer purchases any product tagged "**summer-collection**," the funnel will activate.
## **Product Type**
The Product Type Trigger displays the offer when the products belong to a defined Shopify product type.
* For example\*\*, i\*\*f you set the Product Type Trigger to "Shoes," then any time a customer purchases a product that belongs to the *Shoes* product type, the funnel will display. For instance, if the customer adds a pair of running sneakers (type: Shoes) to their cart, the funnel will activate. However, if the customer adds a t-shirt (type: Apparel), the funnel will not display because the product type does not match the trigger.
## Metafields
The Metafields Trigger displays funnels based on custom metafield data associated with products or variants. You can choose between product metafields or variant metafields, but only one type can be matched at a time.
You can select to either Include or Exclude, then enter the metafield name and value. Both the name & the value are case sensitive so you must enter it exactly how they appear on the product page or else it won't trigger properly.
Include means there's an overlap between the metafields in the order and those in the trigger list.
* For example, if the order metafields are `["color: red", "size: m"]` and the trigger list is `["color: red", "ship: warehouse"]`, the condition is satisfied because `color: red` matches.
Exclude means there's no overlap between the metafields in the order and the trigger list.
* For example, if the order metafields are `["color: red", "size: M"]` and the trigger list is `["color: blue", "size: L"]`, the condition satisfied because there are no matching name:value pairs.
This trigger is especially useful if you are using metafields to store detailed product information (like materials, sizing, or special attributes) and want to target funnels based on that data.
## **Product/Collection Exclusion**
The Product/Collection Exclusion Trigger prevents the funnel from displaying when excluded products or collections are present in the cart.
* For example, if a customer has purchased from a heavily discounted product or collection, you may prefer not to show further offers to that customer. This trigger allows you to skip all offers if those specific products or collections are in the customer's cart.
* Additionally, you can combine this trigger with the Product/Collection Trigger to ensure that only selected products or collections activate the funnel, while any others are excluded.
## **Subscription**
The Subscription Trigger displays the offer based on whether a subscription product is included in the order.
Here are some examples:
* You have a funnel with a Subscription Trigger set to "**Does not contain**" subscription products. If a customer purchases only one-time products, the funnel will activate, allowing you to offer them a subscription upsell.
* You have a funnel with a Subscription Trigger set to "**Contains**" subscription products. If a customer purchases a subscription product, the funnel will activate, allowing you to show them complementary one-time products.
**Note:** Shopify only supports one subscription product per order. This means you cannot upsell a subscription if the original order already includes a subscription.
## **Variant on subscription**
The Variant on Subscription trigger displays the funnel when the order includes any of the selected products purchased as a subscription. Unlike the Subscription trigger (which checks whether any subscription is present), this trigger matches on a specific product being purchased on a subscription line item — so a one-time purchase of the same product does not activate the funnel.
This trigger is used automatically by the subscription upgrade wizard. When a funnel has a subscription upgrade offer configured, the trigger is managed by the wizard and kept in sync with the upgrade's source product. The trigger is read-only while the upgrade offer is present; it unlocks if the upgrade offer is removed.
On funnels without a subscription upgrade offer, you can configure the trigger manually. The product picker is filtered to subscription products only.
Here are some examples:
* You have a subscription upgrade funnel targeting customers who subscribe to Product A. The Variant on Subscription trigger is set to Product A. If a customer purchases Product A as a subscription, the funnel activates. If they purchase Product A as a one-time item, the funnel does not activate.
* You have multiple subscription upgrade offers in the same funnel. The trigger is set to the union of all upgrade source products, so the funnel activates when any of those products is purchased as a subscription.
## **Variant Name**
The Variant Name Trigger allows you to display specific funnels based on the product variant selected by the customer at checkout. By using this trigger, you can include or exclude customers from certain offers depending on the exact variant they choose, such as size, color, or style.
Here are some examples:
* You have a funnel with a Variant Name Trigger set to include "**Large**." If a customer purchases a t-shirt in size Large, the funnel will activate. If they purchase size Small or Medium, the funnel will not activate.
* You have a funnel with a Variant Name Trigger set to include "**Red**" and "**Blue**." If a customer purchases a product in either Red or Blue color variant, the funnel will activate. If they purchase Green, the funnel will not activate.
***
# Cart & Discount Triggers
*These triggers activate based on the cart value, contents, or discounts applied.*
## **Order Value**
The Order Value Trigger is used to display an offer if an order meets a specified dollar value requirement, which can be set as greater than or less than a chosen amount. When an order meets your set criteria, the offer will be shown to the customer.
Here are some **examples**:
1. Your funnel has an Order Value Trigger set to activate when orders total less than \$50.00. If a customer places an order totalling \$30.00 with various products, the offer will display, as the order meets the "less than \$50.00" requirement.
2. Your funnel has an Order Value Trigger set to activate when orders total less than \$50.00. If a customer places an order totalling \$60.00 with various products, the offer will not display since the order value does not meet the "less than \$50.00" requirement.
In both examples, the specific products in the order are irrelevant; the trigger is based solely on order value.
## **Quantity**
The Quantity Trigger shows an upsell offer based on the total item count in a customer's order. It looks at the overall number of items across all products in the cart, regardless of which specific products they are.
**To configure a Quantity trigger:**
1. Click **Add Trigger**.
2. Select **Quantity** from the trigger type dropdown.
3. Choose **More than**, **Less than**, or **Exactly**.
4. Enter the item count threshold.
5. Click **Save**.
**Example use cases:**
* Set to "**less than 3**" - the upsell appears only when there are 1 or 2 total items in the cart.
* Set to "**more than 1**" - the funnel triggers for orders with 2 or more total items.
* Set to "**exactly 5**" - the funnel triggers only when there are exactly 5 total items in the cart.
* Set to "**exactly 0**" or "**less than 1**" - useful for targeting new customers who have no previous items. For example, combine this with the Customer Order Count trigger to show a welcome offer to first-time buyers with a single-item cart.
💡 **Tip:** If you need to trigger based on the quantity of a specific product rather than total cart item count, use the Product Quantity trigger instead (found under Product-Based Triggers).
## **Discount Code**
The Discount Code Trigger lets you include or exclude customers from seeing a funnel based on a discount code they use. A third option, **Excludes any manual discount code**, lets you exclude all orders where a manually-entered discount code was applied — without needing to list individual codes.
Here are some examples:
* You're running two promotions: 25% off for new customers and 10% off for email subscribers. Use the Discount Code trigger set to **Includes** with the email subscription discount code to display the funnel only to email subscribers.
* You want to prevent upsell offers from showing to any customer who used a discount code at checkout. Set the trigger to **Excludes any manual discount code**. The funnel will only fire for orders with no manually-entered discount code. Automatic and script discounts (such as a site-wide automatic discount) are not counted, so they will not suppress the funnel.
**NOTE:** ***Be sure to press "enter" after entering the discount code to save it in the funnel.***
## **Discount Percent (%)**
The Discount Percent (%) Trigger allows you to include or exclude customers from viewing a funnel based on the discount percentage applied.
Here are some examples:
* You have a funnel with a Discount Percent Trigger set to exclude discounts "**greater than 20%**." If a customer receives a 25% discount, the funnel will not activate. If they receive a 15% discount or no discount, the funnel will activate.
* You have a funnel with a Discount Percent Trigger set to include discounts "**less than 10%**." If a customer receives a 5% discount, the funnel will activate. If they receive a 15% discount, the funnel will not activate.
***
# Customer Attribute Triggers
*These triggers use customer data to control funnel visibility.*
## **Customer Tag**
The Customer Tag Trigger allows you to include or exclude customers from seeing a funnel based on their associated tags.
Here are some examples:
* You have a funnel with a Customer Tag Trigger set to include "**VIP**." If a customer has the VIP tag, the funnel will activate. If they don't have this tag, the funnel will not activate.
* You have a funnel with a Customer Tag Trigger set to exclude "**Wholesale**." If a customer has the Wholesale tag, the funnel will not activate, preventing retail upsells from showing to wholesale customers.
## **Customer Order History**
The **Customer Order History Trigger** lets you create offers based on a customer's past purchases.
**Important:** You must select specific products when using this trigger. If you don't, it will only display "Customer previously ordered \_\_\_\_" without applying any action.
If your goal is simply to check whether a customer has ordered before, use the [**Customer Order Count Trigger**](#customer-order-count) instead:
* More than 0 orders = Returning customer
* 0 orders = New customer
**NOTE:** *This trigger reviews only past orders, not the current order the customer is about to place.*
## **Customer Order Count**
The Customer Order Count Trigger enables you to display a funnel specifically for new or returning customers.
Here are some examples:
* You have a funnel with a Customer Order Count Trigger set to "**equal to 0**." If a customer has never placed an order before (first-time customer), the funnel will activate. If they have placed any previous orders, the funnel will not activate.
* You have a funnel with a Customer Order Count Trigger set to "**greater than 3**." If a customer has placed 4 or more previous orders, the funnel will activate. If they have placed 3 or fewer orders, the funnel will not activate.
**NOTE:** *This trigger is based on past purchases, not the current order.*
## **Customer Language**
The Customer Language trigger enables you to display specific offers based on the language a customer checked out in, creating a more personalized and engaging experience.
Here are some examples:
* You have a funnel with a Customer Language trigger set to "English." If a customer checks out in English, the funnel will activate. If they check out in any other language, the funnel will not activate.
* You have a funnel with a Customer Language trigger set to "French." If a customer checks out in French, the funnel will activate. If they check out in any other language, the funnel will not activate.
**Note:** While most text within a funnel can be translated manually, some global elements such as button labels and certain words are controlled through the **Translations** section in Aftersells **Settings** and currently only support a single language across all funnels. This is an area of active development and will be improved in a future update.
## **Once per Customer**
The Once per Customer trigger ensures a funnel only shows once per customer across all orders.
Here are some examples:
* You have a funnel with the Once per Customer trigger enabled. If a customer sees this funnel after their first purchase, they will not see it again on any future purchases, even if all other trigger conditions are met.
* You want to show a special "welcome offer" only to new customers on their first purchase. Enable the Once per Customer trigger to ensure the offer appears only once per customer, preventing it from showing on repeat purchases.
***
# Order Details & Time-Based Triggers
*These triggers depend on checkout details, marketing data, or timing.*
## **UTM Parameter**
A UTM Trigger is a marketing tool that activates specific actions based on UTM parameters in a URL. UTM parameters (Urchin Tracking Module) help track the effectiveness of online campaigns by providing details about the source, medium, and campaign name.
Here are some examples:
* You have a funnel with a UTM Parameter Trigger set to "**utm\_source = facebook**." If a customer clicks a link with `?utm_source=facebook` in the URL, the funnel will activate. If they arrive from a different source or no UTM parameter, the funnel will not activate.
* You have a funnel with a UTM Parameter Trigger set to "**utm\_campaign = summer\_sale**." If a customer clicks a link with `?utm_campaign=summer_sale` in the URL, the funnel will activate, allowing you to show campaign-specific offers.
When users click a link with UTM parameters, the trigger can identify these tags and perform actions such as:
* Displaying tailored offers or content based on specific campaigns.
* Segmenting visitors by their entry points to analyze marketing channel effectiveness.
* Creating personalized experiences with customized messages or redirects.
If you're interested in setting up Direct-to-Checkout UTM Links, please follow this [link](/aftersell/how_to_use_direct_to_checkout_utm_links).
⚠️ **Known limitation:** UTM triggers do not fire when customers use express checkout methods (Shop Pay, Apple Pay, Google Pay, PayPal, etc.) because express checkout bypasses the standard cart flow where UTM parameters are captured. If you are using UTM triggers for campaign tracking, consider using other trigger types (product, collection, order value) as alternatives, creating separate funnels for general traffic that do not rely on UTM parameters, or tracking campaign performance through other analytics tools.
## **Currency**
The Currency Trigger allows you to control whether customers see a funnel based on the currency they use at checkout.
Here are some examples:
* You have a funnel with a Currency Trigger set to "**USD**." If a customer checks out in US Dollars, the funnel will activate. If they check out in EUR, GBP, or any other currency, the funnel will not activate.
* You have a funnel with a Currency Trigger set to "**CAD**" and "**USD**." If a customer checks out in either Canadian Dollars or US Dollars, the funnel will activate. If they check out in any other currency, the funnel will not activate.
# General Rules for Currency Display
* Thank You Page offers and upsells adjust to the customer's currency, offering a seamless experience for shoppers in various markets. This means all prices are displayed in the same currency as the market chosen by the customer or their browsing session.
**Since Post-purchase upsells aren't shown to customers checking out in a currency other than your store's default**, everyone still sees the Thank You Page. By using the Currency Trigger, you can tailor specific Thank You Page offers for different currencies, enabling you to provide targeted product recommendations and offers that align with the customer's checkout currency. Alternatively, Thank You page offers can be used to create universal visibility for all customers, irrespective of country or currency, bypassing Shopify's post-purchase multi-currency restrictions. This approach offers a wider scope for upsell promotions.
# Shopify Markets Integration
* If your store uses Shopify Markets to display different currencies based on customer location, Aftersell integrates seamlessly to ensure products are displayed in the correct local currency.
* Shopify Markets automates the process of showing localized currencies and pricing for upsell offers.
* For details on setting up Shopify Markets, refer to Shopify's official documentation: [Shopify Markets Documentation](#).
# Important Considerations
* Always ensure that your store's default currency settings align with your operational requirements and customer expectations.
* For post-purchase upsell offers, check currency configurations to ensure compatibility with your target markets.
# Thank You Page Offers
* **Localized Pricing:** All Thank You Page upsells automatically adjust to the customer's currency. This ensures that a single funnel can offer localized pricing to all customers.
* **Currency Conversion:** Thank You Page upsells display in the checkout currency, even if the order currency differs from the store's default currency.
# Post-purchase upsell offers
* **Multi-Currency Limitation:** Post-purchase upsell offers do not support multi-currency. For this reason, customers will not see offers unless your store currency matches the expected currency.
## **Device Type**
The Device Type Trigger allows you to scope a funnel to customers on a specific device type — Desktop only or Mobile only. When enabled, the funnel only displays if the customer's device matches your selection.
Here are some examples:
* You have a funnel with a Device Type Trigger set to **Desktop only**. If a customer completes checkout on a desktop browser, the funnel will activate. If they check out on a mobile device, the funnel will not activate.
* You have a funnel with a Device Type Trigger set to **Mobile only**. If a customer checks out on a mobile device, the funnel will activate. If they check out on a desktop, the funnel will not activate.
**Note:** If a customer's device type cannot be detected (for example, when using a legacy storefront script), the trigger fails closed — the funnel will not display. This is the same behavior as other triggers when required data is unavailable.
## **Shipping Country**
The Shipping Country Trigger allows you to include or exclude customers from viewing a funnel based on their shipping destination country. For example, you can configure a funnel to exclude products restricted to the US when the shipping address is from outside the United States. This ensures geographical restrictions are respected, aligning the funnel offers with region-specific product availability.
As a reminder, Post-purchase upsells won't display to customers checking out in a currency different from your store's default currency; however, everyone will still see the Thank You Page. By using the Shipping Country Trigger, you can create targeted Thank You Page offers for specific countries, allowing you to provide tailored product recommendations and offers based on the customer's shipping location. This also means adjusting your shipping costs for different countries.
## **Random Sample**
The Random Sample Trigger enables you to control funnel visibility for a random subset of customers. This trigger is ideal for testing new funnels with a small percentage of your customer base or surprising a select group of customers with special offers.
Here are some examples:
* You have a funnel with a Random Sample Trigger set to "**25%**." The funnel will randomly activate for approximately 25% of customers who meet all other trigger conditions. The remaining 75% will not see the funnel.
* You want to A/B test two different upsell offers. Create two funnels, each with a Random Sample Trigger set to "**50%**." Each funnel will show to approximately half of your customers, allowing you to compare performance.
By applying the Random Sample Trigger, you can effectively test new strategies, measure impact, or add an element of exclusivity to your promotions, creating unique experiences for "**lucky**" customers who meet the criteria.
## **Date/Time**
The Date/Time Trigger allows you to schedule the visibility of a funnel based on specific dates and times. With this trigger, you can activate or deactivate offers according to a set schedule, making it ideal for time-sensitive promotions, seasonal campaigns, or exclusive, limited-time deals.
Here are some examples:
* You have a funnel with a Date/Time Trigger set to activate "**between December 1 and December 25**." The funnel will only activate for orders placed during this date range, perfect for holiday promotions.
* You have a funnel with a Date/Time Trigger set to activate "**after January 1, 2026**." The funnel will only activate for orders placed on or after this date, useful for launching new year promotions or product releases.
The Date/Time trigger includes a timezone selector dropdown, allowing you to choose the timezone your schedule should run in (for example, "GMT-07:00 - (MST) America/Phoenix"). Dates are selected using a date picker calendar, and you can set a start date, end date, or both to define the active window.
**Note:** Make sure you select the correct timezone for your store's primary audience. If your store serves customers across multiple time zones, choose the timezone most relevant to your promotion schedule.
## **Shipping Method**
The Shipping Method Trigger enables you to control funnel visibility based on the customer's chosen shipping option at checkout. This trigger allows you to include or exclude customers from specific offers depending on their selected shipping method.
Here are some examples:
* You sell a perishable product that requires overnight shipping. Set the Shipping Method Trigger to include "Overnight" or "Express" so the upsell only appears to customers who chose fast shipping and will receive their order quickly.
* You want to offer an expedited shipping upgrade. Set the trigger to include "Standard Shipping" so only customers who chose the slower option see the upsell to upgrade.
* You offer local pickup. Set the trigger to exclude "Local Pickup" so that shipping-dependent offers (like shipping protection) do not appear to customers collecting in-store.
**Note:** The shipping method names in Aftersell match the shipping rate names you have configured in Shopify. Make sure the names in your trigger exactly match your Shopify shipping rate names.
***
# Conditional Logic
Post-purchase triggers work together using simple logic: all triggers must be met (**AND logic**), and within each trigger, only one condition needs to match (**OR logic**).
For more details on how our trigger logic is applied, check out this article:
[Understanding Conditional Logic](/aftersell/understanding_conditional_logic_for_post_purchase_triggers)
# Post-purchase widgets
Source: https://docs.aftersell.com/aftersell/post_purchase_widgets
This document outlines the post-purchase widgets available in Aftersell and how they are used to build post-purchase upsell experiences. Widgets are grouped by scope and function, with each widget documented once to avoid duplication.
***
# Funnel-wide widgets
## Progress Bar
The **Progress Bar** shows customers where they are in the post-purchase flow.
When enabled, the progress bar appears on all upsell offers within the funnel. Any changes made to the progress bar apply across the entire funnel.
**Configuration options**
* Toggle the progress bar on or off for the funnel
* Choose a display style:
* **Minimal**
* **Minimal with labels**
* **Maximal**
* Select a light or dark appearance
* Adjust top and bottom padding to control spacing
***
# Offer-level widgets
Offer-level widgets control the content and behaviour of an individual upsell offer.
These widgets define what the customer sees on a specific upsell step, including messaging, urgency, product information, pricing details, and actions.
Each offer in a funnel can be customized independently using offer-level widgets, allowing you to tailor the experience at every step.
These widgets include:\
[Text](#text)\
[Timer](#timer)\
[Upsell Product](#upsell-product)\
[Product Selection](#product-selection)\
[Discount](#discount)\
[Badge](#badge)\
[Shipping](#shipping)\
[Image](#image)\
[Buttons](#buttons)\
[Price Breakdown](#price-breakdown)\
[Product Details](#product-details)\
[Variants](#variants)\
[Layout](#layout)\
[Video](#video)\
[Testimonials](#testimonials)
***
## Text
The **Text** widget is used for headings and supporting copy throughout an offer.
It supports a heading and optional body text, with controls for font size, color, weight, alignment, strikethrough, and spacing.
Use the dynamic variable `{first-name}` to personalize messaging for each customer.
***
## Timer
The **Timer** widget adds urgency by displaying a live countdown.
While the timer is running, the offer remains visible. When the timer reaches zero, the upsell offer automatically disappears and the customer is moved forward in the funnel.
***
## Upsell Product
The **Upsell Product** widget is the heart of the offer. It defines which product is being shown and acts as the container for all product-related widgets below.
Everything that follows is configured within this widget.
***
## Product Selection
The Product Selection widget controls which product is shown in an upsell offer.
You can select a fixed product or dynamically determine the upsell product based on the customer's original order, allowing for both static and adaptive upsell experiences.
#### Product type options
* **Specific product**\
Always displays the same product in the upsell.
* **Automatic upsell**\
Dynamically selects a product using predefined upsell logic.
* **Most expensive in cart**\
Uses the highest-priced item from the customer's original order.
* **Least expensive in cart**\
Uses the lowest-priced item from the customer's original order.
#### Changing the product
The selected product appears at the top of the widget. To change it:
1. Click **Change product**
2. Select a product type
3. Choose or confirm the product
When browsing the **Products** tab in the picker, you can check **Active products only** to hide Draft and Archived products from the list. This filter is off by default and only applies to the Products tab — Collections are not affected.
#### Identifying products with identical names
If your store has multiple products or variants with the same title, enable the **Show IDs** toggle in the product picker to display the numeric Shopify product ID and variant ID beneath each name. This makes it easy to confirm you are selecting the correct product.
The **Show IDs** toggle is available on the **Product** tab of the picker and is off by default. It is not available on the Collection tab.
***
## Discount
The **Discount** widget applies and displays promotional pricing.
You can choose between a percentage (%) discount or a fixed dollar (\$) discount. Custom discount text can be added if desired, and the discount can either reference the product's compare-at price or ignore it.
### Bulk discount shortcut for multi-product offers
For multi-product and collection offers, a **Discount** section appears directly in the Upsell Products widget settings — below the product selection area. This gives you a faster way to set or update discounts across multiple products without opening each product's individual settings.
The section is collapsed by default. When you expand it:
* A list of all products in the offer is shown, each with a checkbox and a badge displaying its current discount (for example, `17% off` or `$18.00 off`).
* Select the products you want to update using the checkboxes. All products are selected by default.
* A pill below the list shows how many products your changes will apply to.
* Use the discount type and value fields to set the discount. Changes apply only to the selected products — unselected products keep their existing discounts.
#### Mixed discounts across products
When selected products have different discount settings, the fields show placeholder text to indicate the variation:
* If products have different **discount types** (for example, some are % off and others are \$ off), the type selector shows **Mixed**.
* If products have different **discount values** or types, the value field shows **Multiple values** with a note that entering a new value will override each selected product's current discount.
#### Info icon on product rows
An info icon (i) appears beside a product's discount badge when that product has additional discount settings configured — such as a custom discount title, a compare-at price, or a subscription discount. Hovering over the icon shows a summary of those extras.
***
## Badge
The **Badge** widget highlights key product attributes such as popularity or urgency.
You can select a predefined badge label, choose from multiple visual styles, include an icon, and control where the badge appears in the offer or directly on the product image.
Custom badge images can be uploaded from **Advanced badge settings** (SVG or PNG, up to 10MB).
***
## Shipping
The **Shipping** widget controls how shipping costs are communicated.
You can either offer free shipping or charge for shipping by setting a specific shipping price.
***
## Image
The **Image** widget controls how product images are displayed.
It includes options to adjust the main image size, add a border, enable an image carousel, and upload a custom product image from **Advanced image settings**.
***
## Language
The **Language** section controls which language is used for all system text in the offer, including button text, subscription labels, pricing labels, and other non-editable strings.
Select a language from the **Language** dropdown to automatically translate system text for that offer. Aftersell supports 32 languages.
This setting does not affect badges or custom text fields — only system-generated text is translated.
***
## Buttons
The **Buttons widget** controls how customers accept or decline an upsell during checkout.
You can customize how the buttons behave and appear, including:
* Selecting the **default accept button text**
* Requiring a **confirmation click** before an upsell is accepted
* Changing the **decline button style** (for example, button or link)
* Adjusting **button alignment** and width
* Adding optional **supporting text** above or below the buttons, with styling controls and dynamic variable support
### Button text
You can configure the accept button text for your post-purchase offers using the **Default accept button text** dropdown. The available options depend on the offer type:
**Standard offers:**
* **Pay Now** - Displays "Pay Now • \[product total price]" (or "Add Now • Free" for free products)
* **Accept Offer** - Displays "Accept Offer" regardless of price
**Subscription Upgrade offers:**
* **Upgrade Subscription** - Displays "Upgrade Subscription" (default for new Subscription Upgrade offers)
* **Accept Offer** - Displays "Accept Offer" regardless of price
* **Pay Now** - Displays "Pay Now • \[product total price]" (or "Add Now • Free" for free products)
To translate button text, use the **Language** section above the Buttons section.
### Button layout options
You can also control the **position of the accept and decline buttons** relative to each other. The following layouts are supported:
* **Accept above decline** - Displays the accept button above the decline option
* **Decline above accept** - Displays the decline option above the accept button
* **Accept beside decline** - Displays the accept and decline buttons side by side
These layout options give you more flexibility to match your desired checkout experience and messaging hierarchy.
***
## Price Breakdown
The **Price Breakdown** widget adds clarity around pricing.
It can display shipping and tax, include extra details such as subtotal and discounts, and be aligned or positioned near the payment buttons for maximum clarity.
### Hide shipping adjustment line
When your offer is configured as a replacement upsell (using the "Replace item in original order with upsell" setting), the price breakdown includes a **Shipping adjustment** line that reflects any shipping cost difference between the original and replacement product.
You can suppress this line using the **Hide shipping adjustment line** checkbox, which appears in the Price Breakdown section only when a replacement upsell is configured. This setting is off by default, so existing offers are unaffected.
* When checked, the shipping adjustment line is hidden from the customer's price breakdown.
* When unchecked, the shipping adjustment line is shown as normal.
This setting only affects the shipping adjustment line on replacement upsell offers. The standard shipping line on non-replacement offers is not affected.
***
## Product Details
The **Product Details** widget controls how key product information is presented.
It supports product review ratings (automatically hidden if no reviews exist), an optional quantity selector, and the ability to skip the offer if the product already exists in the original order.
Product titles and prices are fully stylable and support some dynamic variables including `{product}`, `{original-price}`, `{current-price}`, `{savings}`, and `{savings-line}`.
An optional offer description can be added to reinforce value or urgency.
### Quantity selector presets
When the quantity selector is enabled, you can configure a **preset quantity** to control how many units are shown or allowed when the offer is displayed. The following preset options are available:
* **Fixed** — Sets a specific quantity that the customer starts with. The quantity selector is hidden and the customer cannot change the quantity.
* **Percentage of purchased quantity** — Sets the quantity as a percentage of the number of units the customer originally purchased.
* **Minimum quantity** — Sets a floor on the quantity. The customer starts at this value and can increase from there.
* **Maximum quantity** — Sets a cap on the quantity. The customer starts at 1 and cannot increase past the configured maximum (up to 20). A message is shown to the customer indicating the maximum quantity for the item.
### Description position
For single-product offers, you can control where the product description appears in relation to the CTA buttons:
* **Default (above buttons)** - The description appears above the accept and decline buttons
* **Below buttons** - The description appears below the accept and decline buttons
This setting allows you to adjust the layout to better match your messaging hierarchy and design preferences.
***
## Variant & plan options
The **Variant & Plan Options** widget controls variant visibility, selection, and subscription plan locking.
You can show or hide out-of-stock variants, hide the entire product if all variants are unavailable, and control whether variant options with a single choice are shown. **Advanced settings allow you to hide the variant selector entirely**.
Variant preselection options include Smart matching to the initial purchase, Unselected, requiring the user's selection or First available variant.
For products with multiple variant options, all options are displayed and an in-stock variant is preselected when available; out-of-stock options are shown as unavailable. For products with a single variant option, out-of-stock options are hidden.
### Subscription plan locking
When offering subscription products with multiple subscription plans, you can lock the offer to a specific plan. This prevents customers from changing the subscription plan during the post-purchase experience, ensuring they receive the exact subscription option you've configured.
**To lock a subscription plan:**
1. In the **Variant & Plan Options** section, locate the **Lock subscription plan** dropdown
2. Select a specific plan from the dropdown
3. The plan is now locked — customers will see the plan name as static text instead of a changeable dropdown
**When a plan is locked:**
* Customers see the plan name displayed as text
* The plan selector dropdown is hidden
* Customers cannot change the subscription plan
* If the locked plan is no longer available in Shopify, the offer gracefully falls back to showing all available plans
**Automatic reset:**
The locked plan setting automatically resets if you change the product's purchase option to one-time purchase only (removing the subscription option).
### Variant selector position
You can control where the variant selector appears in relation to the CTA buttons:
* **Above CTA buttons (default)** - The variant selector appears above the accept and decline buttons
* **Below CTA buttons** - The variant selector appears below the accept and decline buttons
When both the variant selector and product description are positioned below the CTA buttons, you can control their order:
* **Variant selector first** - The variant selector appears before the product description
* **Description first** - The product description appears before the variant selector
You can also adjust the top and bottom padding of the variant selector to fine-tune spacing and create the desired visual layout.
***
## Layout
The **Layout** widget controls the overall structure and spacing of the upsell.
You can choose between a single-column or two-column layout, adjust the maximum layout width, and fine-tune top and bottom padding to create a clean, readable experience.
***
## Video
The **Video** widget adds a clickable thumbnail to an offer that opens a hosted video player in a new tab, with a styled backdrop and a button to return to the upsell. The video plays in a new tab rather than inline, so the upsell offer stays open in the original tab.
The widget also supports a **backdrop color** to match your brand or focus attention on the player, and **layout settings** for alignment (left, center, right), and top and bottom padding.
To preview the customer experience, click the thumbnail in the **offer preview** in the editor. The hosted video player opens in a new tab exactly as it will on the storefront, so you can confirm the thumbnail, CTA, and close behaviors before publishing.
### Video source
The widget supports two sources:
* **YouTube URL** — paste any standard YouTube watch link.
* **Direct video URL** — paste a link to a hosted video file (for example, an MP4 you host on your own CDN).
Video URLs are validated when you save the widget. Direct uploads through the widget are not supported.
### Thumbnail and watch-video CTA
Upload the image customers will see in the offer before they open the video. A watch-video CTA is automatically placed on top of the thumbnail to draw attention to the play action. You can style the CTA label text to match your brand. Thumbnails are not auto-generated from the video — they must be uploaded.
You can also upload a separate **mobile-only thumbnail**. When set, the mobile thumbnail is shown on mobile devices and the default thumbnail is used on desktop, so you can tailor the image for each screen size.
### Autoplay
The **Autoplay** toggle controls whether the video starts playing automatically when the hosted player opens.
When autoplay is enabled, the video starts **muted**. Most modern browsers block autoplay of videos with sound until the customer interacts with the page, so playing muted is required for autoplay to actually fire reliably. Customers can unmute the video using the player controls once it has started.
If you would rather have audio play from the first frame, leave autoplay off and rely on the customer to manually click play on the video.
### Closing the video
There are three ways for a customer to close the hosted player and return to the upsell offer:
* **Back to offer button** — a button below the player that closes the tab and returns to the upsell.
* **Double-click anywhere** — double-clicking anywhere on the backdrop closes the player.
* **Auto-close on end** — when the video finishes playing, the player closes automatically.
Because the video opens in a new tab, closing the player closes that tab — the upsell remains in the original tab.
***
## Testimonials
The **Testimonials** widget displays real product reviews on your post-purchase offer to build trust and reinforce the customer's decision to accept an upsell.
Reviews are pulled from your connected review app. The widget appears in the offer editor picker as **"Testimonials"** with a star icon.
To use this widget, you must have a review app connected in **Settings > Product Reviews**. Supported apps include Judge.me, Klaviyo, Okendo, and Yotpo. See [Review app integrations](/aftersell/checkout_widget_types#review-app-integrations) for setup instructions.
### Selection modes
The Testimonials widget supports two modes:
* **Manual** — You select a curated pool of reviews to display. Reviews are shown in the order you saved them.
* **Dynamic** — Reviews are automatically pulled from your review app's synced cache based on the products in the upsell offer. Reviews are keyed to the offer's products, not the customer's original order.
### Configuration options
* **Review app** — Select which connected review app to pull reviews from.
* **Mode** — Choose Manual or Dynamic.
* **Minimum rating** — Set the minimum star rating for reviews to display (for example, 4 stars and above).
* **Display toggles** — Show or hide individual review elements:
* Star rating
* Review title
* Reviewer name
* Review date
* Verified buyer badge
* **Truncate review text** — Set a maximum character length for review text. Reviews exceeding this limit are clipped with an ellipsis.
* **Max reviews to show** — Set how many reviews appear, from 1 to 3.
* **Layout** — Arrange reviews **Horizontal** (side by side) or **Vertical** (stacked).
* **Padding** — Adjust spacing around the widget.
### Dynamic mode and review syncing
In dynamic mode, Aftersell imports reviews from your review app and stores them so they can be displayed on the offer. The first import happens automatically within 24 hours of connecting your review app, and then once a week after that.
To import reviews immediately, go to **Settings > Product Reviews** and click **Sync now** for your review app.
### Verified buyer badge
When the verified buyer badge is enabled, a **"Verified buyer"** label is shown on qualifying reviews. This label is automatically translated into the language set for the offer and supports 32 languages.
***
## Adding additional widgets
Widgets can be added either **above or below the Upsell Product widget**, allowing you to control the flow of information before or after the product itself.
Additional widgets that can be added include:
* **Image** - Display a supporting image to visually reinforce the offer.
* **Text** - Add supporting text to communicate key messages.
* **Text & Image** - Combine text and visuals to highlight value or explain the offer.
* **Extra Buy Button** - Add an additional call-to-action to encourage offer acceptance.
* **Trust Badge** - Display trust signals such as guarantees, security, or credibility indicators.
* **FAQs** - Answer common customer questions to reduce friction and increase confidence.
* **Video** - Display a thumbnail that opens a hosted video player in a new tab, with a styled backdrop and a button to return to the upsell.
**Video widget settings:**
* **Play button label** - Optional text displayed on the thumbnail overlay alongside the play circle (for example, "Watch now"). This field is disabled when the hide play button overlay toggle is on.
* **Hide play button overlay on thumbnail** - When enabled, the thumbnail displays only your poster image with no play circle or label drawn over it. Use this if your poster image already includes its own call-to-action artwork. When disabled (default), the play circle and optional label are rendered on top of the poster.
To add a widget:
1. Choose whether you want the widget to appear **above or below** the Upsell Product widget
2. Click **Add widget** in the selected section
3. Select and configure the widget you'd like to include
***
To learn more about what post-purchase offers are, how they work, and how to start using them with Aftersell, take a look at [this article for more information](/aftersell/post_purchase_overview).
***
The behavior and appearance of widgets are limited to the configuration options available in the editor.\
Further customizations are not supported due to Shopify limitations.
***
## Need help?
If you have questions or need assistance setting up your post-purchase offers, our support team is here to help. You can reach out anytime through the in-app chat or by contacting us via email.
# Potential workarounds for fulfillment flow issues
Source: https://docs.aftersell.com/aftersell/potential_workarounds_for_fulfillment_flow_issues
## Solutions to fulfillment problems
To solve fulfillment problems, we must prevent orders from being fulfilled until we are certain that the customer is no longer on the post-purchase page. This ensures that the order is in it’s final state and will not have extra items added.
There are two common solutions to fulfillment problems:
1. (*Preferred*) Look for a setting in the fulfillment service to handle **On hold** orders. If the fulfillment services can natively handle **On hold** orders then enabling the setting should resolve any issues. Many older systems do not have this setting though, in which case:
2. Use the payment status of the order as a makeshift fulfillment hold. Almost all fulfillment systems have an option to not fulfill orders that are not marked as **Paid**. This solution is described in detail below as it is non-intuitive and is generally more involved.
## Using payment status as a makeshift fulfillment hold
The core principle of this solution is that we only want to mark an order as **Paid** when it can be fulfilled (i.e., there is no fulfillment hold).
By default, Shopify captures payment immediately when an order is placed. This means that orders will be marked as **Paid**. To change this behaviour, you can go to ***Shopify > Settings > Payments > Payment capture method > Manage*** and change the payment capture method to “**Manually**”.
With the payment capture set to manual, we get to control when the payment is captured and thus when the order is imported into the fulfillment service. To do this, we can set up a Shopify Flow to capture the payment when and order is no longer **On hold**. When the payment is captured, the order will be marked as **Paid** and the fulfillment system can then import the final order which would include the post-purchase upsell item.
Note that “fulfillable” is used to check whether or not an order is **On hold.** This is the easiest way to check for holds in a Flow.
For more details on the implementation, there is a video explanation using this makeshift payment status fulfillment hold with the app ShippingEasy. The same principles apply to other fulfillment services:
# Post-purchase insights
Source: https://docs.aftersell.com/aftersell/ppu_insights
Understand how your post-purchase funnel performance compares to similar stores using the peer benchmarks feature in Aftersell.
The post-purchase insights page gives you a benchmark view of your revenue per visit (RPV) compared to stores with a similar average order value (AOV) and, where available, a similar industry. This helps you understand how your post-purchase funnel is performing relative to your peers.
This feature is available to all merchants on a post-purchase plan.
***
## Accessing post-purchase insights
You can access post-purchase insights in two ways:
* **From the home page** — A **Peer benchmarks (PPU)** widget appears on your home page. Click **View full report** to open the full insights page.
* **Directly** — Navigate to **Reports > Post-purchase** in your Aftersell admin.
***
## Peer benchmarks widget
The peer benchmarks widget on your home page gives you a quick snapshot of how your RPV compares to similar stores over the last 30 days.
The widget shows:
* **Your RPV** — Your revenue per visit for post-purchase offers over the last 30 days.
* **Peer comparison** — How your RPV ranks against stores that share your AOV (and industry, if available). The sub-heading describes the comparison being made, for example "Compared to stores that share your AOV and industry · Last 30 days" or "Compared to stores that share your AOV · Last 30 days".
* **Percentile ranking** — Where you fall within your peer group (for example, Top 25%, Average, or Below average).
If your store is new to post-purchase or does not yet have enough data, the widget displays a message explaining that your benchmarks will appear as your store earns with the app.
***
## Full post-purchase insights report
The full report at **Reports > Post-purchase** includes additional detail across several sections.
### Performance summary
The performance summary shows your RPV alongside your peer group's 25th percentile, median, and 75th percentile values. This lets you see at a glance whether your funnel is performing above or below the median for similar stores.
The peer group is determined by:
* **AOV bucket** — Stores are grouped by average order value range (for example, \$80–100 AOV).
* **Industry** — When your store's industry is available, the peer group combines AOV and industry for a more relevant comparison. If there are not enough peers in the combined cohort, the comparison falls back to AOV only.
The sub-heading on the performance summary describes which comparison is being used.
### Daily RPV trend
The daily RPV trend chart shows your revenue per visit for each day over the last 30 days, plotted alongside the peer group median. This helps you identify patterns, seasonal dips, or improvements in your funnel performance over time.
If there is not enough daily data yet, the chart displays a message to check back after a few days of activity.
### Per-funnel breakdown
The per-funnel breakdown table lists each of your active post-purchase funnels alongside their individual performance metrics, including:
* **Impressions** — How many times the funnel was shown.
* **Acceptance rate** — The percentage of impressions that resulted in an accepted offer.
* **Health status** — A qualitative label (for example, Top performer, Average, or Needs attention) based on how your funnel's acceptance rate compares to the peer group median.
You can click **Edit** on any funnel row to go directly to that funnel's trigger settings.
### Recommendations
The recommendations section highlights specific funnels or settings that may help improve your performance, based on your benchmark data.
***
## How the peer group is determined
Aftersell matches your store to a peer group using two dimensions:
| Dimension | Description |
| -------------- | ------------------------------------------------------------------- |
| **AOV bucket** | Your store's average order value range (for example, \$80–100 AOV). |
| **Industry** | Your store's product category or industry, when available. |
When both dimensions are available, the peer group uses a combined AOV + industry cohort. If that cohort does not have enough stores to produce a reliable benchmark, the comparison falls back to AOV only. The label on the performance summary and widget always reflects which comparison is being used.
***
## Notes
* Benchmark data is updated on a rolling basis and reflects the last 30 days of activity.
* RPV values are shown in your store's currency, converted from USD using the current exchange rate.
* Stores without post-purchase access do not see the widget or the insights page.
# Product page upsells
Source: https://docs.aftersell.com/aftersell/product_page_upsells
This article outlines how to setup product page upsells.
The Product Page Upsells (PDP Upsells) feature in Aftersell allows you to create compelling upsell offers directly on your product pages. This guide will walk you through how to set up and optimize this feature to boost customer engagement and increase sales.
***
# Introduction to Product Page Upsells
The Product Page Upsells feature enables you to display relevant, complementary, or related product offers directly on the product page of your store. This functionality helps boost conversions by encouraging customers to purchase additional items.
* Customers do not need to make a purchase before seeing Product Page Upsells. These appear based on triggers you set, such as specific products or page conditions.
This feature mimics the popular **"Buy It Together"** experience found in many leading ecommerce platforms by offering a seamless and effective upselling opportunity without interrupting the customer's journey.
***
# Setting Up Product Page Upsells
## Step 1: Create an Upsell Offer
1. Open the Aftersell Product Page Upsells dashboard and click Create New Upsell.
2. Choose which product(s) or collection(s) will trigger the upsell.
3. Select up to five products to display as upsell offers.
4. *(Optional)* Add a discount to make your offer more enticing. When a discount is applied, a value tag is automatically shown to customers on the upsell widget — for example, **$100 off** or **CA$130 off** for fixed-amount discounts, and **22% off** for percentage discounts. The label uses the customer's presentment currency, so it always matches the actual discount applied at checkout.
5. Save your setup when complete.
## Step 2: Add the App Block to the Product Page
To display upsells on your product pages:
1. Open the Shopify Theme Editor from your Aftersell dashboard.
2. The PDP Upsell App Block will automatically be added to your Theme Editor
3. Drag it to your preferred position on the page.
4. Save your setup when complete
**NOTE:** You can't move app blocks between sections, but you can reorder them within the same section.
## Translating Product Page Upsells
Only two sections within the Product Page Upsell widget require translation.
### 1. Header Text
The "You may also like" text displayed above the upsell products can be updated.
To edit this:
Go to **Design Settings → Header → Heading Text**
Replace the text with your preferred language.
### 2. Add to Cart Button
The "Add to cart" button text can also be translated.
To edit this:
Go to **Design Settings → Button → Text**
Update the button text to match your store's language.
# **Individual Products vs Bundles**
* **Individual Products:** Customers can add upsell items separately
* **Bundles:** Customers can add multiple products at once with a single discount or a Buy X, Get Y Free offer.
***
# Compatibility with Shopify Themes
Product Page Upsells requires a Shopify theme that supports adding app blocks.\
Most modern themes (2021 and later) are compatible. If you're using an older "vintage" theme, please upgrade to a newer Shopify theme to enable app blocks and unlock this feature.
Most modern themes (2021 and later) are compatible. If you're using an older "vintage" theme, please upgrade to a newer Shopify theme to enable app blocks and unlock this feature.
***
# Discounts and strategy pricing
When you configure a discount on a product page upsell widget, the discount applies to all products the widget returns. If you also assign a strategy to the widget, and that strategy includes per-rule price adjustments, the two discount sources work together on a per-product basis:
* **Products targeted by a strategy rule discount** — the strategy's rule discount applies to those products.
* **Products returned by the strategy but not targeted by a rule discount** — the widget's configured discount applies as a fallback.
* The two sources never stack. Each product receives exactly one discount — either the strategy rule's adjustment or the widget discount, never both.
When the selected strategy carries a rule discount, the widget editor shows an informational banner:
> *"This strategy applies its own discount to the products it targets. The discount below is the fallback for products it doesn't discount."*
The discount section remains fully editable. You can configure the widget discount as the baseline for any products the strategy returns but doesn't specifically discount.
> **Note:** Strategy price adjustments for product page upsells are in Beta access. Contact the Aftersell support team to enable this for your store.
***
# **Limitations**
* Subscription-only products can't be used as upsells.
* Bundles won't appear if an included product is out of stock, this ensures accurate pricing and protects margins.
***
# Translating product page upsells
Only two sections within the Product Page Upsell widget require translation.
### 1. Header Text
The "You may also like" text displayed above the upsell products can be updated.
To edit this:
Go to **Design Settings → Header → Heading Text**
Replace the text with your preferred language.
### 2. Add to Cart Button
The "Add to cart" button text can also be translated.
To edit this:
Go to **Design Settings → Button → Text**
Update the button text to match your store's language.
***
# **Final Steps**
Once you've added the app block and created your offer, activate your upsell to start increasing conversions.
***
By following these instructions, you can implement the Product Page Upsells feature to enhance your store's sales potential.
For help setting up or troubleshooting, please contact the **Aftersell Support Team** directly from the app.
# Product targeting API security tokens
Source: https://docs.aftersell.com/aftersell/product_targeting_api_security_tokens
Generate and manage security tokens to authenticate API requests for product targeting strategies
Security tokens allow you to authenticate API requests when accessing your product targeting strategies programmatically. You can generate, view, and regenerate tokens directly in the Aftersell admin.
## Generating a security token
To generate your first security token:
1. Navigate to **Product Targeting** in the Aftersell admin
2. Locate the **Security Token** card at the top of the page
3. Click **Generate Token**
4. Your new token will be displayed - click **Copy** to copy it to your clipboard
⚠️ **Important:** Make sure to copy your token immediately after generation. You won't be able to see it again after you leave the page.
## Viewing your token
After generating a token, you can:
* **Show/hide the token:** Click the eye icon to toggle visibility
* **Copy the token:** Click the **Copy** button to copy it to your clipboard
The token is masked by default for security. Once you navigate away from the page, the token will be permanently hidden and can only be regenerated (which invalidates the previous token).
## Regenerating a token
If you need to create a new token (for example, if your current token was compromised):
1. Navigate to **Product Targeting** in the Aftersell admin
2. In the **Security Token** card, click **Regenerate**
3. Your new token will be displayed - click **Copy** to save it
⚠️ **Warning:** Regenerating a token will immediately invalidate your previous token. Any API requests using the old token will fail. Make sure to update all systems using the old token before regenerating.
## Using your security token
Include your security token in API requests to authenticate and access your product targeting strategies. Keep your token private and secure - treat it like a password.
💡 **Best practices:**
* Store tokens securely (never commit them to version control)
* Regenerate tokens if you suspect they've been compromised
* Use different tokens for different environments (development, staging, production) if possible
* Keep a record of when tokens were generated and where they're being used
# Progress bars & product badges
Source: https://docs.aftersell.com/aftersell/progress_bars_product_badges
This article outlines how the Progress bar & product features work.
You can find these features within the 1-click upsell editor here:
## Progress bars
The **Funnel-Level** widget allows you to add a progress bar to one upsell and have it automatically applied to all upsells within the same funnel. This ensures a consistent experience across offers while reducing manual setup for merchants.
* The widget is always available but marked as hidden for existing offers and funnels.
* It is enabled by default for newly created funnels.
* Merchants can still upload a custom progress bar using the **Image** widget if they prefer a custom design etc.
* You currently cannot translate these widgets and therefore have to upload custom images with the personalized translations you require. Translations and more options will be available soon!
### Settings
### Style
Minimal
Minimal with labels
Maximal
### Appearance
Black
White
***
## Product Badges
**Product Badges** let merchants highlight key product details directly on the offer. These badges help draw attention to important features or offers, increasing visibility and buyer confidence.
* Available as an option on each product.
* Merchants can upload their own custom badges.
* Colors, text, and icons cannot currently be edited, but customizable templates will be available soon.
### Settings
## Badge labels Options:
* **Bestseller** - Ideal for highlighting products with the highest sales or strongest performance to boost trust and social proof.
* **Trending** - Great for showcasing products that are currently gaining traction or experiencing high engagement.
* **New** - Best for drawing attention to newly launched products or offers.
* **Lowest Price** - Useful for promoting discounted or best-value items to encourage quick conversions.
* **Ships Free** - Perfect for emphasizing free shipping offers, helping reduce purchase hesitation.
## Appearance Options
Badges come in four appearance styles to match different funnel designs and brand aesthetics:
* **Vibrant** - Bright and eye-catching, ideal for drawing immediate attention to key offers.
* **Vibrant Inverse** - A variation of Vibrant with inverted colors for a bolder contrast.
* **Classic Dark** - Clean and professional, best for lighter backgrounds.
* **Classic Light** - Subtle and minimal, designed for darker backgrounds or a softer look.
## Position in Offer
Badges can be placed in different positions within the offer layout to best fit your design and draw attention where it’s most effective:
* **Above Product Title** - Great for immediate visibility before the shopper reads product details.
* **Adjacent to Product Price** - Ideal for reinforcing urgency or value near the price point.
* **Below Product Price** - Best for subtle messaging that supports the purchase decision without distraction.
***
## Why It Matters
Progress bars have consistently shown positive results in improving both revenue per visitor (RPV) and conversion rates across many merchants, including those using Smart Funnels.
Similarly, **Product Badges** have proven effective in enhancing trust and buyer awareness, leading to measurable improvements in overall funnel performance.
# Quickstart guide to Aftersell
Source: https://docs.aftersell.com/aftersell/quickstart_guide_to_aftersell
This article outlines how to activate Aftersell, set up post-purchase offers, and deliver a seamless funnel experience for your shoppers
This guide walks you through setting up Aftersell's post-purchase funnel from start to finish, from creating your trigger to customizing post-purchase offers and optimizing your thank-you page.
Aftersell seamlessly integrates into your Shopify checkout flow, allowing you to deliver targeted offers immediately after a purchase without disrupting the customer experience.
***
# Setting up your first funnel
When you open Post-purchase Funnels for the first time, you'll see a **"Start with a template"** gallery instead of a blank screen. Pick a template that fits your store and click **Use this template** — Aftersell creates the funnel and takes you straight into the editor to customize it.
Available templates:
* **Classic upsell** — Offer one more of what the customer just bought, at a discount. A simple starting point.
* **Bestseller bundle** — A full upsell flow with a follow-up multi-product offer and a downsell. Great for catalog stores.
* **Thank-you boost** — A friendly thank-you message on the order confirmation page.
If you'd prefer to start from scratch, use the **Add funnel** button (available once you have at least one funnel) and select **Create manually**. If you'd like to learn more about post-purchase funnels and how they work, check out [this article](/aftersell/post_purchase_overview).
***
# Triggers
Triggers can be utilized to display a funnel in particular situations, and they can be combined to effectively highlight funnels for specific scenarios.
### What triggers do
Triggers enable you to **control exactly when and with whom a funnel appears**. They act like filters or rules so that your funnel is shown only under specific conditions such as certain products, cart value or customer attributes
### Benefits of using triggers in funnels
* **Increase relevance and conversions** - Show personalized offers based on what the customer purchased (e.g., display a "Shoes" funnel after a shoe purchase).
* **Avoid irrelevant offers** - Exclude specific products, collections, discount codes, or regions where offers don't apply.
* **Personalize by customer type** - Target new or returning customers and tailor offers using tags or order history.
* **Run smarter campaigns** - Use random-sample triggers for testing or date/time triggers for limited-time promotions.
* **Maximize ROI** - Focus your efforts where they're most effective and maintain a smooth, trustworthy post-purchase experience.- **Refine targeting with exclusions** - Manage product/collection exclusions to ensure ineligible products never trigger upsell offers. This customization helps tailor campaigns for customer relevance and exclusivity.
### Show for all customers trigger
A **"Catch-All" funnel** uses the **Show for All Customers** trigger.
This funnel does not look for any conditions and activates **when an order doesn't meet the conditions of any other funnel**, acting as a **safety net** to ensure every customer still sees an upsell or thank-you page offer.
If you have other funnels created, **set this funnel to the lowest priority** so it only appears when no other funnel is triggered.
Want to understand each trigger in more detail? Take a look at [this article](/aftersell/post_purchase_triggers).
***
Post-purchase upsell offer
# Checkout upsells vs post-purchase upsells
Checkout upsells appear directly on the checkout page during the customer's purchase process, integrated with Shopify's checkout flow. Post-purchase upsells, on the other hand, are displayed immediately after the order is confirmed, aligning with Shopify's post-purchase ordering requirements.
Once you've selected your triggers, proceed to the next step to **create your offers**.\
Below is a quick overview of how the offer flow works:
### **Add your offer products**
Choose the type of upsell you'd like to offer. There are a few different options to choose from:
**Single Product**
* **Specific product** - Choose a specific product to display to your customers. This can be a popular item or one you'd like to promote more.
* **Automatic upsell** - Uses Shopify's AI to suggest a complementary product based on what's currently in the customer's cart.
* **Most expensive/Least expensive in cart** - Re-offers the item from the customer's original order that was either the most or least expensive. To further enhance this functionality, Aftersell leverages Shopify's Recommendation API. This enables more accurate and personalized product suggestions by considering factors such as customer behavior and product affinity. For more information, refer to Shopify's [Recommendation API Documentation](https://shopify.dev/docs/themes/product-merchandising/recommendations/related-products#recommendation-logic).
**Multi Product**
* **Specific products -** Choose multiple (up to 12) specific product to display to your customers at once
* **Collection** - Choose a specific collection for your customers to see
* **Automatic upsell** - Uses Shopify's AI to suggest multiple complementary products based on what's currently in the customer's cart. Similar to single-product upsells, multi-product suggestions utilize Shopify's advanced Recommendation API to tailor product collections dynamically based on customer behavior and preferences.
Please note that only **one product per upsell offer** can be accepted at a time, unless you're using **multi-step offers**. To learn more, check out [this article](/aftersell/how_to_create_a_multi_step_post_purchase_upsell) on multi-step upsells.
These upsell offers **add to your customer's order**, they don't replace items already in the cart.\
To learn more about **replacement upsells**, contact our team through live support or by email at **[support@aftersell.app](mailto:support@aftersell.app)**.
***
### Customize your offers
Once your offer products are chosen, you'll want to customize your offers to match your store's branding and focus on **why** the customer should add the upsell.
Each widget helps you build an offer that matches your brand and connects with your customers.
Here's a quick rundown of the widgets you can add:
* **Text** – Add headlines, short descriptions, or supporting text that explains why the offer is worth grabbing. Keep it simple and persuasive.
* **Timer** – Create urgency by showing a countdown timer (perfect for limited-time offers).
* **Upsell Product** – This is where you can choose whether your offer is to be shown as a one-time purchase, subscription or both!
* You can customize the **product selection**, apply a **discount**, or include a **badge** (like "Bestseller" or "New")
### Optional: Add a custom order tag
You can add a custom tag to track which specific offer a customer accepted. When configured, your custom tag is automatically applied to the order in Shopify alongside the standard "Aftersell Upsell" tag.
To add a custom order tag:
1. In the offer settings, find the **Order Tag** field
2. Enter your custom tag (up to 40 characters)
3. Save your changes
This helps you segment orders and track performance of specific offers. For more details, see [Configuring post-purchase offer settings](/aftersell/configuring_post_purchase_offer_settings).
Your post-purchase branding will directly match your Shopify checkout branding. This means that there's no settings within Aftersell to edit colours, fonts, etc. However, you are able to make that change in your Shopify Admin settings. Check out [this article](/aftersell/post_purchase_branding_settings) to learn more.
Keep in mind, there can be a small visual bug within the editor and it may not show colours accurately. We recommend placing a test order to ensure everything matches your Shopify Admin settings.
Once you're happy with your offers and customizations, you're ready to move on to the final step of your funnel - The Thank You Page.
***
# Thank you page
The Thank You page is your chance to bring customers back for more! Use this space to encourage repeat purchases, share product recommendations, and strengthen brand loyalty.
To get started, click **"Edit Extensions Page"** this opens the editor where you can customize your Thank You page.
### Make the most of your thank you page
You can personalize your Thank You page using a variety of **widgets**. These let you highlight key products, answer customer questions, and add engaging content that keeps shoppers connected to your brand.
Here are a few popular ways to use them:
* **Product Recommendations** – Use specific products, automatic upsells or collections to drive repeat purchases.
* **FAQs** – Answer common questions to build trust and reduce support inquiries.
* **Text or Image Widgets** – Share thank-you messages, brand stories, or special offers like discount codes.
* **Custom Code** – Add unique content or connect other tools for an even more personalized experience.
For a complete list of available widgets and detailed setup instructions, check out [this article](/aftersell/thank_you_page_extensions_overview).
### Important information
Once you're happy with your Thank you Page widgets, you'll need to add them to **both** the **Thank you and order status pages** in the Shopify editor. Skipping this step will cause the thank you page widgets to not display for your customers.
Add the Aftersell TY widgets in your Shopify Editor in two locations:
Thank you page
Order status page
Once you've placed the app blocks on both the thank you and order status page, make sure to enable the widget and save your work.
Now that everything has been set up, you can set the status of funnel to active
**Note:** If a product recommendation on the Thank You page is accepted, it can either generate a new, separate order **or** be merged into the original order, depending on your settings. Refer to [this article](/aftersell/thank_you_page_extensions_overview) for more information.
For more information about the differences between post-purchase upsells and thank you page upsells, please refer to [this article](/aftersell/one_click_upsells_vs_thank_you_page_upsells).
***
# Smart funnel
If a manual funnel is a lot of work, you can use our Smart Funnel to automatically optimize and deliver the best post-purchase offers for you.
Smart Funnel uses Rokt's advanced AI and machine learning algorithms trained on millions of transactions to automatically show each shopper the most relevant post-purchase offer. It continuously analyzes your store's data and customer behaviour, improving in real time to deliver smarter results over time. Additionally, it seamlessly integrates Shopify's Recommendation API for generating specific product recommendations, combining Rokt's AI capabilities with Shopify's data-driven insights for optimal upsell presentation.
**Key benefits**
* **Personalized targeting:** Tailors offers to each customer using AI.
* **Optimized performance:** Adapts automatically to boost results.
* **Effortless setup:** Fully automated and easy to manage.
To get started with the smart funnel, you'll first want to click enable.
From here, you can customize your Smart Funnel to fit your store's goals:
* **Traffic Allocation:** Decide how much of your traffic you want to run through the Smart Funnel instead of manual funnels.
* **Max Discount:** Set the highest discount the Smart Funnel can offer to your shoppers.
* **Default Products:** The Smart Funnel automatically uses AI-recommended upsells to help boost revenue.
* **Skip Products in Original Order:** Choose whether to exclude items your shoppers already have in their original order.
* **Highlighted Product (optional):** Feature a specific product you'd like to spotlight in the funnel.
* **Require Confirmation Click to Accept (optional):** Enable this to require customers to click the accept button twice—once to confirm their intent, and once to complete the purchase.
**Funnel priority**\
Smart Funnel is set to **Priority 0**, so its offers appear before any manual funnels when eligibility criteria are met.
For more details about the Smart funnel, take a look at [this article](/aftersell/smart_funnel). For more details about customization and the AI Upsell Widget within the Smart Funnel, you may refer to the steps outlined in Shopify's Recommendation API documentation for deeper technical insights. Additionally, Shopify's Recommendation API uses algorithms designed to analyze factors such as purchase proximity, order frequency, and customer cart history. This technical backbone ensures high accuracy in product recommendations, directly driving customer satisfaction and revenue.
***
## **Need more help?**
If you have any other questions about post-purchase upsells, thank you page offers or the smart funnel, our support team is always happy to help through **live chat** or **[support@aftersell.app](mailto:support@aftersell.app)**.
# Replacement upsells
Source: https://docs.aftersell.com/aftersell/replacement_upsells
How Replacement Upsells work in Aftersell and how to set them up, from variant and quantity swaps to converting a one-time purchase into a subscription.
Replacement Upsell lets you swap a one-time product in the customer's order for a different product on the post-purchase page. The replacement can be a subscription version of the same product, a different variant or quantity, or a completely different product. The customer accepts in one click, the original line item is refunded, and the replacement line item is added to the order.
Replacement Upsell is currently a Beta feature. To use it on your store, message support via the in-app chat and we will enable it on your account. The **Replace item in original order with upsell** toggle will not appear in the offer editor until it has been enabled.
Replacement Upsell only works when the original line item is a one-time purchase. If the customer's order already contains a subscription, the offer is silently skipped. To modify an existing subscription (change frequency, swap product, or both), use [Subscription Upgrade](/aftersell/subscription-upgrades) instead.
When a customer accepts a Replacement Upsell, Aftersell charges the full replacement product price and refunds the original. The customer's bank statement will show two transactions, even though the net amount matches the displayed Accept Offer button. Plan your offer copy and post-purchase confirmation email so customers do not think they were double-charged.
## Which feature do you need?
Three subscription-adjacent post-purchase features, three different jobs. Use this flow to pick the right one.
**Does the customer's order already contain a subscription?**
→ **Yes** → Use [Subscription Upgrade](/aftersell/subscription-upgrades). It modifies the customer's existing subscription contract in Recharge, Skio, or Loop (change frequency, swap product, or both).
→ **No** → continue below.
**Do you want the customer to keep what they bought AND get a recurring subscription, or replace what they bought entirely?**
→ **Keep what they bought + add a new subscription on top** → Use [Subscription Upsell](/aftersell/subscriptions_in_post_purchase_offers).
→ **Replace what they bought with something else** (subscription version, different product, different variant or quantity) → Use **Replacement Upsell** (this guide).
## What is a Replacement Upsell?
When a customer accepts a Replacement Upsell:
1. The original one-time line item is **refunded** in Shopify.
2. The replacement line item is **added** to the same order, either as a one-time purchase or a subscription (depending on what you configured).
3. The customer pays for the replacement on the same order.
4. Their statement shows two transactions: the refund of the original, and the charge for the replacement. The displayed Accept Offer button reflects the **net difference** between the two prices.
This is implemented using Shopify's post-purchase API:
* For a one-time replacement (different variant, quantity, or product), Aftersell sends an `add_variant` changeset.
* For a subscription replacement, Aftersell sends an `add_subscription` changeset.
* The original line item is removed via Shopify's refund API.
Aftersell does not call your subscription app's API directly for subscription replacements, the subscription is created by Shopify's native Subscription API and your subscription app picks it up via its own Shopify integration.
## What Replacement Upsell can do
Replacement Upsell supports four scenarios. In each case, the **original line item must be a one-time purchase**. The replacement can be either one-time or subscription.
* **One-time to one-time, same product, different variant.** For example, swap the Twin size for the Queen size.
* **One-time to one-time, same product, different quantity.** For example, swap a single bottle for a 3-pack of the same item. Enable **Override quantity** on the replacement to set the quantity that ships.
* **One-time to one-time, completely different product.** For example, swap a starter bottle for a full-size version of a different SKU.
* **One-time to subscription.** For example, swap the one-time bottle for a monthly subscription of the same bottle, or for a subscription version of a different product. This is the most common use case.
## What Replacement Upsell cannot do
These scenarios are **blocked by Aftersell at offer-display time**. The offer will silently skip if the customer's order matches any of them.
* **Subscription to one-time.** Removing the subscription line item does not cancel the subscription contract in Recharge, Skio, or Loop. The customer would still be billed and also receive the replacement.
* **Subscription to a different subscription.** Same root cause as above, plus Shopify's "one subscription per order" rule blocks adding a new subscription to an order that already contains one.
* **Subscription to subscription variant or frequency swap.** Same root cause.
If you need to change a customer's existing subscription, use [Subscription Upgrade](/aftersell/subscription-upgrades) instead. Subscription Upgrade modifies the existing contract in Recharge, Skio, or Loop directly, without trying to remove and re-add the subscription line.
Whenever a Replacement Upsell is skipped (a blocked scenario above, an unsupported payment gateway, or a discounted trigger line), Aftersell automatically tries to show the **downsell** offer in the same funnel instead. Set up a downsell as a fallback whenever you use Replacement Upsell so the shopper still sees an offer.
## What the customer sees
Understanding the customer's view prevents the most common support ticket: "Why was I double-charged?"
### In the post-purchase offer
The Accept Offer button shows the **net difference** between the original and the replacement. For example, if the customer bought a $30 bottle and you offer a $45 3-pack, the Accept button reads "Add \$15.00 to your order." If the replacement is cheaper than the original, the button reads as a credit.
The offer card shows the replacement product's image, title, and price. The offer card uses the variant-specific image when one is tagged on the variant in Shopify. If the variant has no image tagged, the offer card falls back to the parent product's first image. This means swapping between two variants of the same product may or may not change the image, depending on whether each variant has its own image set up in Shopify.
### On the Shopify order after acceptance
The order ends up showing both:
* The original line item with a **refund** applied to it.
* The new line item for the replacement, charged at full price.
The order total reflects the net result, but the customer's bank statement will show two transactions, one charge for the replacement and one refund for the original. This is how Aftersell processes Replacement Upsell acceptances at the payment level. The net amount matches the displayed Accept Offer button.
To reduce confusion:
* Include a line in the offer copy that explicitly describes the refund-and-replace mechanic. For example: "When you accept, we will refund the original item and charge for the replacement. You will see two line entries on your statement, the net is the upgrade price shown on this button."
* Enable Aftersell's automatic refund-notification email for replacement upsells, which sends the customer a confirmation explaining the refund.
### In the subscription provider portal (when replacement is a subscription)
If the replacement is a subscription, the customer will see the new subscription in your subscription provider's customer portal (Recharge, Skio, Loop, Appstle, Smartrr, Stay.ai). The portal is owned by your subscription provider, not by Aftersell. Make sure your subscription provider's welcome email is configured to send within minutes of acceptance.
## Compatible subscription platforms
When the replacement is a subscription, Replacement Upsell works with any subscription app that uses Shopify's native Subscription API. Aftersell does not call provider APIs directly for this flow, the subscription is created by Shopify and your subscription app picks it up via its own Shopify integration.
Compatible providers include Recharge, Skio, Loop, Stay.ai, Appstle, Smartrr, Bold Subscriptions (when running on Shopify's native subscriptions API), and Shopify's native selling plans.
If your replacement target has a prepaid subscription plan configured (for example, every 3 months charged upfront), confirm with your subscription provider that prepaid is supported as a replacement destination. Some providers, notably Loop, have limited prepaid handling.
## Payment method requirements
Aftersell explicitly blocks Replacement Upsell on some payment gateways because they cannot reliably support the refund-and-recharge pattern in the post-purchase window:
* **Authorize.net** (`authorize_net`). Authorize.net requires transactions to settle before refunds can be issued, and settlement has a delay, so Aftersell cannot reliably refund the original and add the replacement on the same Shopify order. If Authorize.net is your payment processor, route those customers to Thank-You-page offers instead.
* **Manual payment gateways** (`manual`). This covers cash on delivery, custom payment methods, draft-order checkouts, and any other manual payment processor that does not capture a vaulted authorization. Replacement Upsell needs an active vaulted payment to issue a follow-up charge, which manual gateways do not provide.
When the order's payment gateway is one of these, Replacement Upsell silently skips the offer. The skip reason surfaces in the Aftersell order browser as **"Payment gateway does not support replacement upsells."**
For the broader list of payment methods that affect all Aftersell post-purchase offers (not just Replacement Upsell), see [Payment Methods](/aftersell/payment_methods).
## Creating a Replacement Upsell offer
To create a Replacement Upsell:
1. In your Aftersell dashboard, go to **Post-purchase Upsells**.
2. Open an existing funnel or click **Add Funnel**.
3. Add an upsell offer and configure it.
The configuration lives inside a standard post-purchase offer, with Replacement Upsell controls surfacing when you enable them.
A Replacement Upsell offer has three separate product selections, and they need to be configured consistently for the replacement to fire:
* **Funnel trigger.** Set at the funnel level. Determines which orders see the offer.
* **Upsell product.** Set in the offer's Upsell Products section. The product that gets added to the order when the customer accepts.
* **Product to replace.** Set inside the **Replace item in original order with upsell** section, by clicking the **Edit product to replace** button. The exact product and variant in the customer's cart that will be refunded and removed.
If the **Product to replace** does not match the variant the customer actually purchased, Aftersell cannot find a matching line item to remove, and the replacement silently does not fire.
### Step 1: Configure the funnel trigger
The trigger determines which orders see the offer:
* **Product trigger.** Set to the one-time product you want to replace. Without this, the offer can fire on unrelated orders.
* **Subscription trigger.** Set to **do not include a subscription**. This ensures the offer only shows to customers whose orders do not already contain a subscription (which would block the replacement).
All enabled triggers use AND logic. Every condition must be met.
### Step 2: Pick the upsell product
In the offer editor:
1. Click **Add Upsell** and search for the product the customer should receive instead.
2. If the replacement is a subscription, select **Subscription only** as the purchase option and pick the selling plan.
3. If the replacement is a one-time purchase, select **One-time purchase only**.
4. If you are doing a variant or quantity swap of the same product, pick the same product and adjust the variant or quantity controls.
### Step 3: Enable Replacement Upsell
In the offer's advanced settings, enable **Replace item in original order with upsell**. This is the toggle that turns a standard upsell into a Replacement Upsell.
When this is enabled, you can also configure:
* **Allow replacement when target has a discount.** When off (default), Replacement Upsell will skip orders where the trigger line carries an order-level discount. When on, the replacement still fires, but the discount on the original line is refunded with the original (it does not carry to the replacement). See [Discount handling](#discount-handling).
* **Override quantity.** Set a specific quantity for the replacement line item. Useful when swapping a single unit for a multi-pack.
### Step 4: Set the product to replace
Click **Edit product to replace** and pick the exact product and variant that should be removed from the customer's order when the offer is accepted. This must match what the customer actually has in their cart.
For variant swaps of the same product (Small → Large), the **Product to replace** must point to the Small variant specifically. If you point it to Large or to any variant the customer did not buy, the offer will skip with no error.
### Step 5: Add optional discount
If the replacement is a subscription, you can apply a first-cycle discount to make the offer more attractive. The discount applies to the first billing cycle of the new subscription, future renewals charge at the regular subscription price.
For one-time replacements, the discount applies to the one-time charge on this order.
### Step 6: Customize the offer copy
Make the refund-and-replace mechanic explicit in the offer copy. Recommended elements:
* Title: clearly describes the swap (for example, "Upgrade to the 3-pack and save").
* Description: explain that the original is refunded and the replacement is charged.
* Accept button: defaults to showing the net price, customize to "Switch to subscription" or "Upgrade my order" if you want a verb-based CTA.
## Discount handling
Replacement Upsell has specific behaviour around discounts that catches partners off guard.
### Discounts on the original line do not carry to the replacement
When Aftersell refunds the original line item, any discount that was applied to it goes with it. The replacement line is charged at the full price (or at your replacement-offer discount, if you configured one), but the customer's original discount does not transfer.
If you want the customer to keep an equivalent discount, configure it on the replacement offer directly.
### Allow replacement when target has a discount
By default, Replacement Upsell **skips** the offer if the trigger line carries an order-level discount. This is a protective default to avoid refund-amount mismatches.
To allow the offer to fire even when the trigger has a discount, enable the **Allow replacement when target has a discount** toggle in the offer's advanced settings. When enabled, the refund covers the discounted price (not the full price), and the replacement is charged according to your offer configuration.
### First-cycle discount on subscription replacements
When the replacement is a subscription, the discount you configure on the offer applies to the **first billing cycle only**. Future recurring orders charge at the regular subscription price. The customer sees the recurring price under **Recurring subtotal** in the offer.
## Analytics and reporting
Refunds generated by a Replacement Upsell carry the note **"Aftersell Post-Purchase Replacement Upsell"** in Shopify, which makes replacement-related refunds easy to identify.
Aftersell analytics do **not** subtract the refunded amount from the upsell value. Replacing a $100 product with a $200 product is reported as a $200 upsell, not a $100 net.
## Worked examples
Three common Replacement Upsell scenarios, with the exact configuration and what the customer experiences.
### Scenario 1: One-time bottle to monthly subscription of the same product
**Setup.** Your customer bought a one-time bottle of supplement at $40. You want to offer them a monthly subscription of the same bottle at $36 per month, with a 15% first-cycle discount.
**What you set in the offer:**
* Funnel trigger: Product is the one-time bottle.
* Upsell product: the same bottle, monthly selling plan.
* Purchase option: Subscription only.
* First-cycle discount: 15%.
* Product to replace: the one-time bottle (same variant the customer purchased).
**What the customer sees in the offer:**
* Accept Offer button: "Add $0.60 to your order" (net difference between $40 one-time and $30.60 first-cycle subscription after 15% off $36).
* Recurring subtotal: \$36.00 every 30 days.
**On accept:**
* Original \$40 one-time bottle is refunded.
* A new subscription line is added at \$30.60 for the first cycle.
* A monthly subscription is created in your subscription app at \$36 base price.
* The next charge happens in 30 days at \$36.
**Customer statement:** one $40 refund, one $30.60 charge. Net: customer paid $30.60 for this delivery, will pay $36 every 30 days going forward.
### Scenario 2: Single bottle to 3-pack of the same product
**Setup.** Your customer bought one $30 bottle. You want to offer them a 3-pack at $75 (vs \$90 if bought individually).
**What you set in the offer:**
* Funnel trigger: Product is the single bottle.
* Upsell product: same product.
* Override quantity: 3.
* Purchase option: One-time purchase only.
* Product to replace: the single bottle (same variant).
**What the customer sees in the offer:**
* Accept Offer button: "Add $45.00 to your order" (net difference between $30 and \$75).
**On accept:**
* Original \$30 bottle is refunded.
* 3 bottles are added at \$75 total.
* Customer pays the net \$45 on this Shopify order.
### Scenario 3: One-time product to a different subscription product
**Setup.** Your customer bought a one-time $25 starter kit. You want to offer them a monthly subscription to your premium product line at $50 per month.
**What you set in the offer:**
* Funnel trigger: Product is the starter kit.
* Upsell product: the premium product.
* Purchase option: Subscription only.
* Selling plan: Monthly, \$50.
* Product to replace: the starter kit (same variant).
**What the customer sees in the offer:**
* Accept Offer button: "Add $25.00 to your order" (net difference between $25 and \$50).
* Recurring subtotal: \$50.00 every 30 days.
**On accept:**
* Original \$25 starter kit is refunded.
* New subscription line is added at \$50.
* Monthly subscription created in your subscription app at \$50.
* Customer pays \$25 net on this Shopify order.
## Per-variant funnels
A single Replacement Upsell offer targets one specific product and variant on each side. If your subscription plans differ per variant (different sizes, flavours, or prices), you cannot configure one offer that says "swap whichever variant the customer bought to its matching subscription variant." Each variant pairing needs its own funnel.
For example, if you sell a serum in three sizes (Small / Medium / Large) and want each one to swap to its subscription counterpart, you would build three funnels:
* Funnel 1: trigger = Small one-time, replacement = Small subscription.
* Funnel 2: trigger = Medium one-time, replacement = Medium subscription.
* Funnel 3: trigger = Large one-time, replacement = Large subscription.
Aftersell does not currently include a built-in variant pairing feature, so each variant pair needs its own funnel.
## Testing a Replacement Upsell
Before going live:
Place a real low-price test order with the one-time product as the trigger. Do not rely on Preview Mode for this step. Preview Mode renders the funnel visually and lets you click through Accept and Decline, but it is sandboxed: no order is created, no refund is applied, no subscription is created, no charges happen, and no emails or webhooks fire. Use Preview Mode for layout and copy review, and a real test order for end-to-end verification.
After checkout, the post-purchase offer will appear. Accept the Replacement Upsell to trigger the real changeset.
In **Shopify Admin → Orders**, find the test order. You should see the original line item with a refund applied, and the replacement line item added.
On a real card, verify that both transactions (the refund of the original and the charge for the replacement) post correctly. The net should match the displayed Accept Offer button.
Find the customer's new subscription in your provider's dashboard. Confirm the cadence, the next charge date, and the product. There is no automatic retry on Aftersell's side if enrollment fails, contact your subscription provider's support if the subscription is missing.
## Beta failsafe
While Replacement Upsell is in Beta, Aftersell tracks errors on each offer and stops showing the offer to new customers once the error count crosses a threshold. This protects you from a widespread misconfiguration silently impacting many customers.
### Configuring the failsafe threshold
The failsafe threshold is configurable in **Settings → Replacement Upsells**. It counts replacement errors over a **rolling 7-day window** and pauses replacement upsells once your chosen threshold is reached within that window. You can pick from:
* **Stop on any issue in the past 7 days** (recommended — this is the default). The offer stops as soon as the first replacement fails within the rolling window.
* **Stop after 3 issues in the past 7 days**.
* **Stop after 5 issues in the past 7 days**.
* **Stop after 7 issues in the past 7 days** (most permissive).
* **Custom…** — reveals a number field where you can enter any whole number from **1 to 100**. Use this if your store processes high order volumes and the presets trip too quickly.
Pick a higher threshold if you are confident in the offer's configuration and want to absorb a few transient Shopify or subscription-provider errors without disabling the offer. Pick a lower threshold if customer-facing failures are high-cost for your store.
### What trips the failsafe
Any exception in the replacement flow counts as an error within the rolling 7-day window. The most common causes:
* Shopify rejects the changeset because the checkout has already completed.
* The replacement product was deleted or unpublished between offer setup and the customer accepting.
* The selling plan on a subscription replacement was deactivated.
* A transient Shopify API or subscription-provider outage.
### When the failsafe trips
When the error count within the rolling 7-day window reaches your threshold, the offer **stops being shown** to new customers. You'll know in two places:
* **Home page banner.** A warning banner titled **"Replacement upsells are paused"** appears on your Aftersell home page, with a **Review failsafe** button linking to **Settings → Replacement Upsells**.
* **Failsafe status card** (Settings → Replacement Upsells). A status card shows a **Failsafe tripped** (amber) or **Not tripped** (green) badge, plus your current rolling count and threshold — for example, "4 of 5 errors in the past 7 days".
Because the failsafe uses a rolling 7-day window, it **self-heals**: once the error count drops below your threshold, replacement upsells resume automatically — no action required.
### How to reset
You can reset the failsafe yourself from **Settings → Replacement Upsells**. Once you've resolved the underlying issue, click **Reset failsafe** and confirm in the modal — the rolling error count clears immediately and replacement upsells resume for new orders. (The button is disabled when your current error count is already zero.)
Only reset after fixing the root cause, otherwise the failsafe will trip again once the threshold is reached. If you're unsure what caused the errors, contact support via the in-app chat before resetting.
## Troubleshooting
Replacement Upsell is a Beta feature that requires manual enablement by Aftersell support. Contact support via the in-app chat to request access. Once enabled, the **Replace item in original order with upsell** toggle will appear in the offer's advanced settings.
Three causes:
* **Funnel trigger mismatch.** Confirm the trigger product is the same product that is in the test order's cart.
* **Order already contains a subscription.** Replacement Upsell skips any order where the trigger line is a subscription. Use Subscription Upgrade instead in that case.
* **Original line has a discount.** By default, Replacement Upsell skips lines with an order-level discount. Enable **Allow replacement when target has a discount** in the offer's advanced settings.
A Replacement Upsell offer has three separate product selections in the editor, and they need to be configured consistently for the replacement to fire:
1. **Funnel trigger.** Set at the funnel level. Determines which orders see the offer.
2. **Upsell product.** Set in the offer's Upsell Products section. The product that gets added to the order when the customer accepts.
3. **Edit product to replace.** Set inside the **Replace item in original order with upsell** section, by clicking the **Edit product to replace** button. This is the exact product and variant in the customer's cart that will be refunded and removed.
The most common configuration mistake: the **product to replace** does not match the variant that is actually in the customer's cart. When that happens, Aftersell cannot find a matching line item to remove, and the replacement silently does not fire.
To fix:
* Open the Replacement Upsell offer.
* Click **Edit product to replace** and confirm the selected product and variant **exactly match** the product+variant the customer should have purchased (per the funnel trigger).
* If you are swapping between variants of the same product (Small → Large), the "product to replace" must point to the Small variant specifically. If you point it to Large or to any variant the customer did not buy, the offer will skip.
* Save and test with a real low-price order that includes the exact variant you want to swap from.
This is the expected behaviour. The original line is refunded and the replacement is charged, so the customer's bank statement shows two transactions even though the net amount is the displayed offer price. To reduce confusion:
* Add a sentence to the offer copy explaining the refund-and-replace mechanic.
* Enable Aftersell's automatic refund-notification email for replacement upsells.
* Train your support team to explain the two-line-entry pattern when a customer reaches out.
Some payment gateways (including Authorize.net and others that batch-settle transactions on a delay) do not permit refunds until the original transaction has settled. Because a Replacement Upsell charges the replacement and refunds the original immediately after checkout, the refund step can fail with the error "Partial refunds are not allowed until the transaction is settled. Please try again later." Aftersell does not automatically retry the refund after settlement, so you will need to issue the refund manually from the Shopify order once the original transaction settles (typically within 24 hours, depending on your gateway's settlement schedule). To avoid this scenario, Replacement Upsell is skipped entirely for known unsupported gateways. If you keep seeing it on a supported gateway, contact support so we can investigate.
When Aftersell refunds the original line item, any discount applied to it goes with the refund. The replacement line is charged separately. If you want the customer to retain the discount, configure it on the replacement offer directly using the offer's discount field.
No. If the original line item in the order is already a subscription, Replacement Upsell will not fire. This is because removing the subscription line item does not cancel the subscription contract in your subscription app, the customer would still be billed and also receive the replacement. To modify an existing subscription (change frequency, swap product, or both), use [Subscription Upgrade](/aftersell/subscription-upgrades) instead.
Replacement Upsell tracks errors per offer over a rolling 7-day window and stops showing the offer once the error count crosses your configured threshold in **Settings → Replacement Upsells** (default: stop on any issue in the past 7 days). When the failsafe trips, a **"Replacement upsells are paused"** banner appears on your Aftersell home page with a **Review failsafe** link to **Settings → Replacement Upsells**, where a status card shows your current error count and whether the failsafe is tripped.
If errors are no longer occurring, the offer resumes automatically once the rolling 7-day count drops below the threshold. To resume immediately after fixing the issue, click **Reset failsafe** on that settings page. If you're unsure of the root cause, contact support via the in-app chat.
The offer card uses the variant-specific image when one is tagged on the variant in Shopify. If the variant has no image tagged, the offer card falls back to the parent product's first image. If you are swapping between variants of the same product and the image is not changing, confirm that each variant has its own image set up in Shopify.
Build one funnel per variant. Each funnel has a product+variant trigger and a corresponding replacement product+variant. Aftersell does not currently include a built-in variant pairing feature.
Same failure mode as Subscription Upsell: most often a selling plan was deactivated between the offer rendering and the customer accepting. Shopify accepts the changeset but no subscription is enrolled downstream. Confirm the selling plan is still active in Shopify and assigned to the replacement product. Check your subscription app's order import or webhook logs for the affected order. If the subscription is missing, your subscription app's support team can usually manually enroll the customer.
Aftersell does not manage subscription cancellation. Cancellation of future cycles happens in your subscription provider's customer portal or by the customer themselves. The Shopify refund mechanism for the first cycle works the same as any other line item.
This is expected. Authorize.net is explicitly blocked from Replacement Upsell in Aftersell's code because it requires transactions to settle before refunds can be issued, and settlement has a delay that breaks the refund-and-recharge pattern Replacement Upsell relies on. Run Thank-You-page offers for Authorize.net customers as an alternative. You can confirm this is the cause by opening the order in the Aftersell order browser, the skip reason will read "Payment gateway does not support replacement upsells."
Manual payment gateways (cash on delivery, custom payment methods, draft-order checkouts) are explicitly blocked from Replacement Upsell because they do not vault a card for follow-up charges. The order browser will show "Payment gateway does not support replacement upsells" as the skip reason. For broader payment-method limitations on post-purchase offers, see [Payment Methods](/aftersell/payment_methods).
# Manage reports
Source: https://docs.aftersell.com/aftersell/reports_dashboards
Create and manage custom analytics reports in Aftersell's Reports section.
The Reports section lets you build custom reports from saved queries, giving you a flexible view of your store's analytics beyond the standard Analytics tabs.
***
## Navigating your reports
When you open the Reports section, you land on the **Reports** table. This table lists every report available to your store, including default reports (provided by Aftersell) and any reports you have created.
Each row in the table shows:
* **Name** — the report name
* **Type** — either **Default** (a report provided by Aftersell) or **Custom** (a report you created)
* **Last updated** — the date and time the report was last modified
* **Delete** — available on your own (Custom) reports only; Default reports cannot be deleted
Click any row to open that report.
***
## Creating a report
To create a new report, click **Create report** in the top-right corner of the Reports table. This immediately creates a new blank report named `Untitled report N` and opens it in edit mode so you can start adding widgets right away.
If you have no reports yet, the same **Create report** button appears in the empty state.
***
## Report controls
Three controls apply to every widget on the report at once, so all cards stay in sync. By default, each control is set to **Chart Default**, which inherits the date range, comparison, and timezone of widgets added to the report.
* **Date Range** — set the period you want to see.
* **Comparisons** — compare the selected period against another, such as the previous period or the previous year.
* **Time Zone** — set the timezone used for dates and time-based grouping.
***
## Renaming a report
You can rename any report you created (Custom reports only — Default reports cannot be renamed).
1. Open the report by clicking its row in the Reports table.
2. Click **Edit report**. A **pencil icon** appears next to the report title in the header.
3. Click the pencil icon, type the new name, and press **Enter**, or click away to save.
***
## Editing a report
To add or rearrange widgets on a report you own:
1. Open the report.
2. Click **Edit report** in the header.
3. In edit mode, a **Widgets** panel appears on the left. Drag a saved query from the panel onto the grid to add it as a widget.
4. You can also click **Add widget** to build a new query in the Explorer and add it to the report.
5. When you are done, click **Save** to keep your changes, or **Cancel** to discard them.
Default reports (Type: Default) are read-only and cannot be edited.
***
## Widgets
Each item on a report is a **widget** — a saved query rendered as a visualization. For adding, configuring, and arranging widgets, see [Manage widgets](/aftersell/reports_widgets).
***
## Sharing a report
When viewing a report, click the **Share** button in the header to generate a shareable link. The recipient opens the report in fullscreen view. The link can only be opened by users authenticated to your Shopify store.
***
**Need help?** Contact the Aftersell support team through your report.
# Explorer
Source: https://docs.aftersell.com/aftersell/reports_explorer
Build custom analytics queries and reports using the Explorer in Aftersell.
The Explorer lets you build custom analytics queries using a flexible query builder (AftersellQL). You can select metrics, group results by dimensions, apply filters, and visualize data in charts or tables. Saved queries can be added to reports as widgets for ongoing monitoring.
You build queries visually with menus — no syntax required. If you prefer to type queries directly, the Explorer also exposes the underlying AftersellQL text. See [Writing AQL queries](#writing-aql-queries) below for the syntax reference.
***
## Available metrics
These are the metrics you can pick in the Explorer, grouped the same way the metric picker groups them.
### Revenue & profit
| Metric | Description |
| ---------------------------- | ------------------------------------------------------------------------------------- |
| **Revenue** | Upsell revenue in your store's native currency. |
| **Revenue (USD)** | Upsell revenue normalized to USD for cross-currency comparisons. |
| **Revenue Per Visit** | Upsell revenue per impression session. Cannot be broken down by product or placement. |
| **Avg. Conversion Value** | Revenue per accepted offer. Also referred to as Average Upsell Value. |
| **Upsell Revenue Per Order** | Upsell revenue (USD) divided by total orders. Store-level only. |
### Conversions
| Metric | Description |
| ---------------- | ------------------------------------------------------------------------ |
| **Conversions** | Unique sessions that accepted an offer. |
| **Accept Rate** | Conversions divided by impressions. |
| **Units Sold** | Total units sold through upsell offers. |
| **Decline Rate** | Percent of post-purchase offers explicitly declined. Post-purchase only. |
### Engagement
| Metric | Description |
| --------------- | ---------------------------------------------------- |
| **Impressions** | Unique sessions that saw an offer. |
| **Show Rate** | Percent of decisions that resulted in an impression. |
### Store performance
| Metric | Description |
| ----------------------------- | -------------------------------------------------------------------------------------------------------------------- |
| **Total Store Revenue** | Total Shopify-paid order revenue. Store-level only — cannot be broken down by surface, funnel, placement, or device. |
| **Orders** | Total Shopify-paid orders. Store-level only. |
| **Average Total Order Value** | Store revenue divided by orders. Store-level average order value. |
### Rokt network
| Metric | Description |
| ------------------------------ | ---------------------------------------------------------------------------------------------------- |
| **Rokt Revenue** | Rokt-network revenue attributed to your store. |
| **Rokt Transactions** | Rokt-network transaction count for your store. |
| **Rokt Revenue / Transaction** | Rokt revenue divided by transactions per time bucket. |
| **Rokt Impressions** | Total Rokt-network impressions across your store's placements. Distinct from upsell **Impressions**. |
| **Rokt Referrals** | Rokt-network referrals — positive engagements that sent the shopper to a Rokt partner. |
***
## Dimensions
Dimensions let you break down metrics by a specific attribute. Not all dimensions are compatible with every metric.
Some dimension and metric combinations are incompatible. For example, **Decline rate** and **Show rate** cannot be broken down by **Currency**. The Explorer automatically prevents incompatible combinations.
### Available dimensions
| Dimension | Description |
| ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Date** | Groups results by day, week, or month. |
| **Surface** | The upsell surface (for example, post-purchase, checkout, product page). |
| **Funnel** | The specific funnel the offer belongs to. |
| **Product** | The upselled product. |
| **Placement** | The placement within a funnel. |
| **Device** | The device type (desktop or mobile). |
| **Scope** | The decision scope (Flow, Experience, Placement, or ItemSlot). |
| **Currency** | The ISO currency code (for example, USD, EUR, GBP). Useful for multi-currency stores. Compatible with store-level metrics and most upsell metrics. |
### Unavailable dimensions
The following dimensions are a work in progress. They appear in the picker but are not yet available as a breakdown. Instead, they show as 'Not compatible' for every metric. **This document will be updated when these dimensions are fully implemented.**
| Dimension | Description |
| ----------------- | -------------------------------------------------------------- |
| **Flow type** | The type of upsell flow. |
| **Experiment** | The A/B test or experiment variant. |
| **Outcome** | The decision outcome (for example, eligible, out of stock). |
| **Reason code** | The reason for a decision outcome. |
| **Scope** | The decision scope (Flow, Experience, Placement, or ItemSlot). |
| **Response type** | The offer response (Accepted, Declined, or Timeout). |
***
## Writing AQL queries
Every query you build in the Explorer is an **AftersellQL (AQL)** statement. Most of the time you build queries visually — picking metrics, dimensions, filters, and a date range from menus — and never need to write AQL by hand.
For power users, the Explorer also exposes the underlying query as editable text. This section is the reference for that text form: what the clauses mean, what values they accept, and a few ready-to-use examples.
### How an AQL statement reads
An AQL statement is a single question made of clauses. Only `SELECT` and a time range (`SINCE`) are required; everything else is optional. When you include optional clauses, they must appear in the order shown below.
```text theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
SELECT -- what to measure (required)
WHERE -- narrow the data
GROUP BY -- break the numbers down
SINCE