Launch price: $29 one time for the first 199 buyers, then $49 for the next 200, then $39 a year per site.Get Pro

ThresholdCOD Rules for WooCommerce

For WooCommerce stores that ship cash on delivery

A refused parcel costs you twice.

The courier charges for the trip out and the trip back, and the sale never happens. Threshold decides when cash on delivery is offered, adds a fee, and asks for a small advance through the payment gateway you already use.

Block and classic checkoutHPOS compatibleEarly Pro licences are one payment

Order #11975COD: advance dueCOD: balance dueCompleted
demo-store.example/checkout
Block checkout showing Cash on Delivery with a note: pay 1,218 rupees now, the remaining 6,901 rupees on deliveryPay a part now, the rest on delivery
The pay-for-order page where the customer pays the advance with the store's normal payment methodsAny gateway the store already uses
WooCommerce order screen showing status COD: balance dueStatus moves to COD: balance due
Orders list with a COD column showing which orders have had the balance collectedBalance collected, marked once
Threshold dashboard for the last 30 days: COD orders, advance collected, balance to collect, refusal rateThe numbers update
The customer picks Cash on delivery.

Checkout says what happens next: pay a small part now, the rest in cash when the parcel arrives.

The advance is paid on the normal pay page.

Any gateway that works there works here. No gateway specific setup.

The order lands as COD: balance due.

The order keeps its full total. The advance is a small linked order, so refunds and reports stay honest.

The courier delivers and you mark the balance collected.

One order action. If the customer refuses at the door, you record that instead.

The dashboard counts it.

Orders, advance collected, balance still to collect, refusal rate.

Screens come from the real plugin on a fictional demo store. The names and numbers are made up.

What one refusal costs

The courier charges both ways. The sale never happens.

A small order costs as much to ship as a big one. So per rupee sold, the refusals that hurt most are the small orders nobody thought to protect.

Courier, parcel going out
you pay
Courier, parcel coming back
you pay
Packing and handling
you pay
Stock held while it travels
tied up
Money received
none
With an advance paid first
some of it comes back

The calculator below shows how big the advance needs to be to cover your own shipping.

Try an order

Pick the advance that covers a refusal.

Move the sliders. This runs the same arithmetic as the plugin's settings screen: a fee of 40 plus 1 percent, capped at 120, then an advance as a share of the total with a floor.

Rupees, because the demo store is Indian. The plugin uses your store's currency.

₹500₹30,000

Shipping both ways, packing₹600

5%50%

Customer pays now

₹1,368

Cash on delivery

₹7,752

Order ₹9,120 including a COD fee of ₹120

Refused with no advance₹140
Refused with this advance₹0

Setup

Four screens and you are done.

01

Rules read as one line.

Hide COD for postcode ranges and wildcards, countries, states, user roles, products, categories, shipping classes or shipping methods. Rules run top to bottom and the first match wins. Each one can show its own message.

  • Show COD only between a minimum and a maximum order
  • Free includes 3 rules, Pro has no limit
The Rules tab where each rule reads as one line
02

A fee with a live example.

Fixed, percent, or both. Set a lowest and highest amount, make it taxable or not, and name it yourself. The settings screen shows what a real order would pay as you type.

COD fee settings with a live example
03

An advance that you can check.

Percent or flat, with a lowest and highest advance. Ask on every COD order, only above a value, or only when a rule says so. The customer pays it online, then the order shows only the balance.

  • Unpaid advances cancel after the hours you set and stock is released
Partial COD settings with a calculator showing a real order
04

The balance stays in view.

The order screen shows the advance, the linked advance order and the COD balance. Two order actions: balance collected, or customer refused delivery. Refusals feed the dashboard.

An order with its advance, the linked advance order and the COD balance
demo-store.example/wp-admin
Rules settings screenCOD fee settings screenPartial COD settings screenOrder screen with advance and balance

01 / 04

Risk score Pro

A number, and the reasons for it.

Every COD order gets a score from 0 to 100. The order shows why: each sign that added points, in plain words. You pick the action for medium and high. Nothing is sent to an outside service, and it never runs on ordinary page views.

Tick and untick the signs. The points are the plugin's default weights, and you can change every one.

85High

Weight on your store

database queries from the plugin on an ordinary page view. No script and no stylesheet either.

It does its work at checkout, and nowhere else.

Home page, plugin off64 queries
Home page, plugin on64 queries
Search results, plugin off69 queries
Search results, plugin on69 queries
  • Ordinary pagenothing loaded
  • Checkoutone script, 1.4 KB
  • Advance payment pageone stylesheet, 1.6 KB

