Skip to main content

Deduct On Order Placed (DOOP) Mode Explained

When a customer redeems points or credits for a discount code in Rivo, there are two possible behaviors for when those points are actually removed from their balance.

Written by James Dohm
Updated yesterday

Overview

When a customer redeems points or credits for a discount code in Rivo, there are two possible behaviors for when those points are actually removed from their balance.

In standard mode (the default), points are deducted the moment the discount code is generated, before the customer even uses it at checkout. In deduct on order placed (DOOP) mode, points remain in the customer's balance until the discount code is actually applied to a completed order. The deduction only happens after checkout.

DOOP is now channel-aware — you can choose exactly which redemption channels use deferred deduction and which use immediate deduction. For example, you can enable DOOP for checkout redemptions only, while storefront widget and API redemptions continue to deduct points immediately.

Tip: We recommend consulting your success manager before changing these settings on a live program, as the configuration may impact your customers' experience.

Settings & configuration

DOOP is configured in your Rivo app under Settings > Orders > "Deduct Earnings after Order Placed".

To access this page, open the Rivo app from your Shopify admin and navigate to Settings > Orders.

The settings include:

  • Master toggle ("Enable deduct on order placed") — Turns DOOP on or off for your program. When disabled, all channels below are ignored and your program uses standard immediate deduction.

  • Per-channel checkboxes — Once the master toggle is enabled, you can select which redemption channels use deferred deduction:

    • Checkout (Recommended ✓) — Redemptions made through Shopify checkout. This is where DOOP has the biggest impact, since it prevents the "where did my points go?" scenario when customers abandon checkout.

    • Storefront — Redemptions made through the on-page loyalty widget on your storefront.

    • Merchant API — Redemptions triggered via the Rivo Merchant API.

    • Auto Redeem — Redemptions triggered by automatic redemption rules.

    • In App — Redemptions made within the Rivo app interface.

Channels that are not checked will continue to deduct points immediately when a discount code is generated (standard mode behavior).

Quick setup guide

For most programs, the optimal setup is:

  1. Go to Settings > Orders in the Rivo app

  2. Scroll to "Deduct Earnings after Order Placed"

  3. Check "Enable deduct on order placed"

  4. Check only "Checkout"

  5. Uncheck all other channels

  6. Save

This gives you the best of both worlds: checkout redemptions are protected from abandoned cart confusion, while all other channels deduct immediately for a simpler experience.

How each mode works

Standard mode

  1. Customer clicks "Redeem" in your loyalty widget

  2. A discount code is generated

  3. Points are immediately deducted from their balance

  4. Customer copies the code and goes to checkout

  5. If they don't use the code, the points are already gone from their visible balance

Deduct on order placed mode

  1. Customer clicks "Redeem" in your loyalty widget

  2. A discount code is generated

  3. Points remain in their balance with no deduction yet

  4. Customer applies the code at checkout and completes the order

  5. Once the order is placed, points are then deducted from their balance

  6. If the code is never used, the customer's balance stays intact

Note: These steps apply only to channels where DOOP is enabled. For channels using standard mode, points are deducted immediately at step 3.

Why use deduct on order placed mode

It reduces customer confusion

The most common support ticket loyalty programs receive is some version of "where did my points go?" In standard mode, a customer who generates a code but abandons checkout sees a lower balance with nothing to show for it. With deduct on order placed, their balance always reflects reality.

Example: Sarah has 500 points and redeems them for a $5 off code. She gets distracted and closes her browser before checking out. In standard mode, she logs back in and sees 0 points and no discount applied to any order. She contacts support. In deduct on order placed mode, she logs back in, still sees 500 points, and can redeem again when she's ready.

It eliminates "lost points" scenarios

In standard mode, if a customer generates a discount code and then forgets to use it, closes their browser, gets distracted during checkout, or encounters a payment error, their points are already gone. They have to contact support to get them back. With deduct on order placed, this entire category of support requests disappears.

It handles multiple code generation cleanly

Customers sometimes generate multiple discount codes by accident — clicking "Redeem" more than once or generating codes across multiple sessions. In standard mode, each click deducts points. With deduct on order placed, only the code that is actually used triggers a deduction.

When this mode is enabled, the system also automatically consolidates unused discount codes. If a customer generates a new code, any previously generated but unused codes for the same reward are cleaned up. This prevents discount code clutter in both your Shopify admin and the customer's account.

Note: Consolidation only applies to channels using deferred deduction. Channels set to immediate deduction do not generate unused codes that need cleanup.

Example: Mike clicks "Redeem 200 points for $2 off" three times in a row because the page was loading slowly. In standard mode, he just lost 600 points and has three discount codes. In deduct on order placed mode, the system consolidates those into one active code, and his balance hasn't changed until he actually uses one at checkout.

Refunds and cancellations

Regardless of which mode you use, Rivo can automatically adjust points when orders are refunded or cancelled. This is configured separately in your Points Cancellations settings under Settings > Orders.

Full refund or voided order

All points earned from the order are revoked. If the customer used a points-based discount code, the redeemed points are returned to their balance.

Example: A customer places a $50 order, earns 50 points, and used a 200-point discount code for $5 off. The order is fully refunded. The 50 earned points are revoked and the 200 redeemed points are returned to their balance.

Partial refund

Points are revoked proportionally. If a customer earned 100 points on a $100 order and $40 is refunded, 40 points are revoked.

Cancelled order

Same behavior as a voided order. All earned points are revoked and any redeemed points are returned.

A nuance specific to deduct on order placed mode

If an order is cancelled very quickly after placement and the discount code was never fully marked as "used" in the system, Rivo recognizes that no points were ever actually deducted and skips the refund step. This prevents double-crediting, where a customer could end up with more points than they started with.

