Negotiation

Name Your Price on Shopify, Without Losing the Floor

Letting shoppers name a price only works if there is a hard stop underneath it. How a margin floor works, where to set it, and what it must never be.

“Name your price” has an obvious appeal and an obvious terror. The appeal: shoppers love it, it converts people who would never have paid list, and the price discovery tells you things a static page never will. The terror: someone types in a number that loses you money, and something in the stack says yes.

The whole of the difference between those two outcomes is one design decision — whether the floor is a rule or an invariant.

A rule versus an invariant

A rule is an instruction. “Do not go below this price.” Rules live in prompts, in configuration that some code path might not read, in a conditional that covers the three cases someone thought of. Rules are fine until an input arrives that nobody anticipated, and then they are not there at all.

An invariant is a property of the system that holds by construction. The floor is applied to the returned price, every time, as the last thing that happens before the number leaves the function. There is no path through the code that produces a price and skips the clamp, because the clamp is not a branch. It is the exit.

The practical test is simple: can you describe a sequence of shopper offers that gets under the floor? If answering that requires reading the code carefully, you have a rule. If the answer is obviously no because nothing can return without passing through one line, you have an invariant.

This is worth being pedantic about, because it is the difference between a feature you can leave running overnight and one you have to watch.

How to actually prove it

An invariant you have not tested is a hope. The test that matters here is not a handful of examples; it is a property test.

The shape of it is this. Generate a random list price, a random floor below it, a random posture, a random number of rounds, and then a random sequence of shopper offers — including absurd ones. Zero. Negative. Higher than list. The same number eleven times. A number that jumps around. Run the engine through the whole sequence and assert one thing: every price it returned was at or above the floor.

Then run that a few thousand times.

What this buys you is coverage of the cases you did not think of, which are the only cases that ever cause the problem. A hand-written test suite tests your imagination. A property test tests the invariant.

Where to actually set the floor

The floor is not your cost. This is the most common mistake, and it is expensive in the other direction.

Your floor should be the lowest price at which you are genuinely happy to make the sale, after everything that sale costs you: the item, the payment fee, the pick and pack, the shipping you are absorbing, and a realistic allowance for the proportion that comes back. If you set the floor at cost, every deal struck near it is work you did for nothing.

A useful way to find it: think of the number you would give a friend of the business who asked for a deal. Not your best customer, not a wholesale account — someone who asked nicely once. That number is usually close to right, and you already know it instinctively.

Then, separately, set your discount ceiling: the most you are willing to come down at all. The floor protects you from disaster; the ceiling shapes the negotiation. A campaign where the ceiling is ten percent and the floor is twenty-five will behave very differently from one where they are the same number, and only one of those is a real negotiation.

What the shopper sees

The floor should be invisible and absolute. The shopper never sees the number, never gets told “that is below our floor” in those words, and never gets a hint about how close they are to it. What they get is a counteroffer that stops moving.

That is the honest experience. The negotiator concedes, the concessions get smaller, and eventually it says the same number twice. Most people read that correctly — this is the price — and take it or leave it. A shopper who tries to grind past it finds there is nothing there to grind.

The stacking problem

One more thing, because it catches people out. If your shopper can also earn discounts by doing things — a follow, a sign-up, a second item — then the floor has to hold against the combination, not each part.

A negotiation that lands at ninety percent of list, plus three rewards worth three percent each, is not ninety percent of list. It is eighty-one. If your floor was checked during the negotiation and then the rewards were subtracted afterwards, you have a leak, and it is exactly the kind of leak that shows up first in your worst-case orders.

Two protections are worth having. Cap the total of the earned rewards as a fraction of list — twenty percent is a reasonable default. And apply the floor to the final payable price, after everything, not to the negotiated subtotal. Then the arithmetic can only ever land where you said it could.

Let them 🤝 earn it, and keep your 📐 floor

Set the lowest price you'll take, price the favours, and let shoppers work their way down to it.