How this was measured. On 28 October 2026, version 0.1.0, on a local WooCommerce demo store with other plugins active. We loaded the home page and a search page with and without Threshold and read the query count WordPress reports. Every query was also checked for a call from plugin code: none. Checkout, order and admin screens do run queries, because that is where it works. The script is in the build folder as measure-queries.php.

Dashboard

See whether the advance is working.

Orders, advance collected, balance still to collect and refusal rate for the last 30 days, with a table that sets orders with an advance beside orders without one. Pro stretches it from 7 to 365 days and adds CSV and refusals by pincode.

COD orders

93

66 with an advance

Advance collected

₹99,086

61 advances paid

Balance to collect

₹156,083

On advance orders still open

Refusal rate

18.5%

12 of 65 finished orders

Does the advance help?

Refusal rate, orders with an advance against orders without one

Advance paid, 46 finished13.0%
No advance, 19 finished31.6%

What happened to them

All 93 COD orders

Delivered
53
In progress
22
Refused at delivery
12
Advance never paid
4
Cancelled
2

All figures come from a fictional demo store with made-up orders. They show what the report looks like, not what your store will see.

Dashboard table comparing refusal rates with and without an advance, and the balance to collect on delivery
The Threshold widget on the WordPress Dashboard: orders, balance to collect and refusal rate for the last 7 days

Left: the report. Right: the widget on the WordPress Dashboard, for the last 7 days.

Everything it does. Free and Pro.

Violet pills with a Pro tag need Threshold Pro. The rest is in the free plugin.

Rules by country, state and postcodeCOD fee, fixed or percentAdvance through any gatewayRisk score with reasonsProReminders for unpaid advancesProBlock and classic checkoutFee and advance tiersPro
Rules by day and timeProCustomer emails for the advanceBlocklist by phone, email, pincodeProBalance collected actionCourier update APIPro30 day dashboardEmail code to confirm CODPro
Cancel unpaid advances, release stockPincode checker on product pagesProCSV exportProWebhooks on order eventsProHPOS compatibleRefusals by pincodeProMin and max order for COD

Free and Pro

Start free. Add Pro when you need it.

FeatureFreePro
Minimum and maximum order for COD
COD fee: fixed, percent or both, with caps
Partial COD: advance paid online with any gateway
Block and classic checkout, emails, order actions
Dashboard for the last 30 days
Rules by place, customer, product and shippingUp to 3 rulesUnlimited
Rules by day of week and time of day
Fee and advance tiers by order value
Risk score on every COD order, with the reasons, and an action for risky ones
Customer risk: blocklist, repeat refusals, first-order advance
Email code (OTP) to confirm COD orders
Reminders, webhooks and a courier update API
Pincode checker for product pages
Dashboard for 7 to 365 days, CSV export, refusals by pincode

Your settings carry over. Install Pro and the free plugin switches off by itself.

Simple pricing. Pay once while seats last.

Free does the core job. The first 399 Pro licences are one payment for one site.

Free

Rules, the fee, the advance and a 30 day dashboard. On WordPress.org.

$0always


  • Minimum and maximum order for COD
  • COD fee, fixed, percent or both
  • Partial COD through any gateway
  • Up to 3 rules
  • Block and classic checkout
First 199 buyers

Pro

Everything in Free, plus judgment: risk scores, schedules, tiers and the tools around the balance.

$29one time, then $49


  • Unlimited rules, day and time rules, tiers
  • Risk score with reasons
  • Blocklist, repeat refusals, email code
  • Reminders, webhooks, courier API
  • Dashboard 7 to 365 days, CSV
Buy Pro for $29

Prices are in US dollars. A licence covers one site and includes updates. The first 199 licences are $29 one time, the next 200 are $49 one time, then Pro is $39 a year per site. Not included: SMS and WhatsApp codes, which are planned and not built. Payment is handled by Polar and the licence key arrives by email.

FAQs

Everything to know before you install

Short answers to what store owners check first. The long versions are in the docs.

Before you install

Yes. The fee, the advance note and the redirect to the advance payment page work on the block checkout and on the classic checkout.

Any gateway that works on the WooCommerce pay-for-order page. Cash on Delivery itself is removed from that page, so the advance has to be paid online. Offline gateways such as bank transfer confirm the advance only when you mark the advance order as paid.

No. The main order keeps its full total. A small linked order for the advance amount is created and paid on the normal pay page. When it is paid, the main order moves to COD: balance due. Refunds of the advance go through the advance order, which your gateway already understands.

No. They are hidden from the orders list and WooCommerce Analytics does not count them as revenue. Each one is linked from its main order.

On ordinary page views it runs no code, queries nothing and loads no file. On the checkout it loads one 1.4 KB script. How we measured is on the home page.