course module
The Audit Template
The scoring sheet to run your own stack — kill / replace / keep, with the dollar column your CFO will ask for.
Free companion to the twelve-question scorecard. This is the Google Sheet spec your CFO or COO actually uses to walk the stack. Free tier — no gate.
What this sheet is
A single-tab spreadsheet where each row is one SaaS tool. Columns compute your annual bill, active-usage ratio, replaceability score, migration cost, and net savings. A rollup at the top shows total spend, total recoverable, and the top three kill candidates.
Every column is deterministic — no vendor names, no proprietary scoring hidden in a black box. If you disagree with a rank, change the input and the rank changes.
Suggested sheet name
Replace Your SaaS — {{Company}} — {{QuarterYear}}
Example: Replace Your SaaS — Acme Ops — Q3 2026
Column spec
| # | Column | Type | Notes |
|---|---|---|---|
| A | Tool name | Text | One row per contract, not per product family. If you pay two separate Salesforce contracts, that's two rows. |
| B | Category | Dropdown | CRM / PM / Dashboard / Support / Marketing / Finance / HR / Dev / Other. Drives grouping in the rollup. |
| C | Owner | Text | Named human. If the answer is "nobody" or "IT", start a kill flag immediately. |
| D | Annual cost | Currency | All-in: subscription + implementation amortized + admin time at $75/hr loaded. |
| E | Seats paid | Number | What's on the contract. |
| F | Seats active (30d) | Number | Actual logins in the last 30 days. Pull from the vendor admin panel. If unavailable, mark 0. |
| G | Active ratio | Formula | =IFERROR(F/E, 0). Below 0.3 is a kill signal. |
| H | Features used weekly | Number | Count of distinct features the team actually touches. |
| I | Overlap tool | Text | Name another tool in your stack that does at least half of what this one does. Blank = no overlap. |
| J | Last decision produced | Date | The last date this tool produced a decision, revenue, or a saved hour someone can name. |
| K | Weeks since last decision | Formula | =IFERROR(DAYS(TODAY(),J)/7, "n/a"). Above 8 is a kill signal. |
| L | Integration depth | Dropdown | None / Light / Medium / Heavy. Drives migration cost. |
| M | Compliance moat? | Dropdown | Contract-named / Cert-required / Nice-to-have / No. |
| N | Renewal date | Date | Next auto-renewal. |
| O | Days to renewal | Formula | =IFERROR(DAYS(N,TODAY()), "n/a"). Sort by this to sequence action. |
| P | Replaceability | Formula | Scored 0-100 by the rubric in the scorecard JSON. Kill / Replace / Keep bucket in column Q. |
| Q | Rank | Formula | =IF(P<35,"Kill",IF(P<70,"Replace","Keep")). |
| R | Migration cost (one-time) | Currency | Estimate: $500 for Light, $2,500 for Medium, $8,000 for Heavy. Zero if Rank=Kill. |
| S | Net year-1 savings | Formula | See formulas below. |
| T | Net year-2 savings | Formula | Column D minus vendor of the agent replacement. Migration cost drops off. |
| U | Trigger to pull the plug | Text | Free-text. The specific condition that has to be true before you cancel. Fill this in before you cancel, not after. |
| V | Action-by date | Formula | =N-45. Forty-five days before renewal is when you commit to the decision. |
| W | Notes | Text | Anything the row can't hold. |
Formulas
Column P (Replaceability score)
=MIN(100, MAX(0,
IF(G<0.3, 12, IF(G<0.6, 6, 2))
+ IF(H<=2, 12, IF(H<=5, 8, IF(H<=10, 4, 2)))
+ IF(I<>"", 10, 2)
+ IF(K="n/a", 2, IF(K<2, 2, IF(K<5, 4, IF(K<9, 7, 10))))
+ IF(L="None", 8, IF(L="Light", 5, IF(L="Medium", 3, 1)))
+ IF(M="Contract-named", 10, IF(M="Cert-required", 7, IF(M="Nice-to-have", 4, 2)))
))
Lower = kill more aggressively. Score under 35 lands in Kill, 35-69 in Replace, 70+ in Keep.
Column S (Net year-1 savings)
=IF(Q="Kill", D - R,
IF(Q="Replace", (D * 0.8) - R - 600,
IF(Q="Keep", ((E-F)/E) * D * 0.6, 0)))
Assumptions baked in: kill = 100% of spend recovered minus migration; replace = 80% recovered minus migration minus $600/yr for the agent-replacement runtime; keep = you renegotiate down to actual active seats and recover 60% of the inactive-seat spend.
Rollup (rows 1-6, above the table)
- Row 1 —
Total annual SaaS spend==SUM(D8:D) - Row 2 —
Total year-1 recoverable==SUM(S8:S) - Row 3 —
Kill candidates (count)==COUNTIF(Q8:Q, "Kill") - Row 4 —
Replace candidates (count)==COUNTIF(Q8:Q, "Replace") - Row 5 —
Top three kill by dollar= a QUERY pulling the three highest Column S rows where Q="Kill" - Row 6 —
Next 90 days action-by==COUNTIFS(V8:V, ">="&TODAY(), V8:V, "<="&TODAY()+90)
How to run the audit
- Populate every tool. Skip nothing. Even the $79/mo tools count — they add up.
- Pull real seat activity from the vendor admin panel. Not what the tool owner says. The admin panel.
- Fill column J (last decision produced) from memory, then verify with the owner. Gap between memory and reality is where kill signals live.
- Sort by Column O (days to renewal) ascending. That's your action sequence.
- For everything ranked Replace, open the migration playbook and follow the side-by-side plan for its category.
Free tier boundary
This sheet is free forever. The migration playbook — the actual side-by-side steps and pull-the-plug triggers for the three most common kill candidates — lives inside the Optimus portal for members.
Change log
- 1.0 — 2026-07-09 — Initial spec. Column set, scoring rubric, rollup formulas.