← petervijeh.com

I built a scanner to find a SaaS worth cloning. Its best answer was “don’t.”

I scored all 1,074 companies in Constellation Software's portfolio for how cleanly one person could rebuild them, then checked whether a stranger could buy without a sales call. One percent publish a price. The thesis dies at the pricing page.

The premise
AI collapsed the cost of building software, so the neglected vertical SaaS layer is finally clonable by one engineer and a coding agent
The test
Name the specific company that person should clone, out of the largest concentration of aging vertical software anyone owns: Constellation Software
How
Rebuild the portfolio list nobody publishes (1,074 companies, half of them out of the 2024 annual report), LLM-score every one for rebuildability, then scan all their pricing pages for the thing the premise assumes — that a stranger can buy without a sales call
The result
1% publish a price. Nine of 442 clear the screen, two clear it well, and I built nothing
Why it failed
Constellation buys phone-sold, contract-renewing software on purpose, so the portfolio is selected against a founder who won't make sales calls. Rebuilding was never the moat; the sales motion is, and AI didn't make that cheaper

The claim: one person with AI agents can now clone legacy SaaS

Everyone has the same take: AI collapsed the cost of building software, so the fat, neglected vertical SaaS layer is finally disruptable by one engineer and a coding agent.

Fine. Which company, specifically, should that person clone starting Monday? I built the list, scored every company on it, then scraped all of them to check the one thing the argument assumes.

The answer was none of them, and the reason is better than a yes would have been. Every number here comes out of a scan I can re-run, and every company is named.

Where to look: a holdco that owns ~1,000 neglected products

Constellation Software has spent thirty years buying small vertical software businesses — dental labs, municipal utility billing, tutoring scheduling, funeral homes, transit fare collection — and holding them forever. Hold the product steady, raise prices annually, optimize for retention. Customers stay because it's the only serious software in their industry.

A thousand aging products in a thousand niches, and nobody has the list: published portfolio maps top out around 262 companies, Tracxn has 31, PitchBook 89. If the list is hard to build, nobody has picked it over. And these aren't founders' life work — they're holdco assets run for cash.

One thing I didn't think hard enough about, and it turns out to be the punchline: Constellation doesn't buy companies at random. It buys a type.

Step 1: 1,074 companies, half of them from an annual report

No single source has the CSI universe, so the scanner sweeps four and reconciles them:

That's 1,074 active companies, 989 with verified domains. The hard part wasn't crawling, it was deciding when two rows are the same company: "Ecotime," "Ecotime by HBS," a bare domain and a nameless row are one business, and until they merge you can't even count.

Where 1,074 companies went Where 1,074 companies went Every stage is public data; the last two stages are the whole result Companies in the portfolio 1,074 With a verified domain 989 Scored on the pricing screen 442 Clear 4.5/10 on the screen 9 Clear 6/10 2 The screen that cut 442 to 9 was one HTTP request per company.

Step 2: scoring every company for rebuildability, for $8

An LLM enriched each company from the web — vertical, workflow, segment, size, pricing model, competitors — and a second model scored the question that matters: is there an accessible niche here a solo founder could attack? Not "can you replace the incumbent," which is always no.

FieldWhat it measures
soloFounderScore1–10, overall attractiveness
buildFeasibility1–5, can one dev ship an MVP in under three months?
gtmFeasibility1–5, can a solo founder reach these customers?
marketWorth1–5, is the niche revenue worth the effort?
incumbentStagnation1–5, how neglected is the product?
attackAnglethe specific segment, feature, and channel to attack
The scan was optimistic The scan was optimistic LLM scoring of “could one person rebuild this?”, before distribution was checked 7 1 61 2 81 3 255 4 126 5 284 6 201 7 55 8 Solo-founder score (1–10), all 1,074 companies 540 companies score 6 or better Nine survive the pricing screen Ranking on the wrong axis produces a confident ranking of unbuyable companies.