POS (point of sale) compatibility

POS redemptions always use immediate deduction, regardless of your DOOP channel settings. When a customer redeems points at a physical store through Shopify POS, points are deducted at the time of the transaction. This is because POS has its own separate code path and does not go through the standard online checkout flow.

Impact on VIP tiers

If your program uses VIP tiers based on points balance, deduct on order placed mode produces more stable tier behavior.

In standard mode, a customer's balance drops immediately on code generation, which could temporarily move them to a lower tier even if they haven't completed a purchase. With deduct on order placed, their balance and tier status remain stable until the order actually goes through.

Example: Jessica is in your Gold tier, which requires 1,000+ points. She has exactly 1,050 points and redeems 200 for a discount code. In standard mode, her balance drops to 850 and she could briefly lose Gold status before even completing checkout. In deduct on order placed mode, she stays at 1,050 until the order is confirmed.

If points are later revoked due to a refund, and the customer's balance drops below a tier threshold, they will be moved to the appropriate lower tier automatically.

Interaction with earning delays

Deduct on order placed mode controls when customers lose points from redemptions. This is separate from your loyalty earnings trigger, which controls when customers gain points from orders.

Your earning trigger can be set to award points when an order is placed or when an order is fulfilled. You can also set an approval delay (in seconds) for earned points, where points sit in a "pending" state and are automatically approved after the delay period. This gives you a window to catch fraudulent or test orders before points are awarded.

These settings are independent. You can mix and match. For example, a common setup for brands that want maximum accuracy:

  • Redemptions use deduct on order placed, so customers only lose points when a code is actually used

  • Earnings use order fulfilled with a 14-day delay, so customers only gain points after the order ships and a waiting period passes

This combination covers both sides: customers aren't penalized for abandoned checkouts, and you aren't giving away points on orders that might be cancelled or fraudulent.

Best practices

  • Use "Checkout only" as your default setup. This is the optimal configuration for most programs. Checkout is where abandoned cart confusion happens most, so DOOP has the biggest impact there. Keeping other channels on immediate deduction simplifies the experience.

  • Enable automatic points cancellation for refunded and voided orders alongside this mode. The two features complement each other to keep balances accurate.

  • Set an earning delay if fraud is a concern. Combine deduct on order placed with a fulfillment-based earning trigger and approval delay for the tightest accuracy.

  • Communicate the experience clearly in your widget text and transactional emails. Let customers know their points will be deducted when they complete their purchase, so the flow feels intentional.

  • Only enable additional channels if you have a specific reason. Storefront, Merchant API, Auto Redeem, and In App channels should only be enabled for DOOP if you're seeing issues with those specific channels. Checkout-only covers the vast majority of use cases.

Recommendations

Programs that benefit most from this mode

  • Programs using credits as their balance type should almost always have this enabled. Credits function like store credit, and customers expect their balance to reflect what they've actually spent.

  • Programs with high support volume around "missing points" or "where did my balance go" questions will see an immediate reduction in those tickets.

  • Programs with POS redemption get a more natural timing alignment between online and in-store experiences.

  • Programs where customers frequently browse rewards without purchasing benefit because customers who window-shop rewards won't see confusing balance fluctuations.

Things to keep in mind

If your program is already live and your customers are accustomed to seeing their balance drop immediately on redemption, switching modes may initially confuse some customers. We recommend consulting your success manager to plan the transition and communicate the change to customers.

If you have aggressive points expiration policies, there is a theoretical window between code generation and order placement where expiration could affect the balance. In practice this is rare because discount codes are typically used within the same session, but it's worth factoring in.

Automatic points adjustment on refunds and cancellations is designed for the standard "Placed an order" earning rule. Custom earning rules created through Shopify Flow may require additional configuration for refund handling.

Frequently asked questions

What happens if a customer generates a code but never uses it?

Their points stay in their balance. The unused discount code is automatically cleaned up when they generate a new one for the same reward.

Can a customer generate multiple codes and use them all?

The consolidation system cleans up old unused codes when a new one is generated. Only one active unused code per reward type is maintained at a time. If a customer manages to apply a code before consolidation runs, standard Shopify discount rules apply.

Does this affect how points appear in the customer's transaction history?

Yes. In standard mode, a "Points Redeemed" entry appears when the code is generated. In deduct on order placed mode, the redemption entry appears after the order is placed and the code is marked as used.

Is this compatible with Shopify's discount combination settings?

Yes. Deduct on order placed is a Rivo-side timing mechanism for when balance deductions occur. Shopify's discount combination rules for stacking discounts are handled separately and work the same way regardless of this setting.

How do I enable this for my program?

Navigate to Settings > Orders in the Rivo app. Scroll to the "Deduct Earnings after Order Placed" section. Toggle "Enable deduct on order placed" on, then select the channels you want to use deferred deduction. We recommend starting with Checkout only. Click Save.

If you're enabling this on a live program with existing customers, we recommend consulting your success manager to plan the transition.

What do the different channels mean?

  • Checkout — Points redeemed through Shopify checkout (the most common flow).

  • Storefront — Points redeemed directly via the on-page loyalty widget.

  • Merchant API — Points redeemed via API calls from your custom integrations.

  • Auto Redeem — Points redeemed automatically by auto-redemption rules.

  • In App — Points redeemed within the Rivo app interface.

What if I only enable DOOP for Checkout?

Checkout redemptions will defer point deduction until the order is placed. All other channels (storefront widget, API, auto-redeem, in-app) will continue to deduct points immediately when the code is generated. This is the recommended setup for most programs.

Did this answer your question?