Ask a print shop what 500 business cards cost and you’ll get one number: $65. Ask what 250 custom pens cost and you’ll get a different kind of answer: so much each, and cheaper the more you order. Ask about a one-off banner and it’s simply one price. Print is priced three different ways, often in the same shop, so the software has to handle all three side by side.
For one of the biggest print franchise networks, pricing also had to work across three levels: headquarters, each franchise location, and the microstores each location runs for its own customers. Every level needs its margin, and nobody downstream should be able to undercut the level above by accident. We built the pricing into the network’s own backend and panels; the DesignMint Studio SDK’s order panel is where customers see it.
Three pricing models, in plain words
Every product uses exactly one of three models, chosen on the Pricing step when it’s created:
- Product pricing: a single price. One banner, one price.
- Range pricing: a price per unit that depends on how many you order, in bands. For example, pens at $1.20 each for 1–99, $0.95 each for 100–499, and $0.80 each from 500.
- Fixed pricing: a total price for set quantities, the way print has always sold cards and flyers. For example, 250 cards for $45, 500 for $65 and 1,000 for $95.
- 1–99 pens50 × $1.20$60.00
- 100–499 pens250 × $0.95$237.50
- 500+ pens600 × $0.80$480.00
Bands join with no gaps, 99 then 100, 499 then 500. Only the last band is open-ended.
Switching a product from one model to another is deliberate. The admin is warned that saving the new model replaces the old one, because a product only ever uses one model at a time.
Cost, markup, margin and price, always in step
Each pricing row has four linked fields: Cost, Markup %, Margin % and Price. Change one and the linked numbers update: set a markup or a margin and the price follows, or set a price and both percentages follow. Cost stays where you put it. It sounds small, but it removes the most common pricing mistake in print: confusing markup with margin.
Markup is how much you add on top of cost, as a share of the cost. Margin is how much of the price is profit, as a share of the price. Whenever there is any profit, they are different numbers.
Markup 50%profit $5 ÷ cost $10
Margin 33.3%profit $5 ÷ price $15
- Cost
- $10.00
- Markup %
- 50%typed
- Margin %
- 33.3%
- Price
- $15.00
- Cost
- $10.00
- Markup %
- 66.7%
- Margin %
- 40%typed
- Price
- $16.67
A few rules keep the numbers honest. Margin is capped just under 100%. Prices round to the cent and percentages to one decimal place. Range bands must join up with no gaps, so a band starting at 100 has to follow one that ends at 99, and only the last band can be open-ended. A price can never go below cost. The server checks the band and price rules again before it saves, so nothing slips through from an old browser tab.
The server picks the price, not the browser
When a customer adds 250 pens to their cart, the storefront doesn’t send a price. It sends the quantity, and the backend finds the matching band and sets the unit price itself. A quantity that matches no band is refused.
Fixed packs needed one extra step, because the shop thinks in packs and the cart thinks in units. A 500-card pack priced at $65 is stored as a pack total, then turned on the server into a unit price of $0.13 × 500 when it goes into the cart.
The storefront’s pricing endpoints send only the band structure and the selling price. Cost, markup and margin are left out.
What the customer sees
- Fixed packs appear as a dropdown with only the allowed quantities, so nobody can order 437 business cards.
- Ranges use a quantity stepper, with the price shown per unit, before tax.
- Product cards show a starting price: the smallest pack and its total for packs, like “From $45 per 250 units”, or the lowest unit price for ranges, like “From $0.80 per unit at 500+ units”.
- Inside the studio’s order panel, a hint shows the best volume price and how far away it is, like “$0.80 at 500+ · 250 more to unlock”.
Three levels, three margins
The hard part wasn’t the pricing models. It was pricing across a network. When a franchise location adds an HQ product to its store, two settings decide what happens to the price:
- Resell. With resell on, HQ’s selling price becomes the location’s cost, and that cost is locked. The location then sets its own markup on top, so HQ keeps its margin and the location earns its own.
- Lock mode: no lock, lock selling price, lock cost, or lock both. HQ can let a location price freely, or keep a price fixed across the whole network.
The band structure itself is always inherited: in the location’s panel the price breaks are fixed, and depending on the lock, only their prices can be edited. For single-price products, microstores also get a price floor, usually a minimum the location sets, and the panel won’t save a price below it. The location sees a plain explanation of what it can change, such as “Inherited from the source. Cost is locked — set your Markup, Margin, and Price.”
| Cost | Markup | Selling price | |
|---|---|---|---|
| HQ | $10.00 | 50% | $15.00 |
| Location (resell on) | $15.00, locked | 40% | $21.00 |
| Microstore | Inherited | Its own | Not below its floor |
How the pricing step grew
Quantity bands shipped first, in May 2026. Clone rules followed in July, once it was clear that copying prices down a network needed protection. In September, single-price products moved into the same model: the old separate price inputs were removed from all three panels, and a single price now uses the same Cost, Markup, Margin and Price row as the bands, with the same clone rules. That change touched 78 files and removed more code than it added.
One bug from along the way is worth sharing. Saving studio changes was quietly switching a product’s “customizable” setting off, so the studio vanished from the storefront. The cause was a request check that treated a missing field as “false”, plus a database read that wasn’t awaited. Now a field that isn’t sent simply stays as it was.
How this compares
To be fair to everyone: quantity pricing on its own isn’t unique. OnPrintShop offers fixed-quantity and range-based pricing, InkSoft’s pricing rules set markups by quantity break, and Aleyant Pressero can limit orders to set quantities and build pricing engines from simple to complex. Any serious web-to-print platform does some version of it.
Where this project put its effort was everything around the models: four linked fields that keep markup and margin straight, prices set on the server from the quantity ordered, and resale pricing with cost locks and price floors for each level of a franchise network.
What we learned
- Price the way the trade prices. Print sells packs and ranges, so the software should too.
- Show markup and margin side by side. Most pricing errors are one being mistaken for the other.
- Let the server work out the price from the quantity, never the browser.
- In a network, protect each level’s margin with structure, not trust.
Common questions
What is range pricing?
A price per unit that depends on the quantity ordered, set in bands. For example, $1.20 each for 1–99 units and $0.95 each for 100–499.
What is fixed pricing?
A total price for a set quantity, like 500 business cards for $65. Customers choose from the allowed quantities only.
What is the difference between markup and margin?
Markup is profit as a share of cost; margin is profit as a share of price. An item that costs $10 and sells for $15 has a 50% markup but a 33.3% margin.



