> ## Documentation Index
> Fetch the complete documentation index at: https://docs.revize.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Post-purchase Upsells

> Create targeted Shopify post-purchase upsell offers on the Thank-you and Order-status pages. Choose products, discounts, layouts, countdowns, schedules, and measure captured revenue.

<Note>
  Post-purchase Upsells let customers add multiple products to an order they have already placed. Revize adds them to the **same Shopify order**, Shopify collects only the difference, and everything ships together.
</Note>

<img src="https://mintcdn.com/revize/Lu634tjsm_5CaSWM/images/features/upsell-offer.png?fit=max&auto=format&n=Lu634tjsm_5CaSWM&q=85&s=8e6cf0194dfd6babaa8a329255b954f2" alt="Post-purchase upsell offer with discounted product cards and an order-editing countdown" style={{ borderRadius: "12px", width: "100%", boxShadow: "0 4px 14px rgba(0,0,0,0.08)" }} title="A post-purchase upsell as customers see it on the order-status page" width="1536" height="1024" data-path="images/features/upsell-offer.png" />

## Three ways customers can add products

Revize gives you three product-addition experiences. They work together, but they solve different jobs.

<CardGroup cols={3}>
  <Card title="Upsell offers" icon="wand-magic-sparkles" color="#8b5cf6">
    **You are here.** Proactively recommend products on the Thank-you and Order-status pages. You control the audience, product source, discount, layout, timing, and priority.
  </Card>

  <Card title="Add products" icon="cart-plus" color="#10b981" href="/features/add-products-upsell">
    Let customers open the Revize Customer Portal and search or browse products when they already know what they want to add.
  </Card>

  <Card title="Email upsells" icon="envelope" color="#f59e0b" href="/integrations#how-email-upsells-work">
    Put one-click Add to Order links in your post-purchase email and SMS flows.
  </Card>
</CardGroup>

This guide focuses on **Upsell offers**, the rule-driven offer engine available on the **Pro plan**.

## How the customer flow works

<Steps>
  <Step title="Revize shows the first matching offer">
    When a customer opens the Thank-you or Order-status page, Revize checks your active offers from top to bottom and shows the first one whose conditions match the order.
  </Step>

  <Step title="The customer chooses a product">
    The offer displays products in your selected layout, with the discount, countdown, variants, quantity, and **Add to order** button.
  </Step>

  <Step title="Revize edits the existing order">
    The selected item is added through Shopify order editing. There is no second cart and no separate order.
  </Step>

  <Step title="Shopify collects the difference">
    Shopify recalculates the amount due and handles the additional payment. The added item stays on fulfillment hold until payment is captured, except for cash-on-delivery orders.
  </Step>
</Steps>

<Info>
  Payment always stays in Shopify's native flow. After the item is added, Shopify recalculates the amount due and lets the customer review and pay for the updated order. Revize does not create a side checkout or send a manual invoice for the upsell.
</Info>

## Create an upsell offer

Open **Upsell** in the Revize app and click **Create offer**. New offers start as **Draft**, so nothing appears to customers until you set the status to **Active** and save.

<img src="https://mintcdn.com/revize/Lu634tjsm_5CaSWM/images/features/upsell-offer-builder.png?fit=max&auto=format&n=Lu634tjsm_5CaSWM&q=85&s=d5a266cce1202be5818ebd53959526b3" alt="Revize upsell offer builder showing product sources, discount, countdown, page placement, and live preview" style={{ borderRadius: "12px", width: "100%", boxShadow: "0 4px 14px rgba(0,0,0,0.08)" }} title="Choose a product source and configure the offer with a live preview" width="1536" height="1024" data-path="images/features/upsell-offer-builder.png" />

<Steps>
  <Step title="Name the offer and choose its surfaces">
    Give the offer an internal name, then show it on the **Thank-you page**, **Order-status page**, or both.
  </Step>

  <Step title="Add trigger conditions">
    Target specific orders or customers. Leave the conditions empty to show the offer on every eligible order.
  </Step>

  <Step title="Choose the products">
    Pick one of the six product sources below, then set fallbacks and inventory safety.
  </Step>

  <Step title="Configure the incentive and design">
    Add an optional discount, choose a layout, customize the copy, and enable an honest countdown tied to the order-editing deadline.
  </Step>

  <Step title="Schedule and activate">
    Set a start and end date if needed, choose how often the offer can be accepted, change the status to **Active**, and save.
  </Step>
</Steps>

## Choose what to recommend

