
WooCommerce cannot restrict a coupon to first-time buyers on its own. To run a real first purchase discount, something has to check the shopper’s order history before the discount applies.
That means a rule-based discount plugin, a snippet in your theme, or a one-time coupon generated for each new subscriber.
WooCommerce first order discounts are supposed to reach people who have never bought from you.
Launch WELCOME10, pull the coupon report two weeks later, and you will usually find your regulars in it.
The discount will work, but it just discounts the wrong people.
We see this constantly, and it happens because WooCommerce has no first-order discount setting.
Core coupons cap how many times one person redeems a code. They never check whether that person has ordered before, so your best customers qualify for your new-customer offer.
This guide covers four ways to fix that: a free native coupon, an automatic checkout discount, a code snippet, and a personalized coupon delivered by email.
We will also cover how WooCommerce identifies a first-time buyer, why guest checkout complicates it, and how to stop the offer from being farmed.
Let's start!
Table of Contents
- 1 What is a WooCommerce First Order Discount?
- 2 Does WooCommerce Have a Built-In First Order Discount?
- 3 How WooCommerce Identifies a First-Time Customer?
- 4 4 Ways to Set Up a First Purchase Discount in WooCommerce
- 5 Method 1: Build the First Order Coupon in Native WooCommerce
- 6 Method 2: Email a One-Time Coupon to Every New Subscriber
- 7 Method 3: Auto-Apply the Discount at Checkout
- 8 Method 4: Add the discount with custom code
- 9 How to Prevent First Order Discount Abuse?
- 10 Troubleshooting: First Order Discount Not Working
- 11 What Discount Should You Offer on a First Order?
- 12 Frequently Asked Questions
- 13 Ready to Run a First Order Discount that Only Reaches New Customers?
What is a WooCommerce First Order Discount?
A first-order discount is a promotion that only applies to shoppers with no purchase history in your store.
The check happens at the moment of purchase against order records.
That distinction matters, because the offer it gets confused with behaves differently.
| Parameters | First order discount | Signup discount |
|---|---|---|
| Trigger | Zero previous orders | Registration or newsletter opt-in |
| Checked against | Order history | Contact record |
| Existing customer can claim it | No, if enforced properly | Yes, with a second account |
| Typical delivery | Auto-applied at checkout | Emailed code |
| Best for | Protecting margin | Building the list |
In our experience, most stores want both, i.e., capture the email with a signup offer, then enforce the order-history condition at checkout so the code cannot be recycled.
Does WooCommerce Have a Built-In First Order Discount?
No. WooCommerce ships with a real coupon engine, but it doesn't include a new-customer condition.
Under Marketing ⇨ Coupons, you get seven controls across the 'Usage Restrictions' and 'Usage Limits' tabs:
- Minimum and maximum spend, individual use only, and product, category, and sale-item exclusions, which all filter the cart.
- Allowed emails, a list of billing addresses permitted to redeem, with wildcards supported (*@company.com).
- Usage limit per coupon, usage limit per user, and an expiry date, all of which count redemptions.
Neither one looks at purchase history, which is why a customer with eleven orders behind them who has never touched WELCOME10 passes all seven checks.
How WooCommerce Identifies a First-Time Customer?
This is the part most guides skip, and it decides whether your offer actually holds.
- For registered customers, WooCommerce counts orders against the user ID. Any plugin or snippet can call wc_get_customer_order_count() and check for zero. Reliable, because the orders are tied to a stable account.
- For guests, there is no account to check. The only identifier is the billing email typed at checkout, so the system has to search past orders for that address and count them.
Two details change the outcome, which will help us before picking a method.
Order status affects the count. Most solutions only count Completed and Processing orders, so a cancelled or failed order will not disqualify someone. This is usually what you want.
Guest matching is weaker by design. A shopper checking out as a guest with a fresh email looks brand new every time.
However, requiring an account closes that door, but Baymard lists forced account creation among the top reasons shoppers abandon carts.
Every method below runs this same check. They differ in how they run it, not in what they are looking for.
4 Ways to Set Up a First Purchase Discount in WooCommerce
The right method depends on whether you want the offer applied silently at checkout, gated behind an email signup, or manually restricted.
| Method | Needs a plugin | Checks order history | Auto-applies | Works for guests | Cost | Best for |
|---|---|---|---|---|---|---|
| 1. Native coupon | No | No | No | Partly | Free | Testing an offer this week |
| 2. Unique code per subscriber | Yes | Indirectly | Via URL | Yes | Free to $99/yr | List building alongside the offer |
| 3. Rule-based plugin | Yes | Yes | Yes | Yes | Free to $79/yr | Most stores |
| 4. Custom code | No | Yes | Yes | Yes | Dev time | Stores with a developer |
Method 1: Build the First Order Coupon in Native WooCommerce
This method will not truly restrict the offer to new customers, and we would only use it where you send codes to people individually.
Go to Marketing ⇨ Coupons and add a new coupon.
Under the General tab, set Discount type to Percentage discount and Coupon amount to 15. Set the expiry five days out.

