Money & rounding
Every amount in Clipp follows the same few rules. A unit price can have up to 4 decimals. Every other amount (line totals, subtotals, discounts, fees, balances) is in whole cents. Each line is rounded to the cent on its own, and the document total is the sum of those rounded lines, so an invoice always adds up to what it prints. Half a cent always rounds up. A return never credits back more than its line was charged.
These rules apply the same way to sale orders (invoices), purchase orders and PO invoices, on every screen, PDF and email. Feature pages link here instead of repeating them.
Who uses it
- Supplier staff type unit prices, quantities and weights, record returns, and read the totals on orders, invoices and purchase orders.
- Restaurants see the same figures on the invoice PDF, the invoice email, the pay page and the card checkout.
- Support answers "why is this a cent off?" questions. The FAQ covers the common ones.
The rules at a glance
| Rule | In plain words | Example |
|---|---|---|
| Unit price: up to 4 decimals | A line's price per unit (or per pound) can go below the cent | $16.299 / LB |
| Everything else: whole cents | Line totals, subtotals, discounts, fees, balances | $52.16 |
| Round each line, then add | A line total is rounded first; the subtotal adds the rounded lines | $52.16 + $25.99 = $78.15 |
| Half a cent rounds up | Never "banker's rounding" | $0.125 → $0.13 |
| Returns are capped at the line | Rounding can never make a return worth more than its line | $25.99 line, two halves returned → $13.00 + $12.99 |
| Prices show 2 to 4 decimals | Trailing zeros after the cents are dropped | $47.50, $16.299, $1.1876 |
| US dollars only | No other currency exists in the app |
Unit price: up to 4 decimals
A line's unit price (the price per case, per each, or per pound on a catch-weight line) can carry up to 4 decimal places. This is true on sale orders and purchase orders alike.
Typing a unit price
- Every unit-price field accepts up to 4 digits after the decimal point. The field stops accepting digits after the fourth, so typing
1.23456leaves1.2345in the box. The fifth digit is dropped as you type. It is not rounded. - The field is not padded: type
47.5and it stays47.5while you edit. Everywhere read-only it shows as $47.50. - Negative prices can't be typed. A $0.00 price is allowed.
- Validation messages:
- "Unit price is required and must be 0 or greater"
- "Unit price must be at least $0.00"
- "Price is required" / "Price must be at least 0" (catalog and product price fields)
This applies to every place a line price is edited: the new order dialog, the order lines table, the new purchase order dialog and the purchase order detail page.
Storing a unit price
The server stores the unit price at 4 decimals, rounding half up if anything sends more. So a price that reaches the server as 1.23455 is stored as $1.2346. In practice the app's own fields never send a fifth digit, because they stop accepting it.
Where the 4-decimal rule does not apply
| Amount | Decimals | Why |
|---|---|---|
| A product's catalog Price and Cost | 2 | It's the list price, not a line rate |
| Catalog Markup, Discount and Fixed Price | 2 | The catalog result is a list price too |
| A catalog's final price (base price adjusted) | 2, rounded half up | |
| Line totals, subtotals, discounts, fees, store credit, payments, balances | 2 | Money that changes hands is in cents |
| Quantities | up to 2 (catch-weight boxes: whole numbers) | See quantities and weights |
When a catalog price becomes a line's unit price (for example, a product picked into a new purchase order), it starts at its 2-decimal value. The supplier can then type up to 4.
Everything else is in whole cents
Line totals, subtotals, discounts, charges and fees, store credit, payments, refunds and balances are always whole cents. Every user-facing monetary amount other than a unit price is displayed with exactly 2 decimals on all surfaces: supplier app screens, restaurant PDFs, emails and the pay page.
Line totals: round each line, then add
Line total = unit price × quantity, rounded to the nearest cent. For a catch-weight line, the quantity is the weight (e.g. pounds), not the number of boxes.
The subtotal is the sum of the already-rounded line totals. The app never adds up raw amounts and rounds once at the end.
Worked example
| Line | Unit price | Priced on | Exact | Line total |
|---|---|---|---|---|
| Lamb rack (catch-weight) | $16.299 / LB | 3.2 LB | 52.1568 | $52.16 |
| Chicken thigh (catch-weight) | $2.599 / LB | 10 LB | 25.99 | $25.99 |
| Canned tomatoes | $2.00 / each | 4 | 8.00 | $8.00 |
| Subtotal | $86.15 |
Why "round then add" matters
Two lines at $0.125 each:
| Method | Line 1 | Line 2 | Subtotal |
|---|---|---|---|
| Clipp: round each line, then add | $0.13 | $0.13 | $0.26 |
| Add first, round once (not used) | 0.125 | 0.125 | $0.25 |
With "add first", the invoice would print two lines of $0.13 and a subtotal of $0.25, and it wouldn't add up. Rounding at the line means the stored total always equals the sum of the printed lines. It also matches how QuickBooks rounds, which is why a supplier who saw $1,396.27 in Clipp and $1,396.28 in QuickBooks no longer does. (#2160)
Edge cases
| Situation | Line total |
|---|---|
| Price $0.00 | $0.00. Allowed |
| Quantity 0 | $0.00. The order forms require at least 0.01 on a row you've started ("Quantity must be at least 0.01") |
| Catch-weight line with no weight yet | $0.00 until it's weighed. It never falls back to pricing by box count. See Catch-weight |
| Price or quantity missing or unreadable | Treated as 0, so the line is $0.00 |
Half a cent rounds up
Every rounding step (line totals, percentage discounts and charges, card fees, store credit) rounds half up: exactly half a cent goes to the next cent.
| Exact amount | Rounded | (Banker's rounding would give) |
|---|---|---|
| 0.125 | 0.13 | 0.12 |
| 12.995 | 13.00 | 13.00 |
| 0.124 | 0.12 | 0.12 |
| 0.248 | 0.25 | 0.25 |
Quantities shown on screen follow the same rule: a quantity of 1.005 shows as 1.01. (#2155)
Percentages: discounts, charges and fees
A percentage amount is worked out from the subtotal after returns and rounded half up to the cent on its own.
Example. Subtotal $86.15, a 5% one-time discount: 86.15 × 5% = 4.3075 → $4.31. Total: 86.15 − 4.31 = $81.84.
- A discount can't make the order total negative. Discounts are trimmed, last one first, so the total stops at $0.00.
- A flat discount or charge is used exactly as typed, in cents.
- How each discount, promotion, loyalty discount, fee and store credit appears on the invoice is covered in Invoices.
Returns never credit more than the line was charged
Each return is priced like any other line: unit price × returned quantity (or returned weight), rounded to the cent. But rounding each return on its own can add up to a cent more than the line was charged, even when nothing extra was returned. So the credit for a line's returns is capped at what the line was charged. When the rounded returns overshoot, the extra comes off the returns from the last one back. A line returned in full credits exactly what it was charged.
Worked example: two halves of one line
Chicken thigh, $2.599 / LB × 10 LB = $25.99. The restaurant returns it in two 5 LB returns.
| Exact | Rounded on its own | After the cap | |
|---|---|---|---|
| Return 1 (5 LB) | 12.995 | $13.00 | $13.00 |
| Return 2 (5 LB) | 12.995 | $13.00 | $12.99 |
| Total credited | $26.00 | $25.99 |
Without the cap the invoice would credit $26.00 for a line that billed $25.99, and the subtotal would go to −$0.01. With it, the line nets exactly $0.00.
What the invoice prints
- Sale orders (invoices) price every return row on the server. A line's reshelved and discarded returns print as one merged row, and that row is the sum of the rows' credits, so the printed credit always adds up.
- Purchase orders print one row for each recorded return, so each row is rounded and capped as above.
The returns dialog shows what the server will credit, so the figure on screen is the one saved.
Returns of goods from an earlier order
A return that doesn't point at a line on this invoice (goods billed on an earlier order, credited back here) is an additional return. It isn't priced or totalled on this invoice, so there is nothing to cap against.
Over-returns
Returning more than was sold is a quantity mistake, not a rounding one, and it's refused:
| Where | Message |
|---|---|
| Returns dialog (quantities) | "Reshelf + Discard cannot exceed the order quantity for any item." / "Returned quantity ({returned}) exceeds the ordered quantity ({ordered}) for {product}." |
| Returns dialog (catch-weight) | "Total reshelf + discard weight cannot exceed the original line weight." |
| Server, sale order | "item … returned quantity (…) exceeds the quantity sold (…)"; "Returned weight (…) exceeds available weight (…) for item …" (catch-weight) |
| Server, purchase order | "returned quantity (…) exceeds line quantity (…)" |
Knock-on effects of a return on the money
Chicken thigh $25.99 plus canned tomatoes $8.00. Subtotal $33.99, unpaid. Both 5 LB halves of the chicken are returned.
| Before | After | |
|---|---|---|
| Subtotal label on the invoice | Subtotal | Subtotal After Return |
| Subtotal | $33.99 | $8.00 |
| Chicken line credit | $13.00 + $12.99 = $25.99 | |
| Balance Due | $33.99 | $8.00 |
What else a return changes (stock, store credit when the invoice was already paid, bookkeeping, messages) is covered in the returns pages under Orders.
Totals can't go below zero
| Document | If returns or discounts would push it below $0.00 |
|---|---|
| Sale order (invoice) | Returns above the order's value are refused ("returns exceed the value of the order"). Discounts are trimmed to fit |
| Purchase order | Refused. "Subtotal (…) is negative" |
| Balance Due on an invoice | Shows $0.00 at least. An overpayment becomes store credit (see Store credit) |
Processing fees
The card fee is a percentage plus a fixed amount, rounded half up to the cent.
| Method | Fee | Example on $100.00 owed | Example on $57.43 owed |
|---|---|---|---|
| Card | 2.9% + $0.30 | 2.90 + 0.30 = $3.20 | 1.66547 + 0.30 → $1.97 |
| Bank (ACH) | No fee to the restaurant | $0.00 | $0.00 |
- No card fee is added when nothing is owed, or when the supplier has chosen to cover the card fee.
- The pay page tells the restaurant: "Credit card payments will include a 2.9% + 30¢ processing fee, applied by the payment provider."
- Who pays which fee is in Processing fees.
Quantities and weights
| Value | Can be typed with | Shown as |
|---|---|---|
| Quantity (standard product) | Up to 2 decimals | Up to 2 decimals, trailing zeros dropped: 3, 2.5, 7.2 |
| Quantity (catch-weight product) | Whole boxes only, at most 50 in the order forms | Whole number |
| Weight | Up to 2 decimals | 2 decimals, e.g. 21.40 LB |
Error for a fractional catch-weight quantity: "Quantity must be a full number (e.g. 1, 2, 3), not a fraction".
How amounts are shown
| Amount | Format | Examples |
|---|---|---|
| Unit price | US dollars, 2 to 4 decimals, trailing zeros after the cents dropped | $47.50 · $16.299 · $1.1876 · $2.00 |
| Every other amount | US dollars, exactly 2 decimals | $52.16 · $0.00 |
| Negative amount | A minus sign, never brackets | -$4.31 |
| Discounts and credits in an invoice's totals box | Shown with a minus sign | One Time Discount -$4.31 |
| Unknown or missing amount | A dash | -- |
The unit price uses the 2-to-4-decimal format everywhere a unit price is printed: order and invoice screens, invoice and PO invoice PDFs and order and invoice emails. A 2-decimal price looks exactly the same as any other amount ($2.00), so most invoices never show more than 2 decimals.
If the PDF printed $16.30/LB and the email printed $16.299/LB, a buyer comparing the two would see two different rates for the same line. (#2341)
Catch-weight line on each surface (3.2 LB of lamb rack at $16.299/LB, 1 case):
| Surface | Shows |
|---|---|
| Invoice PDF, price column | $16.299/LB |
| Invoice PDF, weight column | 3.20 LB |
| Email, quantity / price | 3.20 LB (1 CS) · $16.299/LB (the box unit is the product's own unit) (verify) |
| Card checkout | One line, "Invoice ICE-000042", for the amount owed |
| Line total, everywhere | $52.16 |
Where it shows up
Order detail and order items table · New order dialog · Returns dialog · Invoice list and invoice preview · Invoice PDF and packing slip · Order and invoice emails · Restaurant pay page · Card (Stripe) checkout · Purchase order detail, new purchase order dialog and PO invoice PDF · Statements · Sales reports.
Permissions
These are rules, not settings. Nobody can change them. Who can edit a price, a quantity or a return is set on each feature's own page.
Decisions
- Unit prices carry up to 4 decimals on purchase orders and sale orders alike. Vendors quote per-pound rates below the cent, and suppliers re-key them. (#2150, #2341)
- Catalog prices and markups stay at 2 decimals. Only a line's rate needs the extra precision.
- Round each line, then add. The stored total always equals the sum of the printed lines, and it matches QuickBooks. (#2067, #2160)
- Half up, always. Never banker's rounding, so $0.125 is $0.13 on every surface.
- Returns are capped at the line. Rounding alone must never produce a credit bigger than the charge, or a negative subtotal. (#2150)
- Returns are priced per row on the server and capped at the line. The credit always matches what's printed. (#2341)
- The server stores prices at 4 decimals itself. "A guard that lives only in the UI is not a guard." (#2341)
- Quantities show at most 2 decimals, half up. 7.199999 shows as 7.2. (#2155)
- Store credit is kept to the cent. Leftovers like $7,799.700000000001 were stalling cancellations, so amounts under 1¢ are refused. (#2368)
Known limitations
- A typed 5th decimal is dropped, not rounded. The unit-price field stops accepting input after the 4th decimal, so
1.23456becomes $1.2345, not $1.2346. (QA bug log BUG-004, Oct 2026.) - The restaurant app rounds a per-pound rate to the cent in the cart. A $16.299/LB line reads $16.30 / LB there. Its line total is still right.
- Card checkout shows one line. It prints "Invoice ICE-000042" for the amount owed, not each item's weight and per-pound price. A PayPal payment on these orders is refused ("PayPal isn't supported for sale orders yet"), so there are no PayPal fee or line rules here.
- Weights are kept to 3 decimals but shown to 2. (verify) A weight such as 3.205 LB prints as 3.21 LB, and printed weight × rate may then not equal the printed line total.
FAQ
Why does this invoice say $25.99 and not $26.00 for two returns of $13.00? The line was only charged $25.99, and a return can't credit more than its line. The last return is trimmed by a cent. See Returns never credit more than the line was charged.
My unit price shows three decimals ($16.299). Is that a mistake? No. Unit prices can carry up to 4 decimals so per-pound rates match the vendor's quote. Line totals are still in cents. See Unit price.
I typed 1.23456 and it saved as 1.2345. Why wasn't it rounded? The field takes at most 4 decimals and ignores anything after that as you type. Type the price rounded to 4 decimals yourself.
The line total isn't exactly price × quantity. It is, rounded to the nearest cent, with half a cent rounding up: $16.299 × 3.2 LB = 52.1568 → $52.16.
If I add the line totals myself, does it match the subtotal? Yes, always. The subtotal is the sum of the rounded lines. See Round each line, then add.
Our accounting system shows a different total by one cent. Check whether it rounds the total once instead of each line. Clipp rounds each line first, the same way QuickBooks does. If it still differs, check the percentage discounts, which are rounded on their own.
Why is there a $0.00 line on my invoice? Usually a catch-weight line that hasn't been weighed yet. It bills $0.00 until a weight is entered.
Why can't I change the catalog price to $4.995? Catalog prices are list prices and stay at 2 decimals. To charge a rate below the cent, set it on the order line, which takes up to 4.