<CardGroup cols={3}>
  <Card title="Manual picks" icon="hand-pointer" color="#6366F1">
    Hand-pick the exact products you want to show.
  </Card>

  <Card title="Collection" icon="layer-group" color="#8b5cf6">
    Pull products from a Shopify collection.
  </Card>

  <Card title="Related products" icon="sparkles" color="#0ea5e9">
    Use Shopify recommendations to show products similar to what is already in the order.
  </Card>

  <Card title="Complementary" icon="puzzle-piece" color="#14b8a6">
    Show products that go well with the order, including relationships configured in Shopify Search & Discovery.
  </Card>

  <Card title="Bestsellers" icon="arrow-trend-up" color="#f59e0b">
    Recommend in-stock top sellers automatically.
  </Card>

  <Card title="Recently viewed" icon="clock-rotate-left" color="#ec4899">
    Show products the customer browsed but did not buy, powered by Revize's consent-aware web pixel.
  </Card>
</CardGroup>

### Product safeguards

<AccordionGroup>
  <Accordion title="Fallback when the source returns nothing" icon="rotate">
    Turn on **Fall back to bestsellers** to keep the offer visible when the selected source has no eligible products.

    Recently viewed offers can also fall back to related products when the shopper has no browse history.
  </Accordion>

  <Accordion title="Inventory safety" icon="boxes-stacked">
    Choose one of three inventory rules:

    * Skip products that are out of stock
    * Skip products with fewer than 5 units in stock
    * Show products regardless of stock
  </Accordion>

  <Accordion title="Hide products already purchased" icon="eye-slash">
    Enable **Hide products already in the order** when you never want to recommend an item the customer just bought.
  </Accordion>
</AccordionGroup>

## Target the right orders

With no conditions, the offer is eligible for every order. Add conditions when the offer should appear only for a particular order or customer segment.

| Condition                  | Example                                                       |
| -------------------------- | ------------------------------------------------------------- |
| **Order tags**             | Show a wholesale add-on only when the order has `b2b`         |
| **Order total**            | Show a premium accessory above \$100                          |
| **Item count**             | Show a small add-on for one-item orders                       |
| **Order contains product** | Recommend refills when the starter kit is present             |
| **Payment method**         | Create different offers for prepaid and manual payment orders |
| **Shipping country**       | Limit an offer to countries you can fulfill quickly           |
| **Customer tags**          | Give VIP or wholesale customers a dedicated offer             |
| **First-time buyer**       | Introduce a popular add-on after the first purchase           |
| **Returning customer**     | Show a loyalty-focused offer                                  |
| **Lifetime spend**         | Reserve a premium offer for high-value customers              |
| **Order placed during**    | Run an offer only during selected hours                       |

Conditions sit inside groups with **ALL** or **ANY** matching. Groups can also be combined with ALL or ANY, so you can express logic such as:

`(VIP customer) OR (order total above 150 AND shipping country is US)`

<Note>
  Revize re-checks the conditions on the server when the customer accepts the offer. An outdated page cannot bypass your targeting rules.
</Note>

## Add a per-offer discount

Turn on **Discount** inside the offer builder, then choose:

* **Percentage** or **fixed amount**
* The discount value
* A discount label shown on the Shopify order line
* **Show strikethrough pricing** to display the original price beside the offer price
* **Exclude upsell from order discounts** when the upsell line should receive only its own offer discount

The offer discount is committed with the order edit. It is not stacked on top of a second copy of the same discount.

## Choose a layout

<CardGroup cols={2}>
  <Card title="List" icon="list" color="#6366F1">
    <div style={{ minHeight: "96px" }}>
      Full-width rows with room for product details.
    </div>
  </Card>

  <Card title="Slider" icon="arrows-left-right" color="#8b5cf6">
    <div style={{ minHeight: "96px" }}>
      Swipeable product cards, useful when you want to show several choices without a long page.
    </div>
  </Card>

  <Card title="Grid" icon="grid-2" color="#10b981">
    <div style={{ minHeight: "96px" }}>
      Compact rows and columns, with 2, 3, or 4 products per row on larger screens.
    </div>
  </Card>

  <Card title="Spotlight" icon="star" color="#f59e0b">
    <div style={{ minHeight: "96px" }}>
      One hero product with maximum visual emphasis.
    </div>
  </Card>
</CardGroup>

You can also set the number of visible cards, maximum products, button style, image shape, image fit, and whether product descriptions appear.

### Customize the copy

Edit the **Heading**, **Subheading**, and **Button text** per offer. Leave them blank to use Revize's built-in translated defaults.

Two dynamic tokens are available:

* `[discount]` inserts the offer discount, such as `20%`
* `[duration]` inserts the remaining offer time