Under Usage Restrictions, set Minimum spend to 40 and drop the shopper’s address into 'Allowed emails', which locks the code to that person.
Under Usage Limits, set both Usage limit per coupon and Usage limit per user to 1.

For the full range of discount types WooCommerce supports natively, see our guide to WooCommerce discount types.
This method has a limitation that applies only when you generate a unique code per person and send it directly.
Publish one shared code and your existing customers will find it every time.
Method 2: Email a One-Time Coupon to Every New Subscriber
This method trades instant coupon for a first-time user's email address.
A visitor submits an opt-in form, a coupon code is generated for that person alone, and it lands in their inbox seconds later.
Because the code is created per subscriber and bound to their email, it cannot be shared, scraped, or listed on a coupon site.
That single property is why this method holds up better than a public offer.
We will use FunnelKit Automations, which creates WooCommerce coupons as an automation action rather than pulling from a batch made in advance.
There is a free version on WordPress.org, with coupon generation and follow-up sequences in the Pro plan.
Before we proceed with the primary process, ensure that you have installed and activated FunnelKit Automations (both the free and premium versions).
Step 1: Set the opt-in form as your automation trigger
The first step is to create a new automation. For that, navigate to FunnelKit Automations ⇒ Automations and then click on 'Create Automation'.

Now select the black template, provide a name, and click on Create.
Next, select a trigger that initiates the process of creating a personalized coupon code and sends it to the subscribers via email.
In our case, the trigger is when someone fills out the form, and we collect a lead.

On the Funnel Builder tab, under Optin Form, choose “Form Submits” and click on Done.

Step 2: Configure your form and map the field
Now, you need to select the lead generation form and map the field.
As mentioned earlier, we used the Charmer template to create an opt-in funnel. This template has two versions: one an inline form and another a pop-up form.
Here, we are going with pop-up form. Here is what the form looks like :

For this, you need to set up the following options:
- Select Form: Choose the Opt-in form from the dropdown.
- Select Email Field: Select the email field here.
- Select First Name: Here, choose the first name.
- Select Last Name: Our form has only two fields: email and first name, so we are going to skip this field.
- Select Phone: We will skip this one as well.
- Mark Contact as Subscribed: Checking this box will mark all the generated leads as subscribed contacts.
- Runs On Contact: Choose once, as we will offer first-order discounts only once.
Finally, click on Save to update changes.

Step 3: Create a dynamic, personalized coupon
We will now create an action that will generate the coupon code.
To do so, click on the “+” icon and choose 'Action'.

Now on the WooCommerce tab, choose 'Create Coupon' and click on Done.

Now, provide the following information:
- Coupon Title: Provide a coupon title.
- Discount Type: Choose the discount type. The options are percentage discount, fixed cart discount, and fixed product discount.
- Amount: Here, enter the discount amount.
- Coupon Code Prefix: Provide the text that will be added to the start of the discount code. For example, we are using the prefix 'welcome' appended with the customer's first name, which we added using a merge tag.

- Coupon Expiry: Set the discount code to expire after specific Days or on a specific date. We recommend setting the expiration date after a specific day, such as one day or three days. This will create an urgency in the users to make the order fast and also give them enough time to place the order.

- Allow Free Shipping: If you want, you can allow free shipping.
You can switch to the Restrictions tab to set conditions like minimum/maximum spend, exclude sale items, enable individual use, and limit the coupon by customer email, specific products, or categories.
For example, if you want to offer a WooCommerce first-order discount for certain product categories, just add those categories here.

