Stop Losing $3,200/Month: Gift Cards, Loyalty & Promotions in Odoo 18 Website
By Braincuber Team
Published on December 20, 2025
You're leaving $3,200/month on the table because your discount codes are broken. Or worse—they work, but you have no idea which ones are actually profitable.
Last month, we watched a $4.7M D2C skincare brand realize they'd been running a "20% off" coupon that *stacked* with their loyalty program. Customers were getting 37% off orders. The founder thought cart abandonment emails were "working great" because conversions jumped 18%. What she didn't see: margin dropped from 42% to 11%.
Odoo 18's Website module has promotion and coupon tools that *actually* let you control what discounts do—before they eat your profit. Here's how to set them up without the usual spreadsheet disasters.
Stop If This Sounds Familiar:
Turn On Discount Controls (The Thing Nobody Does)
Before you can set up promotions, enable the feature Odoo hides in settings. *(Yes, it's off by default. No idea why.)*
Step 1: Enable Discounts & Loyalty
- Open Website app
- Go to Configuration → Settings
- Scroll to Shop - Checkout Process section
- Check the box: "Discounts, Loyalty & Gift Card"
- Click Save
Now you can actually see your promotions menu. Head to Website → Products → Promotion Programs.
Promotion Programs vs. Coupon Programs (They're Different)
Here's where people screw up:
Promotion Programs
Auto-apply. No code needed.
Example: "Spend $75, get free shipping" triggers automatically at checkout.
Coupon Programs
Require a code. Customer enters it.
Example: "WELCOME10" for 10% off first order. Must type it in.
Use promotions for cart upsells. Use coupons for email campaigns. Don't mix them or you'll get double-dipping nightmares.
Building a Promotion That Won't Wreck Margin
Let's build a real example: "Spend $150, get 15% off—but only on products over $30." *(Stops people from loading up on low-margin impulse buys.)*
Create New Promotion
- Go to: Website → Products → Promotion Programs
- Click: New button (top-left)
- Fill in:
- Program Name: "High Cart Value - 15% Off"
- Program Type: Promotions
- Currency: USD
- Available On: Check "Website"
Set the Rules (This Is Where You Save Money)
Click the Rules & Rewards tab. Here's where you control what triggers the discount.
Conditional Rules Section:
- Condition: "Minimum Amount" → Set to $150.00
- Product Domain (optional): Add filter "[('list_price', '>=', 30)]" to exclude cheap items
Pro Tip: If you don't filter by product price, customers will add 10x $5 items to hit the $150 threshold. Your 15% discount then applies to low-margin junk. We've seen this tank CAC:LTV ratios.
Configure the Reward
Still in Rules & Rewards tab, scroll to the Rewards section:
| Reward Type | When to Use | Risk Level |
|---|---|---|
| Discount % on Order | When margin is consistent across products | 🟡 Medium |
| Fixed Amount Off | When you need predictable discount caps | 🟢 Low |
| Free Product | Great for inventory liquidation | 🟢 Low |
| Free Shipping | Only if your shipping cost is under $8.50/order | 🔴 High (if misused) |
For our example, select: Discount → Percentage → 15% → Apply on "On Order".
Set Max Discount: Enter $40. This caps the discount even if someone orders $500 worth. *(Protects you from whale customers gaming the system.)*
Optional But Smart:
- Start Date / End Date: Set expiration so codes don't live forever on coupon sites
- Limit Usage: Check "Limit number of uses" and set to 500 if testing
- Website: Select specific site if you run multi-brand
Click Save. The promotion is now live. Test it by adding $150+ to your cart.
Building Coupon Codes That Don't Leak
Coupon codes require customer input. Use these for targeted campaigns—email subscribers, influencer partnerships, paid ads.
Create a Coupon Code
- Go to: Website → Products → Coupon Programs
- Click: New
- Program Name: "Email Subscriber - Welcome Offer"
- Program Type: Coupons *(critical—don't pick Promotions)*
- Currency: USD
Generate the Actual Code
After saving, Odoo auto-generates a code like 044d-d911-474f. If you want custom codes *(like WELCOME10)*, you need to:
- Go to Sales → Configuration → Coupon Programs
- Open your coupon program
- Click Generate Coupons button
- Enter your custom code: WELCOME10
- Save
Warning: If you use simple codes like "SAVE20" or "FREESHIP," they'll end up on RetailMeNot within 48 hours. Use unique codes per campaign. Example: "WEL-MAR24-A1" for March 2024 email batch A.
Set Coupon Rules
Same as promotions—go to Rules & Rewards:
Example Setup for "First Order" Coupon:
- Conditional Rule: "Minimum Amount" → $50
- Reward: Fixed Amount → $10 off
- Usage Limit: 1 per customer *(prevents abuse)*
- Valid Until: 30 days from today
How Customers Apply Coupons (The Checkout Flow)
When a customer shops on your Odoo website:
- They add products to cart
- Click Proceed to Checkout
- On the Review Order page, they see: "Have a promo code?"
- They enter the code (e.g., WELCOME10) in the text box
- Click Apply
- If valid, discount appears. Order total updates immediately
What Works: Promotions auto-apply, so customers see "You saved $12!" without typing anything. Coupons require manual entry, which feels more "exclusive" for email campaigns.
Advanced: Free Product Rewards
Want to give away a sample or bonus product? *(Smart for new product launches or clearing slow-moving inventory.)*
Setup Example:
- Create promotion/coupon as usual
- In Rewards section, select: Free Product
- Choose the product (e.g., "Travel-Size Moisturizer")
- Set quantity: 1
- Optional: Set product as "not sold separately" to prevent direct purchases
The free product gets added automatically when conditions are met. Shows as "$0.00" line item in cart.
Free Shipping (Do This Carefully)
Free shipping sounds great until you realize your average shipping cost is $11.20 and you set the threshold at $40. You just lost $11 on every order that would've converted anyway at $60.
| AOV Tier | Free Ship Threshold | Why |
|---|---|---|
| $35 - $60 | $75 | Forces upsell without cannibalizing margin |
| $60 - $100 | $120 | High enough to protect natural converters |
| $100+ | Don't offer it | Your customers aren't price-sensitive at this tier |
To enable free shipping reward: In Rewards, check "Free Shipping" box. Done.
Common Mistakes We See Every Week
1. No Expiration Dates
Codes live forever. They spread to coupon aggregator sites. Your "launch promo" from 2023 still gets used in 2025.
2. No Usage Limits Per Customer
Power users create 17 accounts with Gmail +aliases. Same person uses your "first order" code 17 times.
3. Percentage Discounts on Bundles
Your bundle already has thin margin. A 20% code turns it unprofitable. Use fixed amounts or exclude bundles.
4. Forgetting to Test
Go incognito. Add items. Enter code. Does it apply correctly? Check the math. We've seen 10% codes give 10 *dollars* off instead.
Track This Or You're Flying Blind
After setting up promotions, go to Website → Reporting → Coupons to see:
- Which codes are used most
- Revenue per code
- Discount amount given
- Orders per promotion
Compare this to actual margin impact in your accounting system. If "SAVE20" brings in $14K revenue but costs $11K in discounts + fulfillment, kill it.
Reality Check: Most D2C brands run 3-7 active promo codes at once. They have no idea which ones are profitable. They just know "discounts increase conversions." Cool. So does selling at cost.
Test These Configurations First
If you're new to Odoo promos, start with these 3 proven setups:
Setup #1: Cart Abandonment Recovery
Type: Coupon
Code: Unique per abandoned cart email
Discount: 10% up to $15 max
Minimum: $60
Expires: 48 hours
Usage: 1 per customer
Why it works: Time pressure + personalized code = 23% higher recovery rate (based on our client data)
Setup #2: Bulk Order Incentive
Type: Promotion (auto-apply)
Trigger: Cart total ≥ $200
Reward: Free premium shipping ($18 value)
Applies: Automatically
Why it works: No code friction. Encourages larger carts. Shipping cost is predictable.
Setup #3: New Product Launch Sampling
Type: Promotion
Trigger: Any order over $80
Reward: Free trial-size of new product
Duration: 14 days only
Why it works: Gets new product into customer hands. Low cost ($2.30 COGS). Drives repeat orders for full size.
Still Losing Money on Discount Codes?
We help D2C brands set up Odoo promotion systems that actually protect margin while increasing conversions. No more coupon code chaos.
