How to Structure a Self-Employed Income Tracker in Sheets
Four tabs. Everything references a single Assumptions tab so nothing is hardcoded in your calculation sheets.
Assumptions — the only place you type raw parameters:
| Parameter | Value |
|---|---|
| Year Start | 1/1/2026 |
| Year End | 12/31/2026 |
| SE Tax Rate | 15.3% |
| Federal Marginal Rate | 22% |
| State Tax Rate | 5.1% |
| SE Deduction Factor | 92.35% |
| AR Warning Threshold (days) | 45 |
| Collection Speed Scenario | Base |
That last row — Collection Speed Scenario — is what wires the Cash Flow tab to a scenario model. More on that below.
Income Log is the source of truth. Every invoice you send gets a row:
| Col | Field | Notes |
|---|---|---|
| A | Invoice Date | Date sent |
| B | Client | Text |
| C | Project | Text |
| D | Amount | Invoice total |
| E | Expected Pay Date | =IF(F2<>"",F2,A2+VLOOKUP(B2,'Assumptions'!$H:$I,2,0)) |
| F | Actual Pay Date | Blank until paid |
| G | Collected | =IF(F2<>"",D2,0) |
| H | Outstanding | =D2-G2 |
| I | Days Outstanding | =IF(F2="",TODAY()-A2,"") |
Column E is the load-bearing formula. When F (Actual Pay Date) is blank, it estimates payment based on a per-client payment lag stored in a lookup table on Assumptions. Once you log payment in F, E flips to the actual date. That single formula is what lets the Cash Flow tab pull expected inflows by month without any manual tagging or a separate unpaid-invoice list.
The per-client payment lag table on Assumptions is just two columns: Client name and historical average days to pay. After 2–3 months of actuals, these numbers calibrate fast. A client who reliably pays in 22 days shows up differently in your cash projection than one who averages 58 days, even if both invoices are currently "outstanding."
The Tax Estimate Tab
Self-employment tax runs at 15.3% on 92.35% of net earnings, per IRS Schedule SE. The 92.35% multiplier accounts for the employer-equivalent half of SE tax. For 2025, the Social Security portion (12.4%) only applies up to the $176,100 wage base; above that you're only paying the 2.9% Medicare component.
The quarterly estimate formula, properly wired to the Assumptions tab:
=SUMIFS('Income Log'!D:D,
'Income Log'!A:A,">="&Assumptions!$B$3,
'Income Log'!A:A,"<="&EOMONTH(Assumptions!$B$3,2))
* Assumptions!$B$6
* (Assumptions!$B$5 + Assumptions!$B$7 + Assumptions!$B$8)
On $187K gross with $40K in deductible business expenses, that puts your combined effective rate around 34.8% (15.3% SE, 22% federal marginal, adjusted for the SE deduction). That's roughly $11,200/quarter in estimated payments. IRS deadlines for 2026 are April 15, June 16, September 15, and January 15, 2027 — missing one triggers a penalty calculated at the federal short-term rate plus 3 percentage points (currently around 7.5% annualized as of April 2026).
Cash Flow Projection With Scenario Analysis
Most income tracker templates pull collected cash into monthly buckets. That's fine for historical reporting. For forward planning, you need to know when you expect to receive money that hasn't come in yet.
The base Cash Flow tab formula:
=SUMIFS('Income Log'!G:G,
'Income Log'!F:F,">="&DATE(YEAR($A2),MONTH($A2),1),
'Income Log'!F:F,"<="&EOMONTH($A2,0))
+SUMIFS('Income Log'!D:D,
'Income Log'!E:E,">="&DATE(YEAR($A2),MONTH($A2),1),
'Income Log'!E:E,"<="&EOMONTH($A2,0),
'Income Log'!F:F,"")
First SUMIFS: cash actually collected this month. Second SUMIFS: expected inflows from unpaid invoices whose Expected Pay Date falls this month.
The problem is that expected pay dates are estimates. A client who usually pays in 30 days sometimes takes 55. That 25-day slip can shift $30K+ across a month boundary and make your Q2 runway look fine when it isn't.
Scenario layer. Add a small lookup table on Assumptions:
| Scenario | Collection Lag Multiplier |
|---|---|
| Optimistic | 0.75 |
| Base | 1.00 |
| Conservative | 1.45 |
Then replace the hardcoded per-client lag in your Expected Pay Date formula with a version that applies the multiplier:
=A2 + (VLOOKUP(B2,'Assumptions'!$H:$I,2,0)
* VLOOKUP(Assumptions!$B$10,'Assumptions'!$K:$L,2,0))
Where Assumptions!$B$10 holds your Collection Speed Scenario selection ("Optimistic", "Base", or "Conservative").
Flip that one cell and every Expected Pay Date in the Income Log recalculates. The Cash Flow tab updates immediately. On a $47K quarterly invoice load with typical freelance payment distributions, the spread looks like this:
| Scenario | Avg Collection Lag | Q2 Cash Inflow |
|---|---|---|
| Optimistic | ~23 days | $52,400 |
| Base | ~38 days | $44,700 |
| Conservative | ~55 days | $31,200 |
That $21,200 spread between optimistic and conservative isn't revenue risk — none of those invoices are uncollectable — it's pure timing risk. If your fixed expenses run $28K/quarter, the conservative scenario means you're drawing down reserves in Q2. The optimistic scenario means you're not. Knowing which world you're in before the month starts is the point of the model.
Stress-testing against historical patterns. Once you have 6+ months of actuals, add a column J to the Income Log called "Conservative Pay Date" that always applies the 1.45× multiplier regardless of the Assumptions scenario cell:
=A2 + (VLOOKUP(B2,'Assumptions'!$H:$I,2,0) * 1.45)
Then add a second row to your Cash Flow tab — "Conservative Inflow" — using the same SUMIFS pattern but referencing column J instead of column E. Now you can see base-case and conservative inflows side by side for every month, without toggling the scenario cell back and forth. The gap between those two rows is a direct measure of your collection timing risk, updated automatically every time you add an invoice.
What Most Self-Employed Income Trackers Miss: AR Aging
Standard templates count outstanding invoices. What they don't do is segment them by how overdue they are — which is the only number that tells you whether to send a polite nudge or call your client's AP contact directly.
=SUMIFS('Income Log'!H:H,
'Income Log'!I:I,">="&Assumptions!$B$9,
'Income Log'!F:F,"")
That pulls total outstanding balance for invoices where Days Outstanding exceeds the AR Warning Threshold (45 days by default). Wrap it in conditional formatting — orange when this figure exceeds 10% of quarterly gross, red above 20% — and it becomes a dashboard signal that's visible before you've finished your coffee.
A $61K month where $43K is still outstanding at day 45 is a cash flow problem dressed up as a revenue number. That's the framing that matters. It means your Conservative scenario on the Cash Flow tab isn't just a downside case — it's describing what happens when your three biggest clients pay slowly simultaneously, which is exactly when it tends to happen.
Where ModelMonkey Saves Setup Time
Building the four-tab structure from scratch takes 2–3 hours if you know what you're doing. The formulaic connections between tabs — especially wiring the scenario lookup through Expected Pay Date into the Cash Flow SUMIFS, and keeping the AR aging threshold dynamically referenced rather than hardcoded — are the kind of thing that's easy to get subtly wrong (off-by-one on month boundaries, wrong blank-check logic in the Collected column).
ModelMonkey can build the tab skeleton, drop in the SUMIFS patterns, and wire the Assumptions references in one pass — leaving you to spend your time calibrating per-client payment lags and interpreting the scenario spread rather than debugging cross-tab references.