On the Limits tab, control total coupon uses, limit usage per item, and set usage limits per individual user.

After providing the details, click on Save.
Step 4: Design an email with a dynamic discount coupon code
Before creating the email, you need to add another action to send the email.
Now, on the Messaging tab, select the 'Send Email' action.

Now add the Email Subject and Preview Text. You can use the merge tag to personalize the subject and preview Line.
Here, we are using the “{{contact_first_name}}” tag, which will dynamically display the user's name.

You can design the email template in three ways: Visual Builder (New), Rich Text, and Raw HTML.
🔔 Note: Don’t use the Raw HTML option unless you are a pro at HTML.
Here, we are going to use Visual Builder.

FunnelKit Automations provides many prebuilt email templates. You can choose any of these and customize it according to your needs.
Here, we are using the “Personalized Coupon” template to share the discount first buyers can use to avail themselves of the discount.
Hover on the template and click on Preview.

Now, to import, click on the “Import This Template”.

After importing, you can customize the email template as you want. For instance, you can change the logo and add a welcome text for new users to let them know about the first-order discount.
We are adding the customer's first name in the message to make it more personalized.

After that, customize all the discount-related text according to the discount you want to offer users on their first order in your WooCommerce store.
🔔 Note: Here, we will share the dynamic coupon created in the previous step, so make sure the texts reflect this.

Now it’s time to embed the dynamic, personalized coupon that will be shared with each new customer through this email to offer WooCommerce a first-order discount.
For this, click on the “Coupon” block, then move to the Automation tab on the left and choose Automation from the dropdown menu for the Coupon code.

Also, add a link to your shop page to the “Shop Now” CTA so users can directly land on your website to shop and redeem the coupon.

After making the changes, make sure to click on Save to update.
And that’s it. Your email automation with WooCommerce first-order discount is ready.
You can also send a test email to check how the email will look when an actual user receives it in their email inbox.
To send a test email, click on Preview and Test.

Add the email address to which you want to send test emails and click on “Send Email”.

Here is a preview of the email with the WooCommerce first order discount.

Step 5: Activate the automation to share the first-order discount coupon
The last step is to activate the automation. For that, close the email builder and turn on the toggle in the top right corner.

And that’s it. Your campaign is live to generate and share a discount code for first-time users automatically.
Method 3: Auto-Apply the Discount at Checkout
Most store owners want an automatic new-customer discount, and that is where we would start.
There is no code to type and nothing for the shopper to forget.
Research from Bizrate Insights and Digital Commerce 360 found that promo codes failing to apply at the cart is a recurring complaint among US shoppers, and a discount the customer never has to think about sidesteps that entirely.
Several plugins add an order-history condition to WooCommerce:
- Smart Coupons adds a “For new customers?” checkbox to the standard coupon screen, with an auto-apply toggle alongside it. You stay inside Marketing ⇨ Coupons, which makes it the closest thing to a native-feeling fix.
- Discount Rules for WooCommerce works as a pricing engine rather than a coupon. You build a rule, filter it to all products or a category, and add a purchase-history condition. Auto-applied coupons and BOGO sit in the Pro version.
- Advanced Coupons applies the discount through a URL, a one-click notice on the cart page, or silently in the background with its Smart Apply feature.
- First Purchase Discount for WooCommerce is single-purpose. Fixed, percentage, or discounted pricing goes to first-time buyers, and there is a promotional bar for the shop page.
The build is broadly the same in all four, so pick on stack fit rather than feature lists.
Setup is the same shape in all four: create WELCOME10, tick the new-customer condition, set a per-user limit of 1 as backup, enable auto-apply, publish.

