Why milestone billing distorts perceived margins
Engineering firms, digital agencies, IT consultants, and B2B service companies in Switzerland often bill by milestone: progress payments tied to partial deliverables, client approvals, or project phases. The standard income statement, however, records revenue and costs at the accounting date — not necessarily when the work is performed. The result is an apparent margin that swings month to month, even when the project's actual profitability remains stable.
Without project costing, an owner may believe they had an excellent quarter because three milestones fell due, while personnel and subcontractor costs were incurred in earlier months. Or the opposite: low billed revenue but a full team on multiple jobs, with real margins still positive but invisible in monthly reporting.
This guide explains how to structure the calculation of real margins per job in the context of Swiss SMEs, with reference to accounting standards (Swiss GAAP FER), VAT reporting obligations, and Accountex features for linking hours, expenses, and revenue to each project.
Statutory accounting and project costing
Mandatory statutory accounting — governed by the Code of Obligations (Art. 957 et seq.) and Swiss accounting standards — produces the balance sheet and income statement for the entire company. Project costing is an internal level of detail that allocates revenue, direct costs, and shares of indirect costs to individual jobs, regardless of when the invoice is issued or collected.
Accrual revenue
Portion of contract value earned based on work progress, not simply on milestone collection. It is the basis for comparing revenue and costs over the same period.
Direct project costs
Valued internal hours, subcontractors, project-specific licenses, travel, and materials attributable to a single job. Tracked with a unique project code.
Job margin
Difference between accrual revenue and direct costs (and, where applicable, a share of indirect costs). Shows whether the project creates value before the final invoice.
In Switzerland, companies that prepare financial statements under full accounting standards (Swiss GAAP FER) and carry out significant multi-year contracts under FER 22 must, if the cumulative conditions are met (valid contract, high probability of fulfillment, adequate organization, reliable estimate of revenue, costs, and degree of completion), recognize revenue using the percentage-of-completion method; otherwise the completed-contract method applies. With simplified financial statements (Art. 957a CO), more basic criteria apply; in every case, project costing helps monitor real margin. For shorter jobs, statutory revenue may align with the milestone issued — but costs must be allocated continuously so margin control is not lost.
The pitfalls of milestone billing
Contracts with clearly defined milestones are common in professional services. However, they create three typical distortions if project tracking is not activated:
| Scenario | What the income statement shows | Real project margin | Operational risk |
|---|---|---|---|
| Work ahead of schedule, invoice delayed | High costs, no revenue in the month | Positive margin but hidden | Underestimated future liquidity, premature team cuts |
| Milestone invoiced, work incomplete | High revenue, costs still to be recorded | Temporarily inflated margin | Investment decisions based on illusory profits |
| Unbilled scope changes | Revenue unchanged from contract | Margin eroding silently | Uncompensated scope creep, client disputes |
| Multi-year project with annual progress payments | Billing spikes at year-end | Smooth trend if calculated on accrual basis | Inaccurate tax profit estimate without year-end adjustments |
The solution is not to change the billing model, but to separate cash flow from economic performance. The milestone invoice remains the collection instrument and, under the agreed consideration method (Swiss VAT standard), also determines VAT liability; real margin is calculated by cross-referencing work progress, costs incurred, and contract value.
Correctly allocating costs and revenue to each job
The core of project costing is a simple rule: every relevant accounting entry must carry a project code (or job cost center). Here is how to classify the most common items in Swiss SMEs:
| Item | Allocation method | Practical example | Update frequency |
|---|---|---|---|
| Internal staff hours | Timesheet with internal rate (fully loaded hourly cost: salary + mandatory social contributions + occupational pension + overhead share) | Consultant at CHF 145/h internal cost, 32 hours on Project Alpha = CHF 4,640 | Weekly |
| Subcontractors and freelancers | Direct allocation from supplier invoice to project code | External designer invoices CHF 3,800 → Job Beta | On posting |
| Travel and materials | Expense report or purchase with mandatory project field | Client trip to Ticino, CHF 420 for meals/accommodation | Monthly |
| Indirect costs (rent, administration) | Allocation driver: hours, revenue, or headcount per project | 15% overhead on internal billable hours | Quarterly |
| Milestone revenue | Invoice issued when milestone is reached; accrual adjustment if required | Milestone 2 of CHF 25,000 on total contract of CHF 80,000 | At event + periodic adjustment |
For staff, the internal rate must include mandatory social contributions (OASI/DI/IC/ALV, accident insurance, occupational pension where applicable) and a reasonable share of structural costs. Using net or gross salary alone understates true cost and makes margins appear higher than they actually are — a common mistake in consulting teams with few administrative staff.
How to calculate real margin per project
Calculating real margin follows an operational sequence that can be automated in accounting software. Here is a concrete example of a service SME based in French-speaking Switzerland:
Example: software project with three milestones
- Contract: CHF 120,000 + VAT, three milestones of CHF 40,000 (analysis, development, go-live)
- End of month 2: milestone 1 invoiced and collected; costs incurred (hours + subcontract) = CHF 38,500
- End of month 4: milestone 2 not yet invoiced due to client approval delay; cumulative costs = CHF 72,000; estimated progress 55%
- Accrual revenue at end of month 4: 120,000 × 55% = CHF 66,000
- Real margin: 66,000 − 72,000 = −CHF 6,000 (project temporarily loss-making despite CHF 40,000 already invoiced)
The basic formula for each job is:
Accrual revenue is obtained by multiplying contract value (including any approved change orders) by the percentage of completion. Progress can be based on actual hours vs. budget, deliverables completed, or project manager assessment — what matters is applying the same criterion consistently across all projects.
Work in progress (WIP) and period-end adjustments
When costs incurred exceed billed revenue — or vice versa — a difference arises that in project costing is called work in progress on contracts (work in progress, WIP). At monthly or quarterly closing, it is advisable to post adjustments that bring the statutory income statement closer to the project's economic reality.
Positive WIP (costs > billed)
Work performed has not yet been invoiced. An asset is recognized (work-in-progress receivable) or revenue is adjusted on accrual basis. Typical in intermediate phases of multi-year projects.
Advance billing (billed > costs incurred)
The milestone was issued before the work was actually completed. A liability is recorded (advances on work in progress) until costs reach billed revenue.
Under Swiss GAAP FER — in particular FER 22 for multi-year contracts — the prudence principle and matching of costs and revenue require that profit not be artificially inflated. If a project shows signs of definitive loss — insolvent client, scope impossible to complete — a WIP write-down and, if necessary, a provision for contract losses must be considered. This assessment also affects the taxable profit base and must be documented for review by the fiduciary.
Operational workflow with Accountex
A project costing system works only if data enters in real time, not at quarter-end. Here is a recommended workflow for SMEs using Accountex:
-
1
Open the job when the quote is accepted
Create a project code linked to the client, with hour budget, contract amount, planned milestones, and applicable VAT rate. The budget becomes the reference for variance alerts.
-
2
Record hours and expenses with mandatory project code
Every timesheet and every supplier invoice must specify the job. Accountex lets you filter entries by project and view cumulative costs vs. budget at any time.
-
3
Issue the milestone invoice linked to the project
The invoice generates cash flow and, as a rule, VAT liability at issuance (agreed consideration method); it remains analytically linked to the job. The system shows billed revenue vs. accrual vs. costs incurred.
-
4
Reconcile progress and margins monthly
Compare completion percentage with cumulative costs. If estimated margin at completion falls below the internal threshold (e.g. 20%), trigger a scope review or contract supplement.
-
5
Adjust WIP at month- or quarter-end
Generate the per-job report and post the necessary adjustments before accounting close. The data also feeds the annual tax profit estimate.
The key is data discipline: a missing project code on ten hours per week, multiplied by five team members, produces a variance of tens of thousands of francs over a financial year.
Indicators to monitor for each job
Beyond absolute margin, certain KPIs allow intervention before a project becomes structurally loss-making:
Estimated margin at completion (EAC margin)
Projects estimated final costs against contract value. Formula: Contract value − (Costs incurred ÷ % completion). If the result is negative, the project will close at a loss even if billing is accelerated.
Hour budget consumption index
Actual hours ÷ budget hours × 100, compared to completion percentage. A value above 100 with 60% progress signals inefficiency or initial underestimation.
Project DSO
Average days between milestone invoice issuance and collection. Distinct from margin, but critical for liquidity: a profitable project with 60-day DSO can create pressure on monthly salaries and social contributions.
Value of unbilled change orders
Sum of extra requests approved verbally but not yet incorporated into the contract. Tracking them prevents margin erosion from uncompensated work.
For fiduciary firms assisting clients with multiple simultaneous jobs, a consolidated report by client — not just by individual project — helps identify which commercial relationships concentrate margin risk.
Common mistakes and how to avoid them
Confusing collection with accrual revenue
A progress payment collected does not mean margin has been realized. Always allocate revenue in proportion to progress, especially on jobs spanning multiple accounting periods or tax years.
Forgetting non-billable staff costs
Internal meetings, post-delivery corrections, and project training consume hours. If not tracked, final margin is systematically overstated by 5–15%.
Not updating the budget after contract changes
Every approved change order must update contract value, milestones, and hour budget. Otherwise variance alerts start from an obsolete reference.
Closing the project only at the last milestone
Post-delivery warranty, bug fixes, and support included in the contract generate costs after the final invoice. Plan for a residual cost period or a dedicated closing milestone.
From accounting data to business decision
Project costing does not replace the statutory financial statements or the VAT return, but it bridges the gap between when you invoice and when you create value. For Swiss SMEs working on milestones, it is the tool that turns the income statement — often irregular by nature — into a series of comparable margins, job by job.
Getting started does not require a full ERP: a consistent project code, disciplined timesheets, linked invoices, and periodic WIP adjustment are enough. With Accountex, owners and fiduciaries can build this level of control starting from the accounting already in use, monitoring real margins before the last milestone reveals — too late — a loss-making project.