Fifty-five companies at 8/10 and a clean top fifteen — Teachworks (tutoring ops), Magic Pulse (salon software), Commerce Sync (POS to accounting), Conasys (builder warranties), EZFacility, FunctionFox, Top Producer, SoftChalk, TORCHx, Vizergy and the rest. The bottom is what you'd expect: safety-critical, hardware-coupled, government.

The project looked finished. Ranked list, top candidates, an attack angle for each. Then the actual constraint showed up.

Step 3: the question I never scored — can a stranger buy it?

My real brief was: which of these should I build, given that I will not do sales calls? That's a distribution constraint, and the scanner had no opinion about distribution. It had spent a thousand LLM calls on "could I rebuild this?" and never asked "could I sell it without getting on the phone?"

For a no-call motion, five things have to be true at once:

Most of the top fifteen died on the spot. Alteva is VoIP provisioning. Vizergy, 97Display and TORCHx are marketing retainers dressed as software. SoftChalk sells to institutions. EZFacility and Top Producer need multi-seat migrations, and Top Producer needs MLS board approval on top. FunctionFox is a crowded per-seat market with $9/user entrants. Notuleerservice Nederland turned out to be humans taking minutes, not software.

Two survived: Commerce Sync and Teachworks.

The two candidates I recommended, then killed

Commerce Sync was the perfect shape: $24.95–59.95/mo published, self-install from the Square marketplace with a card, MVP is pure data plumbing. I recommended it. Then I looked at the market instead of the product, and Intuit ships the same connector free — QuickBooks Online's own Square sync imports sales, fees, taxes and tips daily, for $0, and Amaka gives one away too. Your prospect's default action costs nothing, so the pitch becomes edge-case correctness, which is the hardest thing to convey without a conversation. The marketplace isn't distribution either: it's a shelf ranked by installs and reviews, held by Synder (~$3.8M ARR), Bookkeep, A2X, Webgility, Shogo and Connex. The one warm channel left is bookkeepers with dozens of merchant clients — webinars, calls, conference booths. Exactly the motion I was avoiding.

The candidate that replaced it lasted six hours. Re-ranking offline surfaced an add-on for auto repair shops: daily KPIs and declined-service follow-up on top of Tekmetric and Shopmonkey. Strictly better on the axes that mattered — those platforms publish $199–499/mo, so a $49–99/mo add-on is an impulse buy; no free substitute exists in automotive; no migration, so no seasonal switching window. Then diligence: AutoRx already ships exactly that, $50/mo, self-serve, no credit card, "set up in under 5 minutes," plus the coach-affiliate program I thought was my wedge. PULSE, HiBeam and Steer cover the variants. And Tekmetric's API is partner-gated — a discretionary 2–3 week approval, i.e. a sales call before I'm allowed to sell anything.

Both picks were invisible on the incumbent's website and obvious one search past it, where the swarm of $50/mo AI-era entrants lives. Reading the incumbent tells you about the incumbent. It tells you nothing about who is already eating the niche.

Step 4: replacing my judgment with one HTTP request per company

Two retractions in, my recommendation rested on my own prose, which is not a system. So I turned the lens into code: a deterministic collector that reads each company's own pricing page. One HTTP fetch per company, no model tokens, cheap enough to run across the entire universe.

Sub-signalWeightWhy it's there
publishes a price0.25A printed number means the category tolerates buying without a conversation
self-serve signup exists0.20You can start without a human
cheapest plan ≤ $200/mo0.20Card-swipe range
listed on a marketplace0.10Someone else's shelf does the distribution
no "book a demo" CTA0.25The sales call, made machine-readable
free-substitute penalty×0.4 / ×0.7You're priced against what the platform gives away

Why obsess over a published price? It's the cheapest machine-readable proxy for whether a stranger is allowed to transact. A hidden price usually means four things at once: the price varies per deal, so someone negotiates it; the contract has to be big enough to pay that someone; there's an onboarding fee; and the buyer is a committee. None of that is visible from a homepage. All of it shows up as "contact us for pricing."