If you run the block-based Cart and Checkout, check your plugin supports WooCommerce Blocks.
Some older discount plugins only render their notices on the classic shortcode checkout.
For a wider look at the tooling, see our guide to the best WooCommerce coupon plugins.
Method 4: Add the discount with custom code
If you would rather not add another plugin, apply the discount as a negative cart fee.
Back up the site first, then add this to a child theme’s functions.php or a code snippets plugin.
This gives logged-in customers with no order history 15% off:
add_action( 'woocommerce_cart_calculate_fees', 'fk_first_order_discount' );
function fk_first_order_discount( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
return;
}
if ( ! is_user_logged_in() ) {
return;
}
if ( wc_get_customer_order_count( get_current_user_id() ) > 0 ) {
return;
}
if ( $cart->get_subtotal() < 40 ) {
return;
}
$discount = $cart->get_subtotal() * 0.15;
$cart->add_fee( __( 'First order discount (15%)', 'woocommerce' ), -$discount );
}The function hooks into woocommerce_cart_calculate_fees, which fires every time cart totals recalculate. Logged-out visitors exit early.
Everyone else gets counted with wc_get_customer_order_count(), and the function stops the moment that count is above zero.
Carts under $40 are skipped to match our minimum spend. Everything else gets 15% added back as a negative fee.
Covering guests takes a second check against the billing email.
Pass it to wc_get_orders() with a billing_email argument and a status filter of wc-completed and wc-processing, then count what comes back.
This has to run late enough for the email to exist, which makes it noticeably more fragile than the logged-in version.
Once you’ve captured the email, the next step is to encourage that first purchase, and that’s where your exclusive discount coupon does the heavy lifting.
To automate this process and share the discount coupon instantly, proceed to the next section, where we guide you through setting up an automated email sequence.
To automate this process and share the discount coupon instantly, proceed to the next section, where we guide you through setting up an automated email sequence.
Two limitations we would flag before you ship this.
Negative fees hit the cart total rather than line items, so tax-inclusive stores can see rounding differences.
And the discount never appears as a coupon in your reports, so you lose redemption tracking.
If either matters, Methods 2 and 3 keep the reporting intact.
How to Prevent First Order Discount Abuse?
Any public new-customer offer will be farmed. We don’t aim for zero abuse. We aim to make abuse cost more effort than the discount is worth.
- Generate unique codes instead of publishing one
A single public code is one screenshot away from a coupon aggregator.
Per-subscriber codes have no shared secret to leak, which is why auto-generated unique coupon codes hold up better than any restriction you can layer onto a public one.
- Normalize email aliases
[email protected], [email protected], and [email protected] are one inbox.
Strip dots and everything after + on Gmail-style domains before checking order history:
function fk_normalise_email( $email ) {
list( $local, $domain ) = array_pad( explode( '@', strtolower( $email ) ), 2, '' );
$local = strtok( $local, '+' );
if ( in_array( $domain, array( 'gmail.com', 'googlemail.com' ), true ) ) {
$local = str_replace( '.', '', $local );
}
return $local . '@' . $domain;
}- Block disposable domains
Keep a denylist and reject the coupon, not the order.
Blocking checkout outright costs you legitimate sales from people who use aliases for everything.
- Limit by shipping address and IP
The official Coupon Restrictions extension exposes both. Three orders to one street address from three different emails is the clearest abuse signal you’ll get.
- Keep the expiry at 3 to 7 days
Short windows cap your exposure when a code leaks, and they give the offer urgency it wouldn’t otherwise have.
- Set a minimum spend
Without a floor, a percentage discount on your cheapest SKU goes negative once shipping is counted.
- Require an account for the offer only
You don’t have to disable guest checkout store-wide.
Gating the discount behind a logged-in session while guests still check out at full price is the strongest order-history check available, and it costs nothing on regular orders.
Troubleshooting: First Order Discount Not Working
The discount is applying to returning customers
Almost always a per-user limit doing the job you assumed an eligibility rule was doing.
Open the coupon and confirm a real new-customer condition is ticked.
If your plugin checks accounts only, guest orders from the same email won’t count, so enable the guest-order check in its settings.
The other cause is order status: count only completed orders and a shopper whose first order is still processing reads as new. Widen the status list.
Guests reuse the offer with new email addresses
Layer the defences, such as alias normalisation first, then shipping-address limits, then the expiry.
If leakage still outweighs the acquisition value, move the offer to logged-in shoppers only.
The coupon doesn’t appear at checkout
Work down this list in order:
- Coupons are enabled under WooCommerce ⇨ Settings ⇨ General.
- The coupon hasn’t expired.
- Minimum spend is met by the subtotal before shipping.
- Cart contents aren’t in an excluded category.
- No other Individual use only coupon is already applied. That setting silently blocks yours.
The discount vanishes on the block checkout
If it disappears when the shopper types their email, the eligibility check has just run against real data and found previous orders.
Working as designed, so explain it near the coupon field.
If nothing applies at all, the plugin is hooking the classic checkout only.
What Discount Should You Offer on a First Order?
The number is a margin question, and it’s the part most stores get wrong by copying whatever offer they saw last.
| Discount type | Typical range | Margin risk | Best for |
|---|---|---|---|
| Percentage off cart | 10% to 15% | Highest, scales with order size | Mid-priced catalogues |
| Fixed cart discount | $5 to $20 with a minimum spend | Predictable | Stores with consistent AOV |
| Fixed product discount | Varies | Contained to one SKU | Pushing a hero product |
| Free shipping | Cost of one parcel | Fixed and knowable | Physical goods, small carts |
| Tiered by spend | 10% over $75, 15% over $150 | Lowest, since you set the floor | Protecting margin while lifting AOV |
Run the math before you pick. Take a store with a $65 average first order and 45% gross margin, so $29.25 to work with. WELCOME10 costs $6.50, about a fifth of it.
Free shipping on a $9 parcel costs more in absolute terms, but it stays $9 whether the cart is $65 or $165, while the percentage climbs to $16.50.
On catalogues where first orders skew large, the percentage is the expensive option even though the number looks smaller.
Free shipping on the first order also removes the exact line item shoppers react to, since unexpected extra costs are the most cited reason carts get abandoned, and abandonment averages around 70%.
The offer is competing for shoppers who already wanted the product. It rarely needs to be big. It needs to be visible before the payment step.
Frequently Asked Questions
It’s best to keep your first-order discount time-limited, usually around 3 to 7 days. This short window creates a sense of urgency and motivates new shoppers to act quickly.
When people know the offer won’t last long, they’re more likely to complete their purchase right away.
Yes. A rule-based discount plugin or a cart fee snippet applies the discount as soon as it detects zero previous orders, so the shopper types nothing.
This usually converts better than a code for exactly that reason.
Only if you run it constantly and let existing customers reach it, which is the failure mode we see most.
A properly gated first-time buyer offer is invisible to anyone who has already bought, which is the entire point of enforcing it on order history.
On the first order, yes. It pays back across repeat purchases, so judge it on customer lifetime value rather than the margin on the discounted order.
If your repeat rate is near zero, we would fix that before discounting acquisition at all.
Slightly, yes. However, it can increase customer lifetime value (CLV) by turning first-time buyers into repeat customers.
Validate on billing email as well as user ID, and issue unique codes bound to a single address.
Blocking disposable domains closes most of what is left. Nothing is airtight, so we always set a minimum spend that keeps the leakage small.
Ready to Run a First Order Discount that Only Reaches New Customers?
The offer is the easy part. Getting it to skip the people who already buy from you is where the money is, and that comes down to one condition checked against order history.
We would pick on a single question: do you want the email address, or the frictionless checkout?
If it is the checkout, a rule-based discount plugin gets you there.
If it is the email address, FunnelKit Automations issues a unique, expiring, email-bound code to every new subscriber and follows up on its own when the code goes unused.
If you’d rather issue a unique, expiring code to every new subscriber and follow up automatically when it goes unredeemed, FunnelKit Automations builds that flow without a separate email tool.
Start today and turn new visitors into loyal customers with ease.
More WooCommerce Guides
- The Complete Guide to WooCommerce Discounts
- How to Automate Next Order Coupons
- How to Offer WooCommerce Quantity Discounts
- How to Use WooCommerce Free Gift Coupon
- Best WooCommerce Coupon Plugins
- How to offer BOGO in WooCommerce

Editorial Team
August 25, 2026WooCommerce automated emails already handle your receipts, shipping notices and password resets for free on every install. What they don’t handle is the kind that makes money, such as cart...

Editorial Team
August 19, 2026A WooCommerce mini cart is a compact cart summary that shows product details, quantities, and totals without sending shoppers to a separate cart page. You can set it up as...

Editorial Team
August 11, 2026WooCommerce failed order emails to customers do the job a barista does in about four seconds. The card gets declined, they ask if you want to try another one, you...






