Track Taxes in Google Sheets With Controls
Build a protected Google Sheets tax tracker with period summaries, source reconciliation, and error checks.
An FP&A analyst or business owner can track taxes in Google Sheets with 2 tabs: Tax Log for source-level records and Summary for annual, monthly, and quarterly reporting. Together, they track income, expenses, user-tagged deduction candidates, estimated payments, and candidate business mileage for one selected tax year.
This guide provides an exact cell map instead of a downloadable workbook or screenshots. Use the expected results to check your copy before entering live records.
The tracker supports planning and recordkeeping. It doesn’t calculate an official tax liability or determine whether an expense or trip is deductible.
What You'll Need
- Access to Google Sheets
- Bank, card, invoice, payment-confirmation, receipt, and mileage records
- One reporting currency; the illustrative fixture uses USD
- A selected tax year; the example uses 2026
- Permission to protect formula ranges if other people will edit the workbook
- Comma formula separators; some spreadsheet locales require semicolons instead
Step-by-Step Guide
Create the tax log and reference lists
Start by creating a workbook with exactly 2 tabs:
Tax LogSummary
Enter these headers in Tax Log!A1:L1:
| Column | Header | Meaning |
|---|---|---|
| A | Date | Transaction or activity date |
| B | Description | Source-level description |
| C | Record Type | Income, Expense, Estimated payment, or Mileage |
| D | Category | Organizational category |
| E | Amount (USD) | Nonnegative monetary amount |
| F | Distance (km) | Nonnegative distance for mileage records |
| G | Account | Bank, card, vehicle log, or other source |
| H | Tax Year | Calendar year associated with the record |
| I | Deduction tag | Unreviewed, Candidate, or Not claimed |
| J | Source document | Filename, document ID, or controlled link |
| K | Notes | Reconciliation notes or explanations |
| L | Calculation status | Formula-driven structural check |
Amounts and distances must be nonnegative. To distinguish income, expenses, payments, and mileage, use Record Type instead of entering expenses as negative values.
This example prepares rows 2 through 1000 for data entry. If you need more capacity, extend the validation, status formula, conditional formatting, filter, and protection ranges before adding records below row 1000.
Next, create these reference lists on Summary:
| Range | Values |
|---|---|
I1:I5 | Header Record Types, followed by Income, Expense, Estimated payment, Mileage |
J1:J15 | Header Categories, followed by Client income, Interest income, Other income, Office supplies, Software, Professional fees, Rent, Travel, Meals, Other expense, Federal estimated payment, State estimated payment, Local estimated payment, Business mileage |
K1:K4 | Header Deduction tags, followed by Unreviewed, Candidate, Not claimed |
These are organizational labels. They don’t establish legal tax treatment. Although the workbook checks whether a category appears in the approved list, it doesn’t enforce a relationship between each category and its record type.
Enter the illustrative source records
Enter this illustrative fixture in Tax Log!A2:K6. Leave cells shown as blank empty instead of typing the word “blank.”
| Date | Description | Record Type | Category | Amount (USD) | Distance (km) | Account | Tax Year | Deduction tag | Source document | Notes |
|---|---|---|---|---|---|---|---|---|---|---|
| 2026-01-01 | Invoice 1001 | Income | Client income | 1200 | Checking | 2026 | invoice-1001.pdf | |||
| 2026-01-10 | Printer ink | Expense | Office supplies | 80.50 | Credit card | 2026 | Candidate | receipt-0110.pdf | ||
| 2026-01-15 | Client-site trip | Mileage | Business mileage | 38.6 | Vehicle log | 2026 | Candidate | route-0115.pdf | ||
| 2026-04-15 | Quarterly payment | Estimated payment | Federal estimated payment | 200 | Checking | 2026 | payment-confirmation.pdf | |||
| 2025-12-31 | Prior-year invoice | Income | Client income | 100 | Checking | 2025 | invoice-prior-year.pdf | Entered later |
Enter dates as real Google Sheets date values, then apply these formats:
Tax Log!A2:A1000: Format > Number > Custom date and time, displayed asyyyy-mm-ddTax Log!E2:E1000: Format > Number > Custom currency, USD with 2 decimal placesTax Log!F2:F1000: Format > Number > Custom number format, using0.0
The filenames are illustrative references. This guide doesn’t include the source documents.
Add entry validation
For each range below, select Data > Data validation > Add rule and set invalid data to be rejected.
For Tax Log!A2:A1000, use this custom formula to accept dates from 1900 through 9998:
=AND(ISNUMBER(A2),A2>=DATE(1900,1,1),A2<DATE(9999,1,1))
Then add these dropdown rules:
Tax Log!C2:C1000: dropdown fromSummary!I2:I5Tax Log!D2:D1000: dropdown fromSummary!J2:J15
For Tax Log!H2:H1000, require a whole-number year from 1900 through 9998:
=AND(ISNUMBER(H2),H2=INT(H2),H2>=1900,H2<=9998)
The upper limit is 9998 because the reporting formulas use January 1 of the following year as an exclusive end date.
For Tax Log!E2:E1000, use this formula. Mileage records must leave Amount blank, while other record types require a nonnegative numeric amount:
=OR(AND($C2="Mileage",E2=""),AND($C2<>"Mileage",ISNUMBER(E2),E2>=0))
For Tax Log!F2:F1000, use this formula. Mileage records require nonnegative numeric distance, while other types must leave Distance blank:
=OR(AND($C2="Mileage",ISNUMBER(F2),F2>=0),AND($C2<>"Mileage",F2=""))
For Tax Log!I2:I1000, require a deduction tag only for expenses and mileage:
=IF(OR($C2="Expense",$C2="Mileage"),COUNTIF({"Unreviewed","Candidate","Not claimed"},I2)=1,I2="")
Validation reduces direct-entry errors, but pasted or imported data can replace or bypass the rules. To catch those cases, the next step adds a formula-based check.
Add row-level controls and warnings
Enter this formula in Tax Log!L2:
=IF(
COUNTA(A2:K2)=0,
"",
IF(
NOT(ISNUMBER(A2)),
"INVALID DATE",
IF(
OR(A2<DATE(1900,1,1),A2>=DATE(9999,1,1)),
"INVALID DATE",
IF(
B2="",
"MISSING DESCRIPTION",
IF(
COUNTIF({"Income","Expense","Estimated payment","Mileage"},C2)=0,
"INVALID TYPE",
IF(
COUNTIF(Summary!$J$2:$J$15,D2)=0,
"INVALID CATEGORY",
IF(
NOT(ISNUMBER(H2)),
"INVALID TAX YEAR",
IF(
OR(H2<>INT(H2),H2<1900,H2>9998),
"INVALID TAX YEAR",
IF(
H2<>YEAR(A2),
"YEAR MISMATCH",
IF(
C2="Mileage",
IF(
NOT(ISNUMBER(F2)),
"INVALID KM",
IF(
F2<0,
"INVALID KM",
IF(
E2<>"",
"CLEAR AMOUNT",
IF(
COUNTIF({"Unreviewed","Candidate","Not claimed"},I2)=0,
"INVALID DEDUCTION TAG",
"OK"
)
)
)
),
IF(
NOT(ISNUMBER(E2)),
"INVALID AMOUNT",
IF(
E2<0,
"INVALID AMOUNT",
IF(
F2<>"",
"CLEAR KM",
IF(
C2="Expense",
IF(
COUNTIF({"Unreviewed","Candidate","Not claimed"},I2)=0,
"INVALID DEDUCTION TAG",
"OK"
),
IF(
I2<>"",
"CLEAR DEDUCTION TAG",
"OK"
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
Copy L2 through L1000 before entering live data. Every populated entry row must have the status formula in column L. Without it, the row will be omitted from summaries and control counts because the formulas require a status of OK.
All 5 sample rows should return OK. The 2025 record is structurally valid, but the 2026 summary formulas exclude it based on its date.
The status formula checks that:
- Date is numeric and within the supported date range.
- Description is present.
- Record Type appears in the allowed list.
- Category appears in
Summary!J2:J15. - Tax Year is a whole number from 1900 through 9998 and matches the date.
- Amount and distance follow the selected record type.
- Deduction tags are used only where required.
Now select Tax Log!A1:L1000 and choose Data > Create a filter. Add 2 conditional-formatting rules to Tax Log!A2:L1000.
Invalid populated row
=AND(COUNTA($A2:$K2)>0,$L2<>"OK")
Missing source-document reference
=AND(COUNTA($A2:$K2)>0,$J2="")
Use a warning color for each rule. A warning doesn’t exclude a row by itself. Only the explicit Calculation status = OK criterion in the summary formulas excludes invalid rows.
An OK status means only that the row passed these structural checks. It doesn’t confirm that the transaction is unique, supported, deductible, or assigned to the correct category for its record type.
Build and format the annual control dashboard
Set up the reporting period in Summary!A1:B3:
| Cell | Entry |
|---|---|
| A1 | Tax year |
| B1 | 2026 |
| A2 | Period start |
| A3 | Period end, exclusive |
Validate B1 as a whole number from 1900 through 9998.
Enter this guarded formula in B2:
=IF(NOT(ISNUMBER(B1)),"CHECK YEAR",IF(OR(B1<>INT(B1),B1<1900,B1>9998),"CHECK YEAR",DATE(B1,1,1)))
In B3, enter:
=IF(NOT(ISNUMBER(B2)),"CHECK YEAR",DATE(B1+1,1,1))
Format Summary!B2:B3 as yyyy-mm-dd. With B1 set to 2026, the displayed results should be:
B2:2026-01-01B3:2027-01-01
These formulas use an inclusive start and exclusive end. A record dated January 1, 2026 is included, while one dated January 1, 2027 is excluded.
Enter these labels in A5:A10:
| Cell | Label |
|---|---|
| A5 | Total income (USD) |
| A6 | Total expenses (USD) |
| A7 | Candidate expenses (USD) |
| A8 | Estimated payments (USD) |
| A9 | Candidate distance (km) |
| A10 | Rows needing correction |
Next, enter the following formulas.
Summary!B5:
=IF(NOT(AND(ISNUMBER($B$2),ISNUMBER($B$3))),"CHECK YEAR",SUMIFS('Tax Log'!$E$2:$E,'Tax Log'!$C$2:$C,"Income",'Tax Log'!$A$2:$A,">="&$B$2,'Tax Log'!$A$2:$A,"<"&$B$3,'Tax Log'!$L$2:$L,"OK"))
Summary!B6:
=IF(NOT(AND(ISNUMBER($B$2),ISNUMBER($B$3))),"CHECK YEAR",SUMIFS('Tax Log'!$E$2:$E,'Tax Log'!$C$2:$C,"Expense",'Tax Log'!$A$2:$A,">="&$B$2,'Tax Log'!$A$2:$A,"<"&$B$3,'Tax Log'!$L$2:$L,"OK"))
Summary!B7:
=IF(NOT(AND(ISNUMBER($B$2),ISNUMBER($B$3))),"CHECK YEAR",SUMIFS('Tax Log'!$E$2:$E,'Tax Log'!$C$2:$C,"Expense",'Tax Log'!$I$2:$I,"Candidate",'Tax Log'!$A$2:$A,">="&$B$2,'Tax Log'!$A$2:$A,"<"&$B$3,'Tax Log'!$L$2:$L,"OK"))
Summary!B8:
=IF(NOT(AND(ISNUMBER($B$2),ISNUMBER($B$3))),"CHECK YEAR",SUMIFS('Tax Log'!$E$2:$E,'Tax Log'!$C$2:$C,"Estimated payment",'Tax Log'!$A$2:$A,">="&$B$2,'Tax Log'!$A$2:$A,"<"&$B$3,'Tax Log'!$L$2:$L,"OK"))
Summary!B9:
=IF(NOT(AND(ISNUMBER($B$2),ISNUMBER($B$3))),"CHECK YEAR",SUMIFS('Tax Log'!$F$2:$F,'Tax Log'!$C$2:$C,"Mileage",'Tax Log'!$I$2:$I,"Candidate",'Tax Log'!$A$2:$A,">="&$B$2,'Tax Log'!$A$2:$A,"<"&$B$3,'Tax Log'!$L$2:$L,"OK"))
Summary!B10:
=COUNTIFS('Tax Log'!$L$2:$L,"<>",'Tax Log'!$L$2:$L,"<>OK")
Apply these formats:
Summary!B5:B8: USD currency with 2 decimal placesSummary!B9: custom number format0.0 "km"Summary!B10: whole number
Add these controls in D1:E4:
| Cell | Entry |
|---|---|
| D1 | Control |
| E1 | Result |
| D2 | Rows needing correction |
| D3 | Missing source references |
| D4 | Quarterly reconciliation status |
Enter this formula in E2:
=$B$10
In E3, enter:
=COUNTIFS('Tax Log'!$L$2:$L,"<>",'Tax Log'!$J$2:$J,"")
In E4, enter:
=$B$46
Format E2:E3 as whole numbers.
For the unchanged fixture, the annual dashboard should show:
| Metric | Expected result |
|---|---|
| Total income (USD) | $1,200.00 |
| Total expenses (USD) | $80.50 |
| Candidate expenses (USD) | $80.50 |
| Estimated payments (USD) | $200.00 |
| Candidate distance | 38.6 km |
| Rows needing correction | 0 |
| Missing source references | 0 |
Candidate is a user classification for review. It doesn’t make an expense or trip legally deductible.
Calculate and format monthly and quarterly totals
Enter these monthly headers in Summary!A11:G11:
| Month start | Next month | Income | Expenses | Candidate expenses | Estimated payments | Candidate km |
|---|
Add these formulas in row 12.
A12:
=IF(ISNUMBER($B$2),DATE($B$1,ROWS($A$12:A12),1),"CHECK YEAR")
B12:
=IF(ISNUMBER(A12),EDATE(A12,1),"CHECK YEAR")
C12:
=IF(NOT(AND(ISNUMBER($A12),ISNUMBER($B12))),"CHECK YEAR",SUMIFS('Tax Log'!$E$2:$E,'Tax Log'!$C$2:$C,"Income",'Tax Log'!$A$2:$A,">="&$A12,'Tax Log'!$A$2:$A,"<"&$B12,'Tax Log'!$L$2:$L,"OK"))
D12:
=IF(NOT(AND(ISNUMBER($A12),ISNUMBER($B12))),"CHECK YEAR",SUMIFS('Tax Log'!$E$2:$E,'Tax Log'!$C$2:$C,"Expense",'Tax Log'!$A$2:$A,">="&$A12,'Tax Log'!$A$2:$A,"<"&$B12,'Tax Log'!$L$2:$L,"OK"))
E12:
=IF(NOT(AND(ISNUMBER($A12),ISNUMBER($B12))),"CHECK YEAR",SUMIFS('Tax Log'!$E$2:$E,'Tax Log'!$C$2:$C,"Expense",'Tax Log'!$I$2:$I,"Candidate",'Tax Log'!$A$2:$A,">="&$A12,'Tax Log'!$A$2:$A,"<"&$B12,'Tax Log'!$L$2:$L,"OK"))
F12:
=IF(NOT(AND(ISNUMBER($A12),ISNUMBER($B12))),"CHECK YEAR",SUMIFS('Tax Log'!$E$2:$E,'Tax Log'!$C$2:$C,"Estimated payment",'Tax Log'!$A$2:$A,">="&$A12,'Tax Log'!$A$2:$A,"<"&$B12,'Tax Log'!$L$2:$L,"OK"))
G12:
=IF(NOT(AND(ISNUMBER($A12),ISNUMBER($B12))),"CHECK YEAR",SUMIFS('Tax Log'!$F$2:$F,'Tax Log'!$C$2:$C,"Mileage",'Tax Log'!$I$2:$I,"Candidate",'Tax Log'!$A$2:$A,">="&$A12,'Tax Log'!$A$2:$A,"<"&$B12,'Tax Log'!$L$2:$L,"OK"))
Fill A12:G12 through row 23, then apply these formats:
Summary!A12:B23:yyyy-mm-ddSummary!C12:F23: USD currency with 2 decimal placesSummary!G12:G23: custom number format0.0 "km"
Expected results include:
| Month | Income | Expenses | Candidate expenses | Estimated payments | Candidate km |
|---|---|---|---|---|---|
| January | $1,200.00 | $80.50 | $80.50 | $0.00 | 38.6 km |
| April | $0.00 | $0.00 | $0.00 | $200.00 | 0.0 km |
For quarterly reporting, enter the same headers in A26:G26, followed by these formulas.
A27:
=IF(ISNUMBER($B$2),DATE($B$1,1+3*(ROWS($A$27:A27)-1),1),"CHECK YEAR")
B27:
=IF(ISNUMBER(A27),EDATE(A27,3),"CHECK YEAR")
C27:
=IF(NOT(AND(ISNUMBER($A27),ISNUMBER($B27))),"CHECK YEAR",SUMIFS('Tax Log'!$E$2:$E,'Tax Log'!$C$2:$C,"Income",'Tax Log'!$A$2:$A,">="&$A27,'Tax Log'!$A$2:$A,"<"&$B27,'Tax Log'!$L$2:$L,"OK"))
D27:
=IF(NOT(AND(ISNUMBER($A27),ISNUMBER($B27))),"CHECK YEAR",SUMIFS('Tax Log'!$E$2:$E,'Tax Log'!$C$2:$C,"Expense",'Tax Log'!$A$2:$A,">="&$A27,'Tax Log'!$A$2:$A,"<"&$B27,'Tax Log'!$L$2:$L,"OK"))
E27:
=IF(NOT(AND(ISNUMBER($A27),ISNUMBER($B27))),"CHECK YEAR",SUMIFS('Tax Log'!$E$2:$E,'Tax Log'!$C$2:$C,"Expense",'Tax Log'!$I$2:$I,"Candidate",'Tax Log'!$A$2:$A,">="&$A27,'Tax Log'!$A$2:$A,"<"&$B27,'Tax Log'!$L$2:$L,"OK"))
F27:
=IF(NOT(AND(ISNUMBER($A27),ISNUMBER($B27))),"CHECK YEAR",SUMIFS('Tax Log'!$E$2:$E,'Tax Log'!$C$2:$C,"Estimated payment",'Tax Log'!$A$2:$A,">="&$A27,'Tax Log'!$A$2:$A,"<"&$B27,'Tax Log'!$L$2:$L,"OK"))
G27:
=IF(NOT(AND(ISNUMBER($A27),ISNUMBER($B27))),"CHECK YEAR",SUMIFS('Tax Log'!$F$2:$F,'Tax Log'!$C$2:$C,"Mileage",'Tax Log'!$I$2:$I,"Candidate",'Tax Log'!$A$2:$A,">="&$A27,'Tax Log'!$A$2:$A,"<"&$B27,'Tax Log'!$L$2:$L,"OK"))
Fill A27:G27 through row 30 and apply these formats:
Summary!A27:B30:yyyy-mm-ddSummary!C27:F30: USD currency with 2 decimal placesSummary!G27:G30: custom number format0.0 "km"
The expected quarterly view is:
| Quarter | Income | Expenses | Candidate expenses | Estimated payments | Candidate km |
|---|---|---|---|---|---|
| Q1 | $1,200.00 | $80.50 | $80.50 | $0.00 | 38.6 km |
| Q2 | $0.00 | $0.00 | $0.00 | $200.00 | 0.0 km |
| Q3 | $0.00 | $0.00 | $0.00 | $0.00 | 0.0 km |
| Q4 | $0.00 | $0.00 | $0.00 | $0.00 | 0.0 km |
The distance formulas include only Mileage records tagged Candidate. Valid Mileage rows tagged Unreviewed or Not claimed aren’t included in these summary or reconciliation measures.
For more complex groupings, see How to Use QUERY in Google Sheets for Finance.
Reconcile source records to quarterly totals
The reconciliation covers quarterly income, expenses, estimated payments, and Candidate mileage. It doesn’t reconcile all mileage records or Candidate expenses as a separate metric.
For the illustrative fixture, the source-control schedule is:
| Source reference | Date | Source measure | Q1 | Q2 | Q3 | Q4 |
|---|---|---|---|---|---|---|
| invoice-1001.pdf | 2026-01-01 | Income (USD) | 1200 | 0 | 0 | 0 |
| receipt-0110.pdf | 2026-01-10 | Expense (USD) | 80.50 | 0 | 0 | 0 |
| route-0115.pdf | 2026-01-15 | Candidate distance (km) | 38.6 | 0 | 0 | 0 |
| payment-confirmation.pdf | 2026-04-15 | Estimated payment (USD) | 0 | 200 | 0 | 0 |
| invoice-prior-year.pdf | 2025-12-31 | Income (USD) | Excluded | Excluded | Excluded | Excluded |
In live use, derive source totals from actual statements, invoices, receipts, confirmations, and mileage records. Don’t copy totals from Tax Log, as that would make the comparison circular.
Create the Q1 and Q2 reconciliation table in Summary!A33:G37:
| Metric | Q1 source total | Q1 sheet total | Q1 variance | Q2 source total | Q2 sheet total | Q2 variance |
|---|---|---|---|---|---|---|
| Income | 1200 | 0 | ||||
| Expense | 80.50 | 0 | ||||
| Estimated payment | 0 | 200 | ||||
| Candidate distance (km) | 38.6 | 0 |
Use these sheet-total formulas:
| Cell | Formula |
|---|---|
| C34 | =C27 |
| C35 | =D27 |
| C36 | =F27 |
| C37 | =G27 |
| F34 | =C28 |
| F35 | =D28 |
| F36 | =F28 |
| F37 | =G28 |
Then add the variance formulas.
In D34, fill through D36:
=IF(AND(ISNUMBER(B34),ISNUMBER(C34)),ROUND(B34-C34,2),"CHECK INPUTS")
In D37:
=IF(AND(ISNUMBER(B37),ISNUMBER(C37)),ROUND(B37-C37,1),"CHECK INPUTS")
In G34, fill through G36:
=IF(AND(ISNUMBER(E34),ISNUMBER(F34)),ROUND(E34-F34,2),"CHECK INPUTS")
In G37:
=IF(AND(ISNUMBER(E37),ISNUMBER(F37)),ROUND(E37-F37,1),"CHECK INPUTS")
Now create the Q3 and Q4 reconciliation table in Summary!A40:G44:
| Metric | Q3 source total | Q3 sheet total | Q3 variance | Q4 source total | Q4 sheet total | Q4 variance |
|---|---|---|---|---|---|---|
| Income | 0 | 0 | ||||
| Expense | 0 | 0 | ||||
| Estimated payment | 0 | 0 | ||||
| Candidate distance (km) | 0 | 0 |
Use these sheet-total formulas:
| Cell | Formula |
|---|---|
| C41 | =C29 |
| C42 | =D29 |
| C43 | =F29 |
| C44 | =G29 |
| F41 | =C30 |
| F42 | =D30 |
| F43 | =F30 |
| F44 | =G30 |
Add the remaining variance formulas.
In D41, fill through D43:
=IF(AND(ISNUMBER(B41),ISNUMBER(C41)),ROUND(B41-C41,2),"CHECK INPUTS")
In D44:
=IF(AND(ISNUMBER(B44),ISNUMBER(C44)),ROUND(B44-C44,1),"CHECK INPUTS")
In G41, fill through G43:
=IF(AND(ISNUMBER(E41),ISNUMBER(F41)),ROUND(E41-F41,2),"CHECK INPUTS")
In G44:
=IF(AND(ISNUMBER(E44),ISNUMBER(F44)),ROUND(E44-F44,1),"CHECK INPUTS")
Apply these formats so source inputs, sheet totals, and variances use the same displayed precision:
Summary!B34:D36,E34:G36,B41:D43, andE41:G43: USD currency with 2 decimal placesSummary!B37:D37,E37:G37,B44:D44, andE44:G44: custom number format0.0 "km"
Enter Quarterly reconciliation status in A46 and this formula in B46:
=IF(COUNT(D34:D37,G34:G37,D41:D44,G41:G44)<>16,"CHECK INPUTS",IF(SUM(ARRAYFORMULA(ABS(D34:D37)))+SUM(ARRAYFORMULA(ABS(G34:G37)))+SUM(ARRAYFORMULA(ABS(D41:D44)))+SUM(ARRAYFORMULA(ABS(G41:G44)))=0,"TIED","INVESTIGATE"))
The expected result is:
- Every variance in
D34:D37,G34:G37,D41:D44, andG41:G44equals 0. B46displaysTIED.- The dashboard control in
E4displaysTIED.
TIED means the source controls and sheet totals agree at the reconciliation’s reporting precision: 2 decimal places for USD and 1 decimal place for kilometers. It doesn’t prove equality at a finer precision. For example, $80.500 and $80.504 produce a displayed variance of $0.00.
Enter source controls and transaction amounts at the precision required by your accounting policy. Also remember that a zero reported variance doesn’t prove a source document is genuine, complete, or correctly classified for tax purposes.
Protect formulas and finish the one-page dashboard
Protect the prepared status-formula range:
- Select
Tax Log!L2:L1000. - Choose Data > Protect sheets and ranges.
- Restrict editing to the workbook owner or designated finance editors.
Protect the Summary sheet while leaving these input ranges editable:
B1for the tax yearB34:B37for Q1 source-control totalsE34:E37for Q2 source-control totalsB41:B44for Q3 source-control totalsE41:E44for Q4 source-control totals
Protected cells should include the period formulas, annual totals, monthly and quarterly summaries, reconciliation formulas, and validation reference lists.
Apply conditional formatting to Summary!B46 and Summary!E4:
- Green when the text is
TIED - Red when the text is
INVESTIGATEorCHECK INPUTS
To create a printable one-page control dashboard:
- Keep the visible dashboard in
Summary!A1:G46. - Hide columns
I:Kif you don’t want the validation lists printed. - Choose File > Print.
- Select the current sheet.
- Set the scale to Fit to page.
- Check the print preview before printing or saving.
The expected dashboard state for the unchanged fixture is:
| Control | Expected result |
|---|---|
| Rows needing correction | 0 |
| Missing source references | 0 |
| Annual income | $1,200.00 |
| Annual expenses | $80.50 |
| Annual estimated payments | $200.00 |
| Q1 through Q4 reported reconciliation variances | $0.00 or 0.0 km, according to the metric |
| Quarterly reconciliation status | TIED |
These are reproducible cell-level views, not screenshots or results from an attached workbook.
Inspect a seeded error with ModelMonkey
ModelMonkey is an AI assistant for spreadsheet work in Google Sheets and Excel. In Google Sheets, it can use the active spreadsheet, sheet, and selected-range context to read tables, search content, analyze data, help with formulas, organize cells, and create or adjust charts.
In a test copy of the workbook, seed one error:
- Replace
Tax Log!E3, currently80.50, with the texteighty. - If validation rejects the entry, paste it into an unvalidated test copy to simulate imported data.
- Confirm that
Tax Log!L3changes toINVALID AMOUNT. - Confirm that
Summary!B10andSummary!E2change from 0 to 1. - Confirm that annual and Q1 expense totals become $0.00 because the summary formulas include only rows whose status is
OK. - Confirm that
Summary!D35, the Q1 expense variance, becomes $80.50. - Confirm that
Summary!B46andSummary!E4change toINVESTIGATE.
Then ask ModelMonkey:
Inspect Tax Log!A1:L1000 and Summary!A1:G46 without changing cells.
Find every populated Tax Log row whose Calculation status is not OK.
For each one, report the row number, source value causing the problem,
status, and effect on the annual or quarterly summaries.
Review all quarterly reconciliation variances and explain why the
quarterly reconciliation status is not TIED.
The expected inspection result for the seeded fixture is:
Tax Log row 3:
- Amount contains the text "eighty" instead of a number.
- Calculation status is INVALID AMOUNT.
- The row is excluded from expense and Candidate-expense summaries.
- Q1 source expenses are $80.50 while the Q1 sheet total is $0.00.
- The resulting $80.50 variance changes the quarterly reconciliation
status to INVESTIGATE.
This is the expected result of the proposed inspection, not a claim that the test was run here. Check ModelMonkey’s findings against the formulas and source record. When the workflow presents a preview for proposed spreadsheet changes, inspect it before proceeding.
Once the check is complete, restore Tax Log!E3 to 80.50. L3 should return OK, Q1 expenses should return to $80.50, and the reconciliation status should return to TIED.
For related spreadsheet-assistant examples, see Google Sheets Artificial Intelligence for FP&A. To perform this specific review, install ModelMonkey and ask it to inspect Tax Log!A1:L1000 together with Summary!A1:G46.
Run the remaining workbook checks
Run each check in a copy, then restore the original fixture. The results below are expected outcomes, not claims that the tests were run.
Many negative tests intentionally violate the validation rules. These include invalid years, blank or invalid required amounts, invalid distance, unsupported types or categories, invalid dates, and invalid Tax Year values.
For each test, use an unvalidated test copy or a paste/import action that bypasses validation. Otherwise, Google Sheets may reject the input before the status formula can evaluate it.
| Check | Test input | Expected result |
|---|---|---|
| Period formulas | Keep Summary!B1 at 2026 | B2 displays 2026-01-01 and B3 displays 2027-01-01 |
| Invalid year text | Paste abc into an unvalidated B1 | B2 and B3 display CHECK YEAR |
| Maximum supported year | Set B1 to 9998 | B2 displays 9998-01-01 and B3 displays 9999-01-01 |
| Unsupported year | Paste 9999 into an unvalidated B1 | B2 and B3 display CHECK YEAR |
| Blank row | Leave Tax Log!A7:K7 empty while retaining the formula in L7 | L7 remains blank and summaries don’t change |
| Missing status formula | Clear L7, then populate A7:K7 with a valid record | The row is silently excluded, demonstrating why every entry row must retain the column L formula; restore the formula afterward |
| Blank amount | In an unvalidated copy, clear the amount from a non-Mileage row | Status becomes INVALID AMOUNT; the row is excluded |
| Text amount | In an unvalidated copy, enter eighty as an amount | Status becomes INVALID AMOUNT; the row is excluded |
| Negative amount | In an unvalidated copy, enter -80.50 as an amount | Status becomes INVALID AMOUNT; the row is excluded |
| Zero amount | Enter 0 on an otherwise valid non-Mileage row | Status remains OK, and the row contributes $0.00 |
| Invalid mileage | In an unvalidated copy, clear or enter text in Distance on a Mileage row | Status becomes INVALID KM |
| Zero mileage | Enter 0 on an otherwise valid Mileage row | Status remains OK, and the row contributes 0.0 km |
| Invalid type | In an unvalidated copy, change Record Type to Refund | Status becomes INVALID TYPE |
| Unknown category | In an unvalidated copy, paste Unknown category into column D | Status becomes INVALID CATEGORY; the row is excluded |
| Category/type mismatch | Use Office supplies on an otherwise valid Income row | Status can remain OK because the workbook doesn’t enforce category-to-type relationships |
| Invalid early date | In an unvalidated copy, paste numeric date serial 0 with Tax Year 1899 | Status becomes INVALID DATE; the row is excluded |
| Matching tax year | Use date 2026-12-31 and Tax Year 2026 | Status is OK when the other fields are valid |
| Year mismatch | In an unvalidated copy, use date 2027-01-01 and Tax Year 2026 | Status becomes YEAR MISMATCH |
| Missing tax year | In an unvalidated copy, clear Tax Year on a populated row | Status becomes INVALID TAX YEAR |
| Non-integer tax year | In an unvalidated copy, enter 2026.5 in Tax Year | Status becomes INVALID TAX YEAR |
| Annual totals | Restore the original fixture | Income is $1,200.00, expenses are $80.50, Candidate expenses are $80.50, payments are $200.00, and Candidate distance is 38.6 km |
| Prior-year exclusion | Keep the valid 2025 record | It remains structurally OK but contributes nothing to the 2026 summaries |
| Monthly boundary | Add valid income on 2026-02-01 | It belongs to February, not January |
| Quarterly boundary | Add a valid record dated 2026-04-01 | It belongs to Q2 because Q1 ends before April 1 |
| Deduction-tag change | Change the $80.50 expense from Candidate to Unreviewed | Total expenses remain $80.50; Candidate expenses become $0.00 |
| Candidate mileage scope | Change the 38.6 km Mileage row from Candidate to Unreviewed | The row remains structurally OK, but Candidate distance becomes 0.0 km; the Q1 distance variance remains 38.6 km until the independently derived Candidate source total is updated |
| Duplicate record | Duplicate the $1,200 income row | Annual income becomes $2,400.00 because the workbook doesn’t remove duplicates |
| Opening balance | In an unvalidated copy, set Record Type to Opening balance | Status becomes INVALID TYPE, and the row is excluded |
| Missing source reference | Clear J2 without changing other fields | Summary totals remain unchanged, but the warning and missing-reference count activate |
| Empty period | Use a period with no qualifying records | SUMIFS returns numeric 0, displayed as $0.00 or 0.0 km according to the metric |
| Rounded money variance | Set a source total to 80.500 and its sheet total to 80.504 | The reported variance displays $0.00; TIED means agreement at 2-decimal reporting precision |
| Rounded distance variance | Set a source distance to 38.60 and its sheet total to 38.64 | The reported variance displays 0.0 km; TIED means agreement at 1-decimal reporting precision |
| Q3 or Q4 source difference | Add a nonzero source total without a matching sheet record | The applicable variance becomes nonzero and B46 changes to INVESTIGATE |
The duplicate test shows why reconciliation remains necessary. Review repeated dates, descriptions, amounts, document references, refunds, transfers, and opening balances instead of assuming the formulas will identify them.
For each close or tax-review cycle:
- Compare income, expenses, and estimated-payment records with bank or card statements and other source records.
- Compare Candidate mileage entries with the independently derived Candidate subset of the vehicle or travel log.
- Review Unreviewed and Not claimed mileage separately because the dashboard doesn’t reconcile those records.
- Enter independently derived source totals for all 4 quarters.
- Investigate every nonzero quarterly reconciliation variance.
- Filter column L for statuses other than
OK. - Confirm that every populated row has the status formula in column L.
- Resolve missing source references and confirm that each reference still opens the intended record.
- Review category and deduction tags with the person responsible for tax treatment.
- Record the review date or unresolved explanation in column K.
- Confirm that
Summary!B46displaysTIEDat the stated reporting precision before distributing the dashboard.
Keep original receipts, statements, confirmations, and mileage evidence outside the spreadsheet according to your organization’s document-retention and access policies.
Wrapping Up
The completed Google Sheets tax tracker combines a protected transaction log, annual and period summaries, a one-page control dashboard, and a quarterly reconciliation for income, expenses, estimated payments, and Candidate mileage.
For the illustrative 2026 fixture, the target values are $1,200.00 of income, $80.50 of expenses, $200.00 of estimated payments, and 38.6 km of Candidate mileage. Every reported quarterly source variance should display $0.00 or 0.0 km, producing a TIED status at 2-decimal USD and 1-decimal distance precision.
Use these controls to organize records and identify differences. Confirm classifications, deduction treatment, filing requirements, and tax liability with a qualified tax professional.
Frequently Asked Questions
Does the tracker calculate how much tax I owe?
No. It organizes source records and summarizes user-entered classifications. It doesn’t apply tax rates, credits, entity rules, jurisdiction rules, filing deadlines, or prior-payment adjustments.
Does a Calculation status of OK mean a record is approved?
No. OK means the row passed the stated structural checks. It doesn’t confirm that the transaction is valid, unique, supported, deductible, or assigned to the correct category for its record type.
What does TIED mean?
TIED means the entered source controls agree with the selected quarterly sheet totals after monetary variances are rounded to 2 decimal places and distance variances to 1 decimal place. It doesn’t establish equality at a finer precision or prove that the underlying records are complete.
Does the reconciliation cover every mileage record?
No. It covers only Mileage records tagged Candidate, matching the dashboard’s Candidate-distance metric. Unreviewed and Not claimed mileage must be reviewed separately or supported with an additional all-mileage control.
Why must the status formula be copied to every entry row?
The summary formulas require Calculation status = OK. A populated row without a formula in column L has a blank status, so it’s excluded from summaries and control counts. This guide prepares L2:L1000; extend that range before using later rows.
Why is the maximum tax year 9998?
The formulas calculate January 1 of the following year as the exclusive period end. Limiting the selected tax year to 9998 allows that boundary to remain within year 9999.
Why doesn’t the workbook automatically remove duplicates?
Removing a suspected duplicate without reviewing its source could remove a legitimate repeated transaction. The duplicate test shows that both rows are counted so the difference can be investigated during reconciliation.
Is a downloadable template included?
No downloadable workbook or screenshot accompanies this guide. The exact tabs, cells, formulas, formats, inputs, protection ranges, and expected results are provided so you can reproduce and verify the workbook before entering live records.
How do I roll the tax tracker forward to another year?
Change Summary!B1 to the new year and replace the Q1 through Q4 source-control inputs in B34:B37, E34:E37, B41:B44, and E41:E44. Test January 1, each quarter boundary, December 31, and the first day of the following year before using the rolled-forward workbook.
What if my Google Sheets locale uses semicolons?
Replace formula argument commas with semicolons where required by the locale. Array constants may also use different row or column separators. Recheck the fixture totals and displayed number formats after converting the formulas.