It also gates the plan. A no-call motion runs on comparison content — "the incumbent is $15–187/mo, here's what we charge." You can't write that page against a vendor who won't say, and the reader can't self-qualify, so every visitor arrives needing a conversation.

The result: 1 in 100 companies publishes a price

What 442 pricing pages actually say What 442 pricing pages actually say Share of scored companies showing each signal of a no-sales-call purchase 0% 25% 50% 75% 100% Publishes a price 1% Cheapest plan ≤ $200/mo 1% Listed on a marketplace 6% Has a pricing page at all 9% Self-serve signup 12% Explicit “contact sales” 20% In the app ecosystems I should have scanned instead, a published price is near universal.

442 companies scored; the rest had dead or unusable domains. Nine clear 4.5/10 on the composite and two clear 6. I had budgeted the expensive research stage for ~150 survivors. That gap is the most informative number in the project.

"1% publish a price" and "my crawler can't find pricing pages" produce identical output, so before believing it I re-checked a random 45 companies with a deliberately different implementation: follow each site's own navigation instead of guessing URLs, six pages per company instead of one, annual and "from $X" prices included. Still one published price in 45. Restricted to the 267 companies that own their own domain rather than redirecting to an operating group's corporate site, the base rates barely move: 2% publish a price, 31% say "contact sales," 9% have a pricing page at all.

Any measurement whose failure mode correlates with the thing you're measuring will lie to you in the flattering direction. If you build one of these, build the second implementation too.

Why: Constellation buys the exact companies I can't attack

1% of a portfolio publishing a price is not a scraping artifact. It's what Constellation buys: phone-sold, contract-renewing, switching-cost-heavy software with high retention. A product a stranger could buy unattended for $49/mo would be a bad CSI acquisition — nobody has to call to cancel it, and its moat isn't made of migration pain.

So the list I spent weeks building was pre-filtered against me. The acquirer's selection criteria are almost the exact inverse of the solo-founder-with-no-sales-team criteria.

Which kills the take I started with. "AI makes it cheap to rebuild SaaS" is true and mostly irrelevant: building was never the moat in vertical software. The moat is the sales motion, and AI has not made it cheaper to be a stranger asking a municipal utility to change billing systems. The cost floor that collapsed was already the smallest line item.

The two survivors are the same shape: published price, self-serve signup, under $200/mo, sold to an owner-operator. Teachworks ($15–187.99/mo, 4.6 across 64 Capterra reviews) is the one I'd have built — its whole comparable set is paid and self-serve (TutorBird $14.95/mo, TutorCruncher $30/mo plus card fees, MyMusicStaff $14.95/mo), so there's no free default to lose to, competitors visibly fund comparison content, and the pain is page-shaped: unpredictable per-lesson bills, a card fee that's a calculator waiting to be written. Lightning Payroll (Australian payroll, from $15.50/mo, self-serve) is the other.

Two out of 1,074 is not a pipeline. Starting over, I'd change the seed list, not the code: point the same machinery at a universe that's self-serve by construction — the Shopify, QuickBooks or Atlassian app ecosystems, or the sub-$100/mo vertical long tail — where published pricing is near universal instead of 1%.

The uncomfortable version: the cheapest way to own phone-sold, high-retention vertical software is not to rebuild it with AI. It's to buy it. Which is precisely the business Constellation is in, and precisely why its portfolio was the wrong place to look.

So am I building any of them? No

Teachworks is a genuinely good target and I'm still not doing it, because the honest version of the plan has a sales motion in it. Not cold calling — a migration to land, a December–January switching window, an affiliate deal to negotiate, an importer to hand-hold. Quiet, but a sales motion, and "no SaaS sales" was the constraint I started with. The scan is what it took to learn the constraint eliminates the category, not just the candidates.

So the deliverable is this post, not a product. The salvage, if you're running the same play: the screen cost one HTTP request per company, it would have eliminated both of my picks in an afternoon, and I should have run it before the thousand LLM calls instead of after.

Five things I'd tell the next person running this play