A walkthrough of the empty-column method on a fictional product, start to finish. The product and competitors here are invented; the reasoning is the part to take.
If you only read one thing in this repo, read this.
Ledgerline — bookkeeping software for small nonprofits. Two people, eighteen months old, a few hundred users, no funding. The founders describe it as "QuickBooks, but it understands restricted funds."
They asked for help with marketing. Their instinct was to write comparison content against QuickBooks and run ads on "nonprofit accounting software."
Reading the codebase rather than the homepage changed the picture immediately.
The marketing site described general bookkeeping: invoicing, expenses, reports. But the
data models told a different story. Alongside the ordinary ledger tables sat entities
the homepage never mentioned: RestrictedFund, GrantAllocation, DonorRestriction,
FunctionalExpenseAllocation, AuditTrailEntry with immutable revision history, and —
most interestingly — a whole AuditPacket module with document checklists, preparer
sign-offs, and export bundles.
That last one had been built for a design partner and was barely mentioned in public.
The finding: the product was substantially more specialized than its own marketing admitted. The homepage sold a generic ledger; the code described an audit-readiness system. That gap between what a product does and what its site claims is the most common and most valuable thing Phase 0 turns up.
Five competitors, researched from their live sites and pricing pages.
The instinct was to build columns like invoicing, reporting, bank sync. That's the trap: feature columns produce a checklist the biggest competitor always wins. Every one of those rows would be a ✓ for QuickBooks.
So instead the columns became the stages of the customer's actual year — the sequence a nonprofit finance person actually lives through:
Set up Record Track Produce Survive
the books the year restrictions statements the audit
Ledgerline ✓ ✓ ✓✓ ✓ ✓
QuickBooks ✓✓ ✓✓ partial ✓✓ ✗
Xero ✓✓ ✓✓ ✗ ✓✓ ✗
Aplos ✓ ✓ ✓ ✓ ✗
Sage Intacct ✓✓ ✓✓ ✓✓ ✓✓ partial
Spreadsheets improvised improvised improvised improvised ✗
One column is nearly empty for everyone: surviving the audit.
Every product in the category defines its job as producing correct financial statements. That's a coherent, defensible product boundary, and it's where accounting software has ended since accounting software existed.
But it isn't where the customer's problem ends. For a small nonprofit, the annual audit is the highest-stakes, most painful, most deadline-driven event of the year — and the software goes quiet exactly when it starts. What happens instead is six weeks of exporting to spreadsheets, hunting for receipts, and emailing zip files to the auditor.
The category converged on a boundary and nobody revisited it. That's the general pattern: the empty column is usually adjacent to the category, not inside it.
Four questions, from references/positioning.md:
Does the product actually do this? Yes — the AuditPacket module was real and
working, if under-polished. This is the question that kills most exciting wedges, and
it's why Phase 0 comes first.
Do customers feel the pain? Overwhelmingly. Nonprofit finance forums are full of audit-season threads. People had built elaborate personal checklists and were sharing them as Google Docs. Effort spent on a bad workaround is the strongest demand signal there is.
Would a competitor need a new product to answer it? Largely yes. Audit readiness isn't a report — it's document custody, immutable trails, preparer workflow, and auditor collaboration. QuickBooks can't ship that in a quarter.
Can you reach people at that moment? Yes, and better than expected: audit prep is seasonal and searched. "nonprofit audit preparation checklist" is a real, recurring, high-intent query owned by accounting-firm blog posts and association PDFs — not by any software vendor.
Four for four.
Positioning. From "QuickBooks, but it understands restricted funds" — a comparison to a giant, on the giant's turf — to:
Most nonprofit bookkeeping software ends at the financial statement. Ledgerline keeps going, through the audit.
Note the form: it states scope, not superiority. It's checkable, it isn't an attack, and it survives being quoted to a competitor's salesperson.
Category. They stopped claiming "nonprofit accounting software," where they were the worse QuickBooks, and claimed "audit-ready bookkeeping" instead — a category where the comparison set is spreadsheets and dread.
Audience order. Not the finance directors at large nonprofits, who buy on proof Ledgerline didn't have. Wave one became the part-time bookkeeper at a small nonprofit who personally suffers audit season and can just start using something.
Content. They dropped the QuickBooks comparison plan. The first pieces went at the audit-prep cluster: the checklist, what auditors actually ask for, how to prepare functional expense allocations, what to do when the auditor finds a problem. Genuinely useful to someone who never buys, aimed at a query with real seasonal volume that no vendor was defending.
The product roadmap moved too. The AuditPacket module went from a hidden
side-feature to the thing the homepage leads with. That's a normal outcome — positioning
research routinely tells you which half of your product is the actual business.
The wedge came from research, not from a brainstorm. Nobody sat in a room asking "what makes us special." The matrix produced it.
Journey columns, not feature columns. This is the single most important mechanical detail. Feature columns would have produced a losing checklist.
The gap sat at the end of the journey. In other products it's at the beginning, or in a handoff between two stages. Don't assume where it will be — build the whole journey and look.
Reading the code beat reading the homepage. The wedge was in the schema before it was in the marketing.
The honest version was stronger than the flattering one. "We go further than the category does" outperformed "we're better than QuickBooks," because the first is true and checkable and the second invites a comparison they lose.
- Write out your customer's journey as stages — from before they had any solution to after they got the outcome they wanted. Include the stages that feel outside your software category. Those are usually where the gap is.
- Put every competitor in as a row, including the non-software default — the spreadsheet, the agency, the manual process.
- Fill it in honestly. Mark partial support as partial.
- Find the empty column.
- Run the four tests before you build a strategy on it.
If no column is empty, you don't have a wedge from scope — say so plainly and look to audience, price, or approach instead. A fabricated differentiator produces marketing that collapses the first time a knowledgeable buyer reads it.