Calculator overview
Inputs and outputs
This summary comes from the calculator's published input and output contract.
Inputs
- What-if price multiplier (required) Conditional
-
Unit x Default 1 Range 0 to 5
About this input
A what-if multiplier on gross sales, discounts and refunds of every sales row, from 0 to 5. Units stay the same; 1 means no change. The rows of the what-if table are centred on it.
- Shared cost pools
-
When omitted Blank
Default 1 row
About this input
Up to five shared cost pools, each with an ID, an amount and the method that spreads it over the sales rows: by positive net revenue, by net units or by the activity count of its own column. No pool at all is allowed.
Column Range or allowed values Pool ID Not declared Pool amount 0 to 1000000000 Allocation method Revenue, Units, Activity - Sales summary (required)
-
Default 2 rows
About this input
Up to fifty sales summary rows, each naming a product, a customer and a channel, with units shipped and returned, gross sales, discounts, refunds, the direct costs of that row only, and one activity count for each shared cost pool row.
Column Range or allowed values Row ID Not declared Product ID Not declared Customer ID Not declared Channel Not declared Units shipped 0 to 1000000 Units returned 0 to 1000000 Gross sales 0 to 1000000000 Discounts 0 to 1000000000 Refunds 0 to 1000000000 Direct costs 0 to 1000000000 Activity for pool row 1 0 to 1000000000 Activity for pool row 2 0 to 1000000000 Activity for pool row 3 0 to 1000000000 Activity for pool row 4 0 to 1000000000 Activity for pool row 5 0 to 1000000000 - Products (required)
-
Default 1 row
About this input
Up to ten products: an ID, the cost of one unit, and the share of a returned unit cost that comes back as stock that can be resold.
Column Range or allowed values Product ID Not declared Unit cost 0 to 100000 Return recovery 0 to 1 - Focus customer (required) Conditional
-
Default CAFE
About this input
The customer that the focus results and the what-if table follow, chosen from the Customer IDs in the sales table. Each Customer ID appears in the list once, in table order.
- What-if direct cost multiplier (required) Conditional
-
Unit x Default 1 Range 0 to 5
About this input
A what-if multiplier on every product unit cost, and so on every return credit, and on every row direct cost, from 0 to 5. Shared cost pools do not change. The columns of the what-if table are centred on it.
- Table step, price multiplier (required) Conditional
-
Unit x Default 0.05 Range 0.01 to 0.5
About this input
The spacing of the 11 price-multiplier rows of the what-if table, above 0 and at most 0.5. The lowest row must not fall below 0, or the table is withheld.
- Table step, direct cost multiplier (required) Conditional
-
Unit x Default 0.05 Range 0.01 to 0.5
About this input
The spacing of the 11 direct-cost-multiplier columns of the what-if table, above 0 and at most 0.5. The lowest column must not fall below 0, or the table is withheld.
Outputs
- Refunds
-
No unit declared
About this output
Refunds of every sales row after the what-if price multiplier, each row posted to the cent.
- Product cost, net of return credit
-
No unit declared
About this output
Units shipped times unit cost, less the credit for returned stock that can be resold, summed over the sales rows.
- Shared cost pools
-
No unit declared
About this output
The total of the shared cost pools, each posted to the cent.
- Units returned
-
Unit units
About this output
Units returned, summed over the sales rows.
- Unallocated shared costs
-
No unit declared
About this output
Shared cost pools whose driver is zero in every row: they are reported, never divided, and count only in fully loaded profit.
- Return credit
-
No unit declared
About this output
Units returned times unit cost times the product return recovery: the returned stock that comes back to be sold again.
- Net revenue
-
No unit declared
About this output
Gross sales minus discounts minus refunds, summed over the sales rows.
- Contribution
-
No unit declared
About this output
Net revenue minus product cost minus direct costs, before any shared cost. The allocation method never changes it.
- Allocated shared costs
-
No unit declared
About this output
The part of the shared cost pools spread over the sales rows. Every pool with a driver is spread in full, to the cent.
- PP02 Sales Check
-
No unit declared
About this output
The check of each sales row: blank for an unused row, OK, or the first problem found, starting with its code.
- Gross sales
-
No unit declared
About this output
Gross sales of every sales row after the what-if price multiplier, each row posted to the cent.
- Discounts
-
No unit declared
About this output
Discounts of every sales row after the what-if price multiplier, each row posted to the cent.
- Direct costs
-
No unit declared
About this output
Direct costs of the sales rows after the what-if direct cost multiplier, each row posted to the cent.
- Table1 PCP Values
-
Unit $0.00
About this output
Each cell is the focus customer contribution recalculated with every gross sale, discount and refund multiplied by the row value and every unit cost and direct cost by the column value, minus its shared costs held as allocated in your own case. Units stay the same. The middle cell is your own case.
- Table1 PCP Row Input
-
No unit declared
About this output
Machinery, not an input: the cell the table substitutes each row price multiplier into. The rest of the time it repeats the what-if price multiplier. Change the input, never this cell.
- Table1 PCP Row Axis
-
No unit declared
About this output
The price multipliers down the left of the what-if table: your own multiplier in the middle, five equal steps below and five above.
- Warning messages
-
No unit declared
About this output
Every warning that applies, separated by semicolons. Blank when none applies.
- Warnings
-
No unit declared
About this output
Every warning the model can raise, whether it applies to this result (1) or not (0), and its message when it applies.
- Warnings
-
Unit count
About this output
How many warnings apply to this result. The warnings table lists them.
- Table1 PCP Corner
-
Unit 0.75
About this output
The figure the what-if table recalculates, the focus customer allocated profit, placed in its top-left corner as the spreadsheet requires. It is formatted away.
- Workbook self-check
-
No unit declared
About this output
PASS when every internal consistency check of this result holds. FAIL means the result should not be relied on.
- Reference data version
-
No unit declared
About this output
The version of any reference data used. None: every value is your own amount or policy.
- Units shipped
-
Unit units
About this output
Units shipped, summed over the sales rows. Hours or days are fine.
- Table1 PCP Column Input
-
No unit declared
About this output
Machinery, not an input: the cell the table substitutes each column direct cost multiplier into. The rest of the time it repeats the what-if direct cost multiplier.
- Table1 PCP Column Axis
-
No unit declared
About this output
The direct cost multipliers across the top of the what-if table: your own multiplier in the middle, five equal steps below and five above.
- Status code
-
No unit declared
About this output
The short code of the reason shown in the status, or OK.
- Focus customer allocated shared costs
-
No unit declared
About this output
The shared costs allocated to the sales rows of the focus customer.
- Results by customer
-
No unit declared
About this output
One row per customer, in order of first appearance in the sales table, with the same measures as the product results. Margins are blank when net revenue is zero or below.
- Contribution margin
-
Unit %
About this output
Contribution as a share of net revenue. Blank (not applicable) when net revenue is zero or below.
- Focus customer contribution
-
No unit declared
About this output
Contribution of the sales rows of the focus customer, before shared costs.
- Focus customer allocated profit
-
No unit declared
About this output
The focus customer contribution minus its allocated shared costs. It is not the profit the company would lose without the customer: see profit without the focus customer.
- Focus customer allocated margin
-
Unit %
About this output
The focus customer allocated profit as a share of its net revenue. Blank (not applicable) when its net revenue is zero or below.
- Results by channel
-
No unit declared
About this output
One row per channel, in order of first appearance in the sales table, with the same measures as the product results.
- Model version
-
No unit declared
About this output
The version of the model that produced these results.
- Status
-
No unit declared
About this output
OK, or the first reason the result needs attention: NOT VALID for inputs the model cannot use and CHECK for a result to look at.
- Custom assumptions
-
No unit declared
About this output
Whether any reference value was overridden. Always FALSE here: the model uses no reference data.
- From gross sales to profit
-
No unit declared
About this output
The steps from gross sales to fully loaded profit, with each deduction shown as a negative amount.
- Allocation audit
-
No unit declared
About this output
The share of each shared cost pool posted to each sales row, to the cent, and the row total. Blank under an unused pool row; zero under a pool with no driver.
- Allocated profit
-
No unit declared
About this output
Contribution minus the allocated shared costs.
- Results by product
-
No unit declared
About this output
One row per product in the products table: units shipped and returned, net revenue, product cost, direct cost, contribution and its margin, allocated shared costs, allocated profit and its margin. A product with no sales row shows zeros. Margins are blank when net revenue is zero or below.
- PP02 Pools Check
-
No unit declared
About this output
The check of each shared cost pool row: blank for an unused row, OK, or the first problem found, starting with its code.
- Shared cost pools
-
No unit declared
About this output
One row per shared cost pool: its method and amount, the driver total over the sales rows (dollars of positive net revenue, net units or activity), the cost per driver unit (blank when the total is zero), the allocated and unallocated amounts and the part allocated to the focus customer.
- Results by sales row
-
No unit declared
About this output
One row per sales row: its net revenue, product cost net of return credit, direct cost, contribution, allocated shared costs and allocated profit, each posted to the cent.
- Fully loaded profit without the focus customer
-
No unit declared
About this output
The company fully loaded profit if the sales rows of the focus customer were removed and every shared cost pool stayed the same size: fully loaded profit minus the focus customer contribution.
- PP02 Products Check
-
No unit declared
About this output
The check of each product row: blank for an unused row, OK, or the first problem found, starting with its code.
- Sales rows with an allocated loss
-
Unit rows
About this output
How many sales rows have an allocated profit below zero.
- Fully loaded margin
-
Unit %
About this output
Fully loaded profit as a share of net revenue. Blank (not applicable) when net revenue is zero or below.
- Focus customer net revenue
-
No unit declared
About this output
Net revenue of the sales rows of the focus customer.
- Focus customer contribution margin
-
Unit %
About this output
The focus customer contribution as a share of its net revenue. Blank (not applicable) when its net revenue is zero or below.
- Customers with an allocated loss
-
Unit customers
About this output
How many customers have an allocated profit below zero.
- What-if table withheld because
-
No unit declared
About this output
Blank when the what-if table is shown. Otherwise the reason it is withheld: a table step would take the lowest row or column below zero. Every other result is still calculated.
- Fully loaded profit
-
No unit declared
About this output
Contribution minus every shared cost pool, allocated or not: the company profit of these sales rows.
LogicCommons is in beta. If a result, label, or reference looks wrong, tell us here; we read every message.
Methodology
Purpose and model boundary
This calculator shows where profit comes from in one summary of your sales. You enter your products, up to 50 sales summary rows that each name a product, a customer and a channel, and up to five shared cost pools. The spreadsheet works out each row's net revenue, product cost and contribution, spreads each shared pool over the rows to the cent, and sums the results by product, customer and channel, with one customer you choose as the focus.
One Calculate fills every result section. The calculator has no optimizer, no target search and no simulation, because this question needs none: every figure follows directly from what you enter. An 11 by 11 what-if table of price against direct cost for the focus customer is calculated with them.
Every figure on this page is computed by the spreadsheet; the page adds nothing to it. All sales, costs and pool amounts are your own inputs, and an allocated figure depends on the method you choose. Allocated profit is not the profit a customer adds. The shared costs do not leave when a customer does, so the page also shows what the company would earn without the focus customer. The calculator is not certified financial reporting and does not guarantee a profit.
Inputs and units
- Products, up to 10 rows:
- a product ID: a capital letter, then up to 15 capital letters or digits, each ID used once;
- the unit cost, from 0 to 100,000;
- the return recovery, from 0% to 100%: the share of a returned unit's cost that comes back as stock you can sell again. Blank means 0%.
- Sales summary, up to 50 rows, filled from the top without a blank row between used rows. Rows can be typed or pasted from a spreadsheet. Each row has:
- a row ID, in the same form as a product ID, each ID used once;
- a product ID, which must be in the products table;
- a customer ID and a channel, in the same form. There can be at most 10 different customers and 3 different channels;
- units shipped, from 0 to 1,000,000; hours or days are fine;
- units returned, in the same range, blank means 0. It may be more than units shipped, for returns of earlier sales;
- gross sales, required, and discounts, refunds and direct costs, each from 0 to 1,000,000,000; a blank discount, refund or direct cost means 0. Direct costs are the shipping, service and channel costs that belong to this row only;
- up to five activity counts, from 0 to 1,000,000,000, blank means 0. Activity column 1 is read only by pool row 1, column 2 by pool row 2, and so on, and only when that pool uses the Activity method.
- Shared cost pools, up to 5 rows, which may be empty: a pool ID in the same form, used once; the amount, from 0 to 1,000,000,000; and the method, Revenue, Units or Activity.
- Focus customer: one of the customer IDs in the sales table. The list follows the table as you type.
- Optional, under "Optional: what-if table":
- the price multiplier, from 0 to 5 (1 unless you change it), which multiplies gross sales, discounts and refunds on every row, with units unchanged;
- the direct cost multiplier, from 0 to 5 (1 unless you change it), which multiplies every unit cost, and so every return credit, and every row's direct costs. Shared pools do not change;
- the spacing of the table's rows and columns, from 0.01 to 0.5 (0.05 unless you change it).
Money is in dollars; percentages are shares of a unit cost or of net revenue.
Governing relationships
Net revenue. Each row's net revenue is gross sales minus discounts minus refunds. Each amount is posted to the cent, rounding half away from zero, after the price multiplier. Net revenue can be below zero when refunds and discounts exceed the sales.
Product cost and the return credit. A row's product cost is the units shipped times the unit cost, less a credit for returned stock that can be sold again: the units returned times the unit cost times the product's return recovery. Because the recovery is at most 100%, the credit never exceeds what those units cost.
Contribution. Contribution is net revenue minus product cost minus direct costs. It comes before any shared cost, so the choice of allocation method never changes it.
Allocation. Each pool is spread over the sales rows by one method. Revenue spreads it by each row's net revenue, and a row with zero or negative net revenue takes no share. Units spreads it by units shipped minus units returned, never below zero. Activity spreads it by that pool's activity column. A row's exact share is the pool amount times its driver divided by the total driver.
To the cent. Each share is rounded down to the cent, and the cents left over go one at a time to the rows with the largest remainders, the lowest row ID first in a tie. Row IDs order as text, so R1 comes before R10 and R10 before R2. Every pool therefore adds up exactly, and every posted share is within one cent of its exact share.
A pool nobody drives. When a pool's driver total is zero it is reported as unallocated and never divided.
Profit. Allocated profit is contribution minus the allocated shares. Fully loaded profit also subtracts the unallocated pools, so at the company level it is contribution minus every pool. Changing an allocation method moves profit between rows and customers; the company total changes only when a pool becomes unallocated.
Margins. Contribution margin, allocated margin and fully loaded margin each divide by net revenue. A margin on zero or negative net revenue means nothing, so it is left blank.
Profit without the focus customer. This is the company's fully loaded profit minus the focus customer's contribution: what is left if its rows are removed and every shared cost pool stays the same size. A customer can show an allocated loss and still add to the company's profit. When its contribution is above zero, dropping it lowers company profit by that contribution, if the shared costs do stay.
What-if table. Rows are 11 price multipliers centred on yours and columns are 11 direct cost multipliers centred on yours, each one step apart, with quantities fixed. Each cell recalculates the focus customer's own sales rows at that price and direct cost, less its shared costs held as allocated in your own case, through the spreadsheet's own two-variable data table. The shares are not spread again at each cell, because that would make every calculation many times slower. Every price moves together, so revenue shares usually stay close, and on the worked examples the held shares give the same table as a full re-spread, to the cent. They are not always close: revenue is rounded to the cent on each row, so very small rows can change share sharply, and the difference is not limited to a cent. With two rows of gross sales $0.01 and $0.02 at no cost, a $1,000 revenue pool is allocated $333.33 and $666.67. At a price multiplier of 0.5 the two rows both round to $0.01, so a full re-spread would allocate $500 and $500. The first row's cell shows -$333.32 where a full re-spread would show -$499.99, a difference of $166.67. The middle cell equals the focus customer's allocated profit. When a step would take the lowest row or column below 0, the table is withheld with that reason and every other result still stands. A multiplier of 0 always withholds it.
Calculation sequence
The spreadsheet first checks every product, sales and pool row and every setting, and stops with NOT VALID at the first problem it finds, with every figure at 0. It then posts each sales row's revenue and costs to the cent, spreads each pool with its leftover cents, and sums the rows by product, customer and channel in integer cents. The what-if table recalculates the focus customer's rows at its 121 combinations. A block of consistency checks, including that each pool adds up exactly, that the summaries add up to the company totals, that the steps from gross sales reach the profit figures, and that the table's middle cell equals the focus customer's allocated profit, runs before the status is returned.
Outputs and interpretation
The headline gives the company's contribution, its fully loaded profit and the focus customer's allocated profit. The result sections follow.
- Company: gross sales, discounts, refunds, net revenue, product cost, return credit, direct costs and contribution margin; the pools in total, allocated and unallocated; allocated profit and fully loaded margin; units shipped and returned; the number of sales rows and customers below zero after shared costs; and the steps from gross sales to fully loaded profit.
- Focus customer: its net revenue, contribution and margin, its allocated shared costs and allocated margin, and the company's profit without it, assuming every shared cost pool stays the same size.
- By customer, By product, By channel: units, net revenue, product cost, direct costs, contribution and margin, allocated shared costs, allocated profit and margin for each. Customers and channels appear in the order they first appear in the sales table; products in table order, including one with no sales.
- Shared cost pools: each pool's method, amount, driver total, cost per driver unit, allocated and unallocated amounts and the part that falls on the focus customer; and each sales row's share of each pool.
- Sales rows: each row's net revenue, costs, contribution, allocated shared costs and allocated profit.
The steps from gross sales to profit are drawn as signed bars that start at zero. They do not float like a waterfall chart, so read each bar on its own.
For nearby questions, the Price Volume Profit Scenario Simulator projects profit when demand responds to price, and the Quote Pricing & Deal Margin Optimizer prices one deal from its lines.
Validation and status logic
The workbook returns one status, chosen in this order: NOT VALID, then CHECK, then OK.
- NOT VALID names the first problem, in this order: a product row (a blank row above a used row, a missing or malformed ID, a repeated ID, a unit cost or recovery outside its limits); no product; a sales row (a gap, a missing or malformed ID, an amount outside its limits, a repeated row ID, a product not in the products table); no sales row; more than 10 customers; more than 3 channels; a pool row (a gap, a missing or malformed ID, an amount outside its limits, a method not in the list, a repeated ID); a focus customer not in the sales table; a multiplier outside 0 to 5; and a table step outside its limits. NOT VALID is a refusal, not a numeric answer: every figure is withheld.
- CHECK accompanies a valid result that needs a look because a workbook consistency check failed.
- OK otherwise.
Warnings say when sales rows lose money after shared costs, when a pool has no driver so it is not allocated, when a row has discounts and refunds above its gross sales, when a row returns more units than it ships, when activity is entered for a pool that does not use it, when the focus customer shows an allocated loss but a positive contribution, and when the what-if table is withheld. A warning never changes the status.
Assumptions and limitations
- Capacities are 10 products, 50 sales rows, 10 customers, 3 channels and 5 shared cost pools.
- One summary period: rows from different periods are simply different rows, and there is no dating, payment timing, tax or currency conversion. This is an accounting view, not a cash view.
- Customers and channels are the IDs typed on the sales rows; upper and lower case are different characters, and IDs use capital letters only.
- A price or direct cost multiplier applies to every row together, with quantities fixed. The calculator does not estimate how customers respond to price.
- An allocation is a way of sharing a cost, not a measure of what a customer causes. Different methods give different customer results for the same company total.
- Profit without the focus customer assumes no shared pool shrinks when the customer leaves. If a pool would shrink, the real effect is better than that line shows.
- Results exactly on, or within rounding noise of, a half-cent edge may differ by one cent, including which row takes a leftover cent.
Restrictions and non-computing states
The calculator enforces its numeric and choice limits before it accepts a result. A blank row between used rows, a repeated row ID, a product not in the products table, a focus customer not in the sales table and too many customers or channels are refused. When a table step would take the lowest row or column below 0, only the what-if table is withheld, with that reason.
Errors and warnings
A request rejected by the page's input limits is not a computed result. A transport or service failure, a timeout or a cancelled run cannot establish a fresh workbook answer, and the last result stays on the page marked as out of date. Review the workbook's References and Disclaimer, and check a result against your own records, before using it to change a price or drop a customer.
References
Sources and further reading
Your sales, costs, returns, activity counts and cost pools come from the inputs; the calculator holds no market, industry or customer data, and every value is your own assumption. The sources below explain the ideas the model uses. They do not endorse this calculator.
- OpenStax, Principles of Accounting, Volume 2: Managerial Accounting, 3.1 Explain Contribution Margin defines contribution margin as the amount by which a selling price exceeds variable cost, the amount left to cover fixed costs and profit; the calculator's contribution is net revenue less product cost and direct costs (retrieved 2026-11-03).
- OpenStax, Principles of Accounting, Volume 2: Managerial Accounting, 6.3 Calculate Activity-Based Product Costs explains grouping overhead into cost pools and allocating each by a cost driver, the idea behind the shared cost pools and their Activity method (retrieved 2026-11-03).
- OpenStax, Contemporary Mathematics, 11.4 Apportionment Methods describes rounding shares down and giving what is left over to the largest remainders, the rule the calculator uses to post each pool to the cent (retrieved 2026-11-03).
This is an educational model of the sales summary you enter, not financial, accounting, pricing or legal advice. An allocated loss is not, by itself, a reason to drop a customer. The calculator is not certified financial reporting and does not guarantee a profit; check a result against your own records before acting on it.
Found a problem, or have an idea?
Tell us if a result looks wrong, a label is unclear, or something is missing. We read every message.