Sell by Measure
By Kavio Labs · Version 1.0.2Sell products by weight, length, area or volume with decimal quantities, unit prices, step/min/max and a live price on the product page.
- WooCommerce10.1 – 11.2
- WordPress6.7+
- HPOS and blocksYes
by Kavio Labs · for WooCommerce 10.1+ on WordPress 6.7+
Shoppers propose their own price per item for the chosen variation and quantity; you accept, counter or decline in the admin or from the e-mail, or hidden rules answer at once. The agreed price applies only in that shopper's cart, once, until the deadline (HPOS + Cart/Checkout blocks).
Shoppers propose their own price per item for the chosen variation and quantity; you accept, counter or decline in the admin or from the e-mail, or hidden rules answer at once. The agreed price applies only in that shopper's cart, once, until the deadline (HPOS + Cart/Checkout blocks).
WooCommerce 10.1 - 11.2, WordPress 6.7+
Plugin: kv-make-an-offer · Version: 1.0.0 · Compatibility: WordPress 6.7+, WooCommerce 10.1+ (tested 11.2.1), PHP 7.4+, HPOS, Cart and Checkout blocks, block and classic themes
Shoppers propose their own price per item for the product, variation and quantity they choose. You accept, send a counter-offer or decline, in WooCommerce > Offers or straight from the e-mail, or hidden rules answer at once. An accepted offer is bought at the agreed price only in that shopper's cart, only for that product and quantity, only once and only until the deadline. Everything is checked on the server.
| Page | Contents |
|---|---|
| Installation | Requirements, installing, licence, updating, uninstalling |
| Configuration | Settings, automatic answers, rules per product and category, e-mails |
| Usage | Shopper flow, answering offers, cart and orders, privacy |
| FAQ | Taxes, coupons, themes, caching, other plugins |
| Developers | Store API, hooks, data |
WordPress 6.7 or later, WooCommerce 10.1 or later (tested up to 11.2.1), PHP 7.4 or later.
kv-make-an-offer-kv.zip (from My licenses) and click Install Now, then Activate. Activation creates two tables (offers and their history) and a page Your offer (/offer/, shortcode [kv_make_an_offer]) that opens offers from e-mail links. The page is hidden from automatic page menus, the sitemap and search engines.Upload the new zip the same way and choose "Replace current with uploaded". Offers, rules and settings are kept.
Deactivate and delete the plugin. Orders always keep the "Accepted offer" line information. Offers, rules, settings, e-mail settings and the offer page are removed only when Remove data on uninstall is on.
WooCommerce > Settings > Make an Offer. Amounts are prices per item, entered the way you enter product prices (with or without tax, as your store is set up). Percentages compare with the current price of the product or variation, sale price included.
| Setting | Default | What it does |
|---|---|---|
| Enable | On | Shows the Make an offer button and accepts new offers. Off: no new offers; accepted offers can still be bought until their deadline. |
| Offers on | All simple and variable products | Or only products and categories with the rule "Offers on". Grouped and external products never get the button. |
| Guests | On | Guests enter name and e-mail and agree to the processing of their data. Off: guests are asked to sign in. |
| Button text | Make an offer | Your own wording. |
| Maximum quantity per offer | 10 | 0 = no limit. The product minimum and the stock (unless backorders are allowed) are checked too. |
| Coupons | Off | Off: coupons never reduce items bought at an offer price, and a coupon is refused when only offer items are in the cart. On: coupons apply as usual. |
| Setting | Default | What it does |
|---|---|---|
| Auto-accept at (%) | empty | Offers at or above this share of the current price are accepted at once, e.g. 90. Empty = you answer every offer. |
| Auto-decline below (%) | 50 | Offers below this share are declined at once with a polite e-mail. Empty or 0 = off. |
| Counter-offers per offer | 3 | How many counter-offers you can send for one offer (0 = accept or decline only). |
| Days to answer an offer | 7 | Offers waiting for you expire after this many days (0 = never). |
| Days for the customer to answer a counter-offer | 3 | 0 = never expires. |
| Hours to buy at the accepted price | 48 | An accepted offer can be bought once within this time. |
Shoppers never see your thresholds.
| Setting | Default | What it does |
|---|---|---|
| Open offers per customer | 5 | Per account, or per e-mail for guests (0 = no limit). One open offer per product and variation always applies. |
| Offers per product in 30 days | 3 | Per customer (0 = no limit). |
| Offers per connection per hour | 10 | Anti-spam limit per IP address; the address is stored only as a keyed hash (0 = no limit). |
| Honeypot | On | A hidden field that only spam bots fill in. Every offer also needs a fresh security token (nonce). |
| Erase personal data of closed offers after (days) | 365 | Name, e-mail and messages of ordered, declined, withdrawn and expired offers are erased (0 = keep). Prices stay for the statistics. |
| Remove data on uninstall | Off | See Installation. |
Products > Edit > Product data > Make an Offer and Products > Categories > Edit:
| Field | Product | Category | Values |
|---|---|---|---|
| Offers | yes | yes | Inherit, Offers on, Offers off |
| Hidden minimum price | yes | - | Price per item; offers at or above it are accepted at once. It wins over the auto-accept percentage. |
| Auto-accept at (%) | yes | yes | Empty = inherit, 0 = never |
| Auto-decline below (%) | yes | yes | Empty = inherit, 0 = never |
Each field is resolved on its own: product, then the nearest category (the product's own categories, deepest first, then their parents), then the settings. Variations use the rules of their product. The product tab shows the rule now in effect.
WooCommerce > Settings > Emails lists eight e-mails, each with enable/disable, subject, heading, additional text and format. The template can be overridden in your theme (woocommerce/emails/kv-mao-offer.php).
| To | When | |
|---|---|---|
| Make an Offer: Offer received | customer | an offer waits for your answer |
| Make an Offer: Offer accepted | customer | accepted by you, a rule or the customer (counter-offer); with Add to cart at offer price |
| Make an Offer: Counter-offer | customer | you sent a counter-offer |
| Make an Offer: Offer declined | customer | declined by you or a rule |
| Make an Offer: Offer expired | customer | the answer or buy deadline passed |
| Make an Offer: Offer message | customer | you sent a message |
| Make an Offer: New offer | store (recipients setting) | a new offer, with signed Accept / Counter-offer / Decline links |
| Make an Offer: Offer update | store | the customer accepted or declined your counter-offer, sent a new offer or withdrew |
Enter the licence key and save; Check now verifies it at once. Without a valid key, after the 14-day start period, the Make an offer button is hidden and no new offers or counter-offers can be made. Accepted offers can still be bought until their deadline, and you can still answer and export offers. The admin is never blocked.
The offer page (link in every e-mail; My Account > Offers for customers with an account) shows the prices, the deadline, the history and the next step:
E-mail links contain a secret key and open the offer without an account. Please ask customers not to forward them.
Add to cart at offer price puts the product, variation and quantity of the offer into the cart as its own line. The line shows Accepted offer: #12: $52.00 each, up to 1, until ... in the classic and block cart, mini cart and checkout. The agreed price applies only:
The order line keeps Accepted offer: #12, visible in the order e-mails, My Account and the admin.
WooCommerce > Offers (with a counter in the menu) lists offers with the views Open, every status and All, statistics for the last 30 days (offers, acceptance rate, average discount, bought at offer price, revenue), a search (product, SKU, customer, e-mail, offer or order number) and Export CSV.
Open an offer to answer it: Accept, Send counter-offer (a value halfway is suggested; it must be above the offer and below the price), Decline, or Send message, each with an optional message to the customer. The screen shows the history with e-mail sent marks and the rules in effect for the product.
From the New offer e-mail you can also answer without signing in: the Accept / Counter-offer / Decline links open a store answer page (signed, valid 14 days) with the same forms. Nothing changes until you press a button there.
Each cart item carries extensions["kv-make-an-offer"]: offer_id (0 = none), price (agreed price of one item), max_quantity, expires (ISO 8601, UTC). quantity_limits.maximum of offer lines is the offered quantity.
| Hook | Type | Arguments |
|---|---|---|
kv_mao_product_allowed | filter | bool $allowed, WC_Product $product: whether offers can be made |
kv_mao_offer_created | action | array $offer, string $auto (accept, decline or empty) |
kv_mao_staff_action | action | int $offer_id, string $action (accept, counter, decline, message) |
kv_mao_customer_action | action | int $offer_id, string $action (accept, decline, counter = new offer, withdraw) |
{prefix}kv_mao_offers and {prefix}kv_mao_history (statuses: pending, countered, accepted, declined, withdrawn, expired, ordered; dates in UTC)._kv_mao_rule, term meta kv_mao_rule, option kv_mao_settings.kv_mao (id, th = hash of the offer's secret key); order item meta _kv_mao_offer_id (hidden) and kv_mao_offer (shown as "Accepted offer").kv_mao_hourly (group kv-make-an-offer): expiry and retention.kv_mao_quote (GET: price and nonce) and kv_mao_submit (POST, nonce kv_mao_submit).No. The offer, the rules, the access to the offer and the cart price are all checked on the server. The cart line is tied to the offer's secret key; a forged or copied line falls back to the normal price.
The price as your shop displays it. The plugin converts it to the way you enter prices and keeps that ratio with the offer, so the shopper pays exactly the agreed displayed price.
Not by default: coupons skip offer items and are refused when only offer items are in the cart. You can allow them.
Yes. The dialog fetches a fresh security token and the price when it opens; the offer page and buy links send no-cache headers.
Simple and variable products with a price. Grouped and external products, and products without a price, never show the button.
The offer keeps the price at the time it was made for the rules and statistics; the cart uses the agreed price.
Yes (tested with Twenty Twenty-Five, block and classic cart and checkout, HPOS on).
Offers accept the quantity format of the product, including decimals.
More for WooCommerce
Sell products by weight, length, area or volume with decimal quantities, unit prices, step/min/max and a live price on the product page.
Year/make/model parts search for WooCommerce: fitment table per product, CSV import, My Garage, fits / does not fit badge and vehicle-filtered shop and search pages.
EN 16931 e-invoices and credit notes from WooCommerce orders: XRechnung (CII/UBL), ZUGFeRD/Factur-X PDF/A-3 and Peppol BIS 3.0 UBL, gapless numbering, B2B checkout fields, validation, e-mail attachments, My Account downloads and ZIP export.