Colors and fonts inherit the store's Shopify checkout branding automatically.

## Use an honest countdown

The countdown is optional and configured per offer.

<Tabs>
  <Tab title="Order editing deadline">
    Counts down to the real moment the order locks for editing. This is the recommended mode because the urgency matches the customer's actual last chance to add an item.
  </Tab>

  <Tab title="Custom countdown">
    Starts a fixed duration when the customer first sees the offer. A custom countdown never runs past the real order-editing deadline.
  </Tab>
</Tabs>

Place the timer beside or below the heading, then choose **Boxed digits**, **Pill**, or **Plain text**.

## Control placement

<img src="https://mintcdn.com/revize/Lu634tjsm_5CaSWM/images/setup/upsell-settings.png?fit=max&auto=format&n=Lu634tjsm_5CaSWM&q=85&s=8804df05f15b3169bac85f767700878e" alt="Revize upsell settings with expandable, card, and standalone order-status placements plus product image and recently viewed controls" style={{ borderRadius: "12px", width: "100%", boxShadow: "0 4px 14px rgba(0,0,0,0.08)" }} title="Order-status placement and recently viewed tracking settings" width="1536" height="1024" data-path="images/setup/upsell-settings.png" />

On the Order-status page, choose one of three placements. The placement changes both the layout and what happens after the customer accepts an offer.

<AccordionGroup>
  <Accordion title="Card above or below the editor (recommended)" icon="rectangle-list">
    Show the offer as a highlighted card attached to the Revize order editor. You can place it above or below the editor. Because it shares the editor's add-product flow, the order updates instantly without refreshing the page.
  </Accordion>

  <Accordion title="Expandable section in the editor" icon="chevron-down">
    Show the same editor-attached experience inside a compact **Offers for you** accordion. Customers expand the section and add a product without leaving or refreshing the page.
  </Accordion>

  <Accordion title="Standalone block" icon="square">
    Add an isolated upsell block anywhere on the Order-status page through Shopify's **Add blocks** editor. After a customer accepts an offer, this block refreshes the page so Shopify can load the updated order. That refresh is expected for the standalone surface.
  </Accordion>
</AccordionGroup>

The Thank-you page always uses the standalone block.

<Info>
  If you select **Card above or below the editor** or **Expandable section**, you do not need a separate Upsell app block on the Order-status page. The normal Revize Customer Portal block is enough. Add the separate block only for the **Standalone block** placement or the Thank-you page.
</Info>

## Recommend recently viewed products

Recently viewed offers turn a shopper's own browsing history into a highly relevant follow-up. Instead of showing a generic bestseller, Revize can surface the exact products the customer viewed but did not purchase while the original order is still open for editing.

<img src="https://mintcdn.com/revize/Lu634tjsm_5CaSWM/images/features/recently-viewed-upsells.png?fit=max&auto=format&n=Lu634tjsm_5CaSWM&q=85&s=ac578e41eedd8f4f1f1b5eb9f09dccb6" alt="A consent-aware Revize web pixel connecting recently viewed products to a personalized post-purchase offer" style={{ borderRadius: "12px", width: "100%", boxShadow: "0 4px 14px rgba(0,0,0,0.08)" }} title="Recently viewed products become personalized post-purchase recommendations" width="1536" height="1024" data-path="images/features/recently-viewed-upsells.png" />

Open **Upsell → Settings** and enable **Recently viewed tracking**. Revize adds a lightweight Shopify web pixel that:

1. Records product-view events only when the customer's analytics consent allows it
2. Connects that browsing session to the customer's checkout
3. Makes eligible viewed products available to the **Recently viewed** source on the Thank-you and Order-status pages

This creates a natural second chance for products the customer was already considering, without requiring you to hand-pick recommendations for every order. If no eligible browse history is available, configure the offer to fall back to related products or show nothing.

<Note>
  Nothing is recorded until you enable the setting. The Upsell settings page also shows whether the web pixel is active.
</Note>

## Schedule and prioritize offers

* **Start:** immediately or on a chosen date
* **End:** never or on a chosen date
* **Priority:** drag offers into the order Revize should evaluate them
* **Accepts per order:** unlimited or once per order
* **Automatic states:** scheduled, active, and expired based on your dates

Revize evaluates active offers from top to bottom and shows the first matching one. Put the most specific offers above broad fallback offers.

## Measure captured upsell revenue

The Upsell dashboard reports:

<CardGroup cols={2}>
  <Card title="Impressions and conversion" icon="chart-line" color="#6366F1">
    See how many orders saw an offer, how many accepted, and the order-based conversion rate.
  </Card>

  <Card title="AOV uplift" icon="arrow-trend-up" color="#10b981">
    Measure the change in average order value from paid upsells.
  </Card>

  <Card title="Per-offer performance" icon="table-list" color="#8b5cf6">
    Compare individual offers and daily trends.
  </Card>

  <Card title="Top products" icon="ranking-star" color="#f59e0b">
    See the top five upsold products ranked by captured revenue.
  </Card>
</CardGroup>

<Check>
  **Revenue counts only captured sales.** An accepted offer that is never paid for, or an item that is removed before payment, contributes zero. Revize reconciles the result with Shopify before it appears as Upsell revenue.
</Check>

## Order tags

Revize applies tags that you can use in Shopify Flow, reporting, fulfillment rules, or your own integrations.

| Tag                       | Meaning                                       |
| ------------------------- | --------------------------------------------- |
| `revize:upsell`           | The order's net value increased after an edit |
| `revize:upsell_offer`     | A customer accepted an Upsell offer           |
| `revize:order_downgraded` | The order's net value decreased after an edit |

## Enable your first offer

<Steps>
  <Step title="Open Upsell">
    In the Revize app, go to **Upsell**.
  </Step>

  <Step title="Create the offer">
    Click **Create offer**, choose the surfaces, targeting, products, discount, design, countdown, and schedule.
  </Step>

  <Step title="Set the offer to Active">
    New offers are Draft. Change the status to **Active**, then save.
  </Step>

  <Step title="Check only the blocks your placement needs">
    Add the Revize Upsell block to the **Thank-you page** and to the Order-status page only when you selected **Standalone block**. For **Card above or below the editor** or **Expandable section**, the normal Revize Customer Portal block is enough. Do not add a second Upsell block.
  </Step>

  <Step title="Place a test order">
    Open the Thank-you and Order-status pages, confirm the right offer appears, add a product, and complete the Shopify payment flow.
  </Step>
</Steps>

<Tip>
  Start with one broad offer and a real order-editing deadline. Once you have conversion data, add more specific offers above it for VIPs, high-value orders, or particular products.
</Tip>

***

## Frequently asked questions

<AccordionGroup>
  <Accordion title="Does an upsell create a second order?" icon="circle-question">
    No. Revize adds the product to the customer's existing Shopify order through order editing.
  </Accordion>

  <Accordion title="Where does the customer pay?" icon="credit-card">
    Shopify handles the additional payment. After Revize adds the item, the customer reviews the updated order and pays the recalculated amount through Shopify.
  </Accordion>

  <Accordion title="What happens if the customer adds a product but never pays?" icon="clock">
    The added item stays on fulfillment hold and does not count as captured Upsell revenue. Enable [Reverse Unpaid Edits](/setup/reverse-unpaid-edits) under **Settings → General** when you want unpaid changes rolled back automatically after a grace window.
  </Accordion>

  <Accordion title="Can several offers be active at once?" icon="layer-group">
    Yes. Revize checks active offers in priority order and shows the first one whose conditions match. Drag offers to change their priority.
  </Accordion>

  <Accordion title="Can customers accept an offer more than once?" icon="repeat">
    You decide per offer. Choose **Unlimited** or **Once per order** under Advanced.
  </Accordion>

  <Accordion title="Are the offers translated?" icon="language">
    Built-in default copy is translated automatically. Custom Heading, Subheading, and Button text can be translated per offer from **Translations**.
  </Accordion>

  <Accordion title="Does the countdown create fake urgency?" icon="timer">
    The recommended mode counts down to the real order-editing deadline. A custom countdown is also capped by that deadline, so it never claims the offer lasts longer than the order can actually be edited.
  </Accordion>

  <Accordion title="Which plan includes Upsell offers?" icon="circle-dollar-to-slot">
    Upsell offers are available on the **Pro plan**. The customer-initiated Add products experience remains part of the Revize order-editing portal.
  </Accordion>
</AccordionGroup>

## Related Revize features

* [Add Products](/features/add-products-upsell): the customer-initiated flow inside the Revize Customer Portal
* [Customer Portal](/features/customer-portal): where customers manage the rest of their order
* [Reverse Unpaid Edits](/setup/reverse-unpaid-edits): automatically restore orders when customers do not pay for added cost
* [Product Variant & Quantity Edits](/features/product-quantity-edits): let customers adjust products already in the order
* [Order Editing Window](/setup/edit-window): controls the real deadline used by the Upsell countdown
* [Rules Engine](/setup/rules-engine): set different editing windows for different kinds of orders
* [Analytics](/features/analytics): measure the broader impact of post-purchase edits
