Photo by Justin Morgan on Unsplash
Why campaign profitability needs more than ROAS
Marketers often celebrate a ROAS of 3x or 4x, but that ratio only compares revenue to ad spend. It ignores the cost of the product itself, payment processing fees, shipping, returns, and any fixed overhead allocated to the campaign. A campaign generating £10,000 in revenue from £2,500 in ads looks like a 4x ROAS winner—yet if the products cost £6,000 to make and deliver, the campaign actually lost £500. The model you build in this guide captures every major cost layer and outputs a true net profit figure alongside ROAS, so you always know whether to scale, pause, or restructure a campaign.
Key terms explained
- ROAS (Return on Advertising Spend): Campaign revenue divided by advertising spend. A ratio, not a profit figure. ROAS of 4 means every £1 in ads generated £4 in revenue.
- Contribution margin: Revenue minus variable costs (product cost plus fulfilment). The amount left over to cover fixed costs and produce profit.
- Net profit: What remains after every cost—variable and fixed—has been deducted from revenue.
- Ad spend: The total amount paid to advertising platforms (Google Ads, Meta Ads, etc.) during the campaign period.
- Fulfilment cost: The per-unit cost of picking, packing, and shipping an order, plus payment processing fees and expected returns handling.
- Overhead allocation: A share of fixed business costs (rent, salaries, software) assigned to a single campaign based on a chosen method such as percentage of revenue.
- Units sold: The number of individual product units attributed to the campaign.
- Average order value (AOV): Total campaign revenue divided by the number of orders. Used here as context when you know revenue directly rather than deriving it from units.
- G-column values: In a GSheetPress calculator template, column G holds the values submitted by the web form at runtime. Column E holds the default values shown when the form first loads.
What this model covers and what it excludes
The calculator covers: gross campaign revenue, cost of goods sold (COGS) based on units and unit cost, advertising spend, per-unit fulfilment cost, and a fixed monetary overhead allocation. It outputs contribution margin, ROAS, net profit, net profit margin, daily metrics, and break-even units.
It does not cover: multi-touch attribution across overlapping campaigns, lifetime customer value, currency conversion, tax, or non-linear volume discounts on COGS. Verify your own overhead allocation method, return rate assumptions, and cost figures with your finance team before using results for budget decisions. The model uses straight-line assumptions throughout.
Prerequisites
- A Google account with access to Google Sheets.
- GSheetPress GS2Web installed from the Google Workspace Marketplace and your account confirmed at gsheetpress.com/admin/signup.html. Your Google account email must match the email registered with GSheetPress.
- A Calculator entitlement active on your GSheetPress plan. Check your entitlements at gsheetpress.com/pricing.html.
- A dedicated sample workbook—create a new Google Sheets file named something like Campaign Profitability – Sample. Do not use a file containing real client or business data. Anyone who holds the sharing link you create later will be able to edit this file.
Build the campaign profitability calculator
Open your dedicated sample workbook. Rename the first sheet tab CampaignCalc by double-clicking the tab name at the bottom of the screen.
Step 1 — Create a new calculator
- Click Extensions in the Google Sheets menu bar.
- Select GS2Web SaaS (or the name of your installed GSheetPress add-on).
- Choose Calculator, then New Calculator.
- In the dialog that appears, enter a Name — for example: Campaign Profitability Calculator.
- Set the number of inputs to 7. This count does not include the Calculate button.
- Choose whether to include a graph. For this model select No graph — the result table is more useful than a chart for a profitability breakdown.
- Click Create (or the equivalent confirmation button). GS2Web generates headers in row 1 and input rows 2 through 8, a button in row 9, a merged separator in row 10, a result heading area in row 11, and result data rows starting from row 12.
Step 2 — Understand the generated structure
Row 1 contains eight column headers generated automatically. Never edit row 1. The columns serve these purposes:
- Column A (Labels): The field label shown on the web form.
- Column B (Input Type): The type of form control (Number, Text, Dropdown, Button, etc.).
- Column C (Required): Checkbox — tick to make a field mandatory before the form can be submitted.
- Column D (Data): Options for dropdowns; for the Button row this cell contains the word main.
- Column E (Default): The value pre-filled in the web form when it first loads. Also used for formula testing before publishing.
- Column F (ToolTips): Hint text shown beneath the field label on the web form. Older template versions may spell this column ToopTips — use whichever heading your template generated.
- Column G (Inputs): Overwritten by the web form when a visitor submits values. Every result formula must reference G cells. Never store result formulas in column G.
- Column H (Rules): Optional validation rules such as min or max value constraints.
Step 3 — Fill in the seven input rows
With seven inputs the generated rows are: inputs in rows 2–8, button in row 9, separator in row 10, result heading area row 11, results from row 12. Configure each input row exactly as follows.
Input row 2 — Units Sold
- A2 — Label: Units Sold
- B2 — Input Type: Number
- C2 — Required: Tick the checkbox (mark as required)
- D2 — Data: Leave blank
- E2 — Default: 500
- F2 — ToolTips: Total number of product units sold during the campaign period
- G2 — Inputs: Leave blank (populated at runtime by the web form)
- H2 — Rules: min:1
Input row 3 — Unit Revenue (£)
- A3 — Label: Unit Revenue (£)
- B3 — Input Type: Number
- C3 — Required: Tick the checkbox
- D3 — Data: Leave blank
- E3 — Default: 40
- F3 — ToolTips: Average selling price per unit after discounts, excluding tax
- G3 — Inputs: Leave blank
- H3 — Rules: min:0.01
Input row 4 — Unit Cost / COGS (£)
- A4 — Label: Unit Cost / COGS (£)
- B4 — Input Type: Number
- C4 — Required: Tick the checkbox
- D4 — Data: Leave blank
- E4 — Default: 15
- F4 — ToolTips: Your cost to produce or purchase one unit (cost of goods sold)
- G4 — Inputs: Leave blank
- H4 — Rules: min:0
Input row 5 — Unit Fulfilment Cost (£)
- A5 — Label: Unit Fulfilment Cost (£)
- B5 — Input Type: Number
- C5 — Required: Tick the checkbox
- D5 — Data: Leave blank
- E5 — Default: 4
- F5 — ToolTips: Per-unit cost of shipping, packaging, payment processing, and returns handling
- G5 — Inputs: Leave blank
- H5 — Rules: min:0
Input row 6 — Advertising Spend (£)
- A6 — Label: Advertising Spend (£)
- B6 — Input Type: Number
- C6 — Required: Tick the checkbox
- D6 — Data: Leave blank
- E6 — Default: 2500
- F6 — ToolTips: Total media spend paid to advertising platforms for this campaign
- G6 — Inputs: Leave blank
- H6 — Rules: min:0
Input row 7 — Overhead Allocation (£)
- A7 — Label: Overhead Allocation (£)
- B7 — Input Type: Number
- C7 — Required: Tick the checkbox
- D7 — Data: Leave blank
- E7 — Default: 800
- F7 — ToolTips: Fixed business costs allocated to this campaign (salaries, tools, agency fees not included in ad spend)
- G7 — Inputs: Leave blank
- H7 — Rules: min:0
Input row 8 — Campaign Duration (Days)
- A8 — Label: Campaign Duration (Days)
- B8 — Input Type: Number
- C8 — Required: Tick the checkbox
- D8 — Data: Leave blank
- E8 — Default: 30
- F8 — ToolTips: Number of days the campaign ran — used for daily spend and daily profit context
- G8 — Inputs: Leave blank
- H8 — Rules: min:1
Row 9 — the Calculate button (do not modify)
Row 9 is the generated button row. The add-on sets B9 to Button and D9 to main. The label in A9 is typically Calculate and E9 may read Reset. Do not change B9, D9, or E9. You may edit A9 only if you want a custom button label. Leave G9 and H9 blank.
Row 10 — merged separator (do not modify)
Row 10 is a merged cell separator generated by the add-on to divide inputs from results. Do not edit or delete it.
Row 11 — result section heading
Click cell A11 and type: Campaign Profitability Results. This acts as a visible heading above your results on the published form. You may leave this row blank if you prefer no visible heading.
Add result labels and formulas
Result labels go in column A and their computed values go in column B, starting from row 12. Every formula references column G (runtime inputs) so results update the moment the web form is submitted. References to other B-column cells (such as B12 or B15) chain the intermediate totals without duplicating G-cell references.
Important — testing before publishing: Column G is blank until a web visitor submits the form. To test formulas right now, select E2:E8, copy the cells, click G2, then use Edit → Paste special → Values only. This fills G2:G8 with the default numbers and your formulas will calculate immediately. G values are overwritten on every web submission, so never store result formulas in column G.
Result cell reference table
Enter each label in column A and each formula in column B. To enter a formula: click the column B cell, type =, type the rest of the expression shown, then press Enter.
| Row | A — Result Label | B — Formula | Notes |
|---|---|---|---|
| 12 | Total Revenue (£) | =G2*G3 | Units × unit revenue |
| 13 | Total COGS (£) | =G2*G4 | Units × unit cost |
| 14 | Total Fulfilment (£) | =G2*G5 | Units × fulfilment cost |
| 15 | Contribution Margin (£) | =B12-B13-B14 | Revenue minus variable costs |
| 16 | Advertising Spend (£) | =G6 | Passes ad spend into results column |
| 17 | Overhead Allocation (£) | =G7 | Passes overhead into results column |
| 18 | Net Profit (£) | =B15-B16-B17 | Contribution margin minus fixed costs |
| 19 | ROAS | =IF(G6>0,B12/G6,"N/A – no ad spend entered") | Returns text if ad spend is zero |
| 20 | Net Profit Margin (%) | =IF(B12>0,B18/B12*100,"N/A – no revenue") | Net profit as a percentage of revenue |
| 21 | Daily Ad Spend (£) | =IF(G8>0,G6/G8,"N/A") | Requires duration > 0 |
| 22 | Daily Net Profit (£) | =IF(G8>0,B18/G8,"N/A") | Requires duration > 0 |
| 23 | Break-even Units | =IF((G3-G4-G5)>0,CEILING((G6+G7)/(G3-G4-G5),1),"Cannot break even – margin per unit is zero or negative") | Rounds up to whole units; shows message if margin is zero or negative |
Copyable formula block
You can copy each formula below and paste it directly into the matching column B cell. Always paste into the correct row — the row number in the cell address must match.
B12: =G2*G3
B13: =G2*G4
B14: =G2*G5
B15: =B12-B13-B14
B16: =G6
B17: =G7
B18: =B15-B16-B17
B19: =IF(G6>0,B12/G6,"N/A – no ad spend entered")
B20: =IF(B12>0,B18/B12*100,"N/A – no revenue")
B21: =IF(G8>0,G6/G8,"N/A")
B22: =IF(G8>0,B18/G8,"N/A")
B23: =IF((G3-G4-G5)>0,CEILING((G6+G7)/(G3-G4-G5),1),"Cannot break even – margin per unit is zero or negative")
Formula notes:
CEILING(value,1)rounds the break-even unit count up to the nearest whole unit, because you cannot sell a fraction of a product.- If margin per unit (G3 minus G4 minus G5) is zero or negative, every additional unit sold worsens the loss, so no volume can break even — the formula returns a plain-English message instead of a number.
- ROAS and margin formulas use
IFguards rather thanIFERROR(...,0)to avoid silently hiding a division-by-zero error as a false zero result. - B16 and B17 pass the raw G-cell inputs into the results column so that B18 can reference a single contiguous chain without mixing G and non-G references in one subtraction.
For more on building structured calculators with GSheetPress, see the GSheetPress calculator feature guide. You can also explore how to present tabular data alongside your results using the GSheetPress table feature.
Worked example with default values
Using the defaults entered in column E — 500 units, £40 unit revenue, £15 COGS, £4 fulfilment, £2,500 ad spend, £800 overhead, 30 days — paste these into G2:G8 before publishing to confirm every formula produces the expected result.
| Result label | Calculation shown | Expected value |
|---|---|---|
| Total Revenue (£) | 500 × £40 | £20,000 |
| Total COGS (£) | 500 × £15 | £7,500 |
| Total Fulfilment (£) | 500 × £4 | £2,000 |
| Contribution Margin (£) | £20,000 − £7,500 − £2,000 | £10,500 |
| Advertising Spend (£) | (passed through) | £2,500 |
| Overhead Allocation (£) | (passed through) | £800 |
| Net Profit (£) | £10,500 − £2,500 − £800 | £7,200 |
| ROAS | £20,000 ÷ £2,500 | 8.0 |
| Net Profit Margin (%) | £7,200 ÷ £20,000 × 100 | 36.0% |
| Daily Ad Spend (£) | £2,500 ÷ 30 | £83.33 |
| Daily Net Profit (£) | £7,200 ÷ 30 | £240.00 |
| Break-even Units | CEILING((2500+800)÷(40−15−4),1) = CEILING(3300÷21,1) = CEILING(157.14,1) | 158 |
Alternative scenario — healthy ROAS, unprofitable campaign
This scenario illustrates why ROAS alone is misleading. Use 400 units, £20 unit revenue, £14 COGS, £4 fulfilment, £1,200 ad spend, £600 overhead, 14 days.
| Result label | Calculation shown | Expected value |
|---|---|---|
| Total Revenue (£) | 400 × £20 | £8,000 |
| Total COGS (£) | 400 × £14 | £5,600 |
| Total Fulfilment (£) | 400 × £4 | £1,600 |
| Contribution Margin (£) | £8,000 − £5,600 − £1,600 | £800 |
| Advertising Spend (£) | (passed through) | £1,200 |
| Overhead Allocation (£) | (passed through) | £600 |
| Net Profit (£) | £800 − £1,200 − £600 | −£1,000 |
| ROAS | £8,000 ÷ £1,200 | 6.67 |
| Net Profit Margin (%) | −£1,000 ÷ £8,000 × 100 | −12.5% |
| Break-even Units | CEILING((1200+600)÷(20−14−4),1) = CEILING(1800÷2,1) | 900 |
A ROAS of 6.67 would appear excellent in a reporting dashboard, yet the campaign lost £1,000 once product cost, fulfilment, and overhead are included. The break-even analysis shows 900 units would be needed to reach profitability at those margins — more than twice the units actually sold. This is exactly the insight a complete profitability model surfaces that a ROAS-only view conceals.
If you plan to connect this calculator to a product catalogue for per-SKU cost inputs, see the GSheetPress shop feature documentation for integration options. If you need help with any step, visit the GSheetPress support page.
Frequently asked questions
Should I enter overhead as a percentage or a fixed amount?
This model uses a fixed monetary overhead allocation — a pound or dollar figure, not a percentage. Estimate how much of your fixed costs (salaries, tools, agency retainers not counted in ad spend) this campaign consumed during the period, and enter that amount. If you prefer percentage-based overhead, add an eighth input row for an overhead percentage, adjust all row numbers down by one from row 9 onward, and replace the B17 formula with one that multiplies B12 by that G-column percentage divided by 100. Confirm the add-on button and separator shift to rows 10 and 11 automatically when you specify eight inputs during creation.
Why does ROAS display as a plain number rather than showing an x symbol?
The formula =IF(G6>0,B12/G6,"N/A – no ad spend entered") returns a raw decimal. A ROAS of 8 means 8x. To display it with an x suffix, click cell B19, open Format → Number → Custom number format, and enter 0.0"x". The displayed value will read 8.0x while the underlying number remains 8, so any formula that references B19 still works correctly.
Can I track multiple campaigns in the same workbook and compare them?
Yes. Duplicate the CampaignCalc sheet tab (right-click the tab and choose Duplicate), rename it for a second campaign such as CampaignCalc2, and create a separate calculator in GS2Web pointing to that sheet. Each sheet holds its own G-column runtime values and result formulas independently. You can then build a separate Summary sheet that references B18 from each campaign tab — for example =CampaignCalc!B18 and =CampaignCalc2!B18 — to compare net profits side by side without the web form interfering with those reference cells.
Troubleshooting
Formulas show zero or blank before publishing
Column G is empty until the web form sends values. Select E2:E8, copy those cells, click G2, then use Edit → Paste special → Values only. This populates G2:G8 with the default numbers and every result formula will calculate immediately. You do not need to clear G2:G8 before publishing — the web form overwrites G values on every submission regardless of what is currently there.
Break-even shows a message instead of a number
This means the margin per unit — unit revenue minus COGS minus fulfilment cost — is zero or negative. The calculator is working correctly: the inputs describe a product where every unit sold loses money before any fixed costs are covered. No volume of sales can break even. Review whether unit revenue in G3 is realistic and whether COGS in G4 and fulfilment in G5 can be reduced.
ROAS cell shows the N/A message
Ad spend in G6 is zero. Either the default in E6 was not pasted into G6 during testing, or a user submitted zero for ad spend. If organic campaigns with zero paid spend are a valid use case for your form, update the A19 label to clarify that ROAS is only calculated for paid campaigns, and consider making G6 optional by unchecking the C6 required checkbox.
The add-on menu does not appear under Extensions
Confirm that GS2Web SaaS is installed for the Google account currently open in your browser — not a different account. Open the Google Workspace Marketplace from the menu, search for GS2Web, and check its installation status. Also verify that the Google account email matches the email registered at GSheetPress. Google's official documentation on installing Google Workspace add-ons covers account permission requirements in detail.
Published results differ from the spreadsheet results
First check that you opened the public link from column C of the Calculator Link sheet, not the Edit Link in column B. Then confirm you clicked Get Links inside the GS2Web panel after your most recent publish action to refresh that sheet. If the form shows different default values from what you entered in column E, check that column E contains plain numbers rather than formulas — paste values only if needed.
Publish and test your web calculator
- Before publishing, share the sample workbook so GSheetPress can read it. Click Share in the top-right corner of Google Sheets.
- Under General access, open the dropdown and select Anyone with the link.
- Set the permission role to Editor, then click Done. Important: this setting allows anyone who holds the spreadsheet URL to edit the file. Use only your dedicated sample workbook — never a file containing real business or client data.
- Click the CampaignCalc tab at the bottom of the screen to make it the active sheet.
- Open Extensions → GS2Web SaaS → Calculator → Publish Calculator.
- Wait for the confirmation message that publishing is complete. Do not close the dialog until the confirmation appears.
- Open the Calculator Link sheet that GS2Web generates or updates automatically. Each row in this sheet represents one published calculator.
- Find the row whose Sheet Name column matches CampaignCalc.
- Click the URL in column C (Link) — this is the public-facing calculator page. Do not use the URL in column B (Edit Link), which opens the spreadsheet for editing.
- If your calculator does not appear in the list, click Get Links inside the GS2Web panel to refresh the Calculator Link sheet, then check again.
- On the public calculator page, enter the default worked-example values: 500 units, £40 unit revenue, £15 COGS, £4 fulfilment, £2,500 ad spend, £800 overhead, 30 days. Click the Calculate button.
- Confirm the results match the expected outcomes from the worked example: Net Profit £7,200, ROAS 8.0, Net Profit Margin 36.0%, Break-even Units 158. If any result differs, return to the spreadsheet, recheck the formula in the corresponding B-row cell, and republish.
- Optionally, copy the iframe code from column D (Iframe) of the Calculator Link sheet and paste it into an HTML block on your website to embed the calculator directly in a page.
- If you republish the same calculator after making changes, the public link in column C remains the same — you do not need to update any existing website embeds or links you have already shared.