FunnelKit
FunnelKitBlogs

WooCommerce First Order Discount: How to Set It Up for New Customers Only

Updated:  Aug 21, 2026
Written by: 
Author: Editorial Team
Editorial Team
Author: Editorial Team Editorial Team

The FunnelKit Editorial Team is a group of WooCommerce experts with 10+ years of combined experience. We create actionable guides based on hands-on testing, industry research, and user feedback to help eCommerce businesses grow.

WooCommerce First Order Discount: How to Set It Up for New Customers Only

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!

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.

ParametersFirst order discountSignup discount
TriggerZero previous ordersRegistration or newsletter opt-in
Checked againstOrder historyContact record
Existing customer can claim itNo, if enforced properlyYes, with a second account
Typical deliveryAuto-applied at checkoutEmailed code
Best forProtecting marginBuilding 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.

MethodNeeds a pluginChecks order historyAuto-appliesWorks for guestsCostBest for
1. Native couponNoNoNoPartlyFreeTesting an offer this week
2. Unique code per subscriberYesIndirectlyVia URLYesFree to $99/yrList building alongside the offer
3. Rule-based pluginYesYesYesYesFree to $79/yrMost stores
4. Custom codeNoYesYesYesDev timeStores 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.

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.

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'.

Create new automation to offer discount on first time buyers in your WooCommerce store

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.

select an event

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

form submits

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 :

form

 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. 

map form fields

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'.

select action to add dynamic coupon after form submits

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

create coupon

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.
create discount coupon details such as percentage discount, discount rules in woocommerce first time order discount
  • 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.
set woocommerce first order discount coupon expiry date
  • 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.

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.

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. 

subject line and preview text for first order discount

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.

pick new 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. 

click preview discount cope email template

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

import dynamic discount coupon 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. 

update body text of first order discount email using FunnelKit Automations

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. 

update related text according to the discount you are offering

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.

embed dynamic discount coupon for first time buyers

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. 

add URL to Shop now CTA

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.

preview and test first order discount in WooCommerce using email automation

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

send test WooCommerce first order email

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

preview WooCommerce first order discount email

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.

Activate WooCommerce first order automation

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.

Create the rule, set Percentage discount to 15 with a $40 minimum, then add the condition that does the work: number of previous orders equals zero, or the equivalent “is first order” toggle.

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 typeTypical rangeMargin riskBest for
Percentage off cart10% to 15%Highest, scales with order sizeMid-priced catalogues
Fixed cart discount$5 to $20 with a minimum spendPredictableStores with consistent AOV
Fixed product discountVariesContained to one SKUPushing a hero product
Free shippingCost of one parcelFixed and knowablePhysical goods, small carts
Tiered by spend10% over $75, 15% over $150Lowest, since you set the floorProtecting 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

How long should a first-order discount last?

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.

Can I auto-apply a first purchase discount without a coupon code?

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.

Won’t a new customer discount train shoppers to wait for deals?

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.

Does it hurt my margins?

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.

Does a first-order discount hurt margins?

Slightly, yes. However, it can increase customer lifetime value (CLV) by turning first-time buyers into repeat customers.

How do I stop people making multiple accounts to reuse it?

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

Related Blogs
woocommerce automated emails - FunnelKit

Editorial Team

WooCommerce Automated Emails: The Complete Setup Guide

WooCommerce 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...

How to Add a WooCommerce Mini Cart to Your Store (Step-by-Step)

Editorial Team

How to Add a WooCommerce Mini Cart to Your Store (Step-by-Step)

A 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...

woocommerce failed order email to customer - FunnelKit

Editorial Team

How to Send WooCommerce Failed Order Emails to Customers (2026)

WooCommerce 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...

Published by: Editorial Team
The Editorial Team at FunnelKit (formerly WooFunnels) is a passionate group of writers and copy editors. We create well-researched posts on topics such as WordPress automation, sales funnels, online course creation, and more. We aim to deliver content that is interesting and actionable.
Thank you for reading. Stay connected with us on the Facebook group, X (Twitter), LinkedIn and YouTube channel for more tips to help grow your business.
Join Over 40,300+ Sellers Increasing Profits with FunnelKit! 🚀
Join FunnelKit
FunnelKit Checkout gives you beautiful, ready-to-use WooCommerce checkout templates, embed order forms, one-page checkouts, and more.
Join FunnelKit
Related Blogs
woocommerce automated emails - FunnelKit

Editorial Team

WooCommerce Automated Emails: The Complete Setup Guide

WooCommerce 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...

How to Add a WooCommerce Mini Cart to Your Store (Step-by-Step)

Editorial Team

How to Add a WooCommerce Mini Cart to Your Store (Step-by-Step)

A 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...

woocommerce failed order email to customer - FunnelKit

Editorial Team

How to Send WooCommerce Failed Order Emails to Customers (2026)

WooCommerce 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...

Ready to Transform Your Store?
Join 40,300+ successful store owners who trust FunnelKit to power their businesses.
Conversion Optimized Checkout Pages
Increase Revenue with Smart Upsells
Capture Emails & Recover Abandoned Carts
Automate Winbacks & Repeat Sales
996+ 5 star reviews on WordPress.org
Transform your store to power your business with FunnelKit
🚀 Maximize Your Profit with FunnelKit – Highest Rated with 996+ 5-Star Reviews
Get Started