BACK_TO_BLOG
·3 min read·TwoOps / Lead Engine / Building / AI

Closing the free tier, gating the signup, and other things you only do once

Two products dominated the week: TwoOps moved to private beta with a CC-required trial, and the Lead Engine grew a real multi-product profile system.

Two product surfaces ate the week. Both forced honest decisions I'd been deferring.

TwoOps: killing the free tier before launch

The headline change is in TwoOps: I removed the Starter plan and switched signups to a private-beta gate. You can't reach /sign-up anymore without an invite token, and you can't reach /dashboard after invite redemption without a card on file. Stripe's payment_method_collection defaults to skipping cards during a trial; I flipped it to "always" so the trial isn't a free-access loophole.

The forcing function was margin math. At $99/mo with five users running ~3k Claude queries each, AI cost alone runs ~$375/mo per tenant. Plus ~$40/mo of Azure share at current dev-tier scale. That's a 16% gross margin on a product I have to actually support. I wrote up the math in a Track-B post (B02) and used it to justify the move to $149 and a qualifying-form invite request. The full Wave 2 work shipped across the signup gate, /trial-checkout interstitial, middleware trial enforcement, legacy waitlist migration, and a 0017 schema migration adding kind, company_size, primary_cloud, and review fields to waitlist_signups.

Adjacent but worth noting: the /docs corpus (50 pages, 11 categories) had to ship because the marketing site was linking to surfaces that didn't exist — app.twoops.ai, twoops.ai/cli, status.twoops.ai. I audited eight fabricated links and rewrote the claims to match reality. Docs being honest is a Track-B problem, not a marketing one.

The unglamorous half of the week was the operator UI. The /owner page panels for invite-requests and waitlist were rendering ~32px wider than the tenant table because of an intermediate wrapper div escaping the page container. Four commits to chase that down. Ended with max-w-5xl and the heading moved inside the card chrome to match the tenant table exactly. Pixel work is humbling.

Lead Engine: multi-product profile system

TwoFoldTech-Lead-Generation finally became a real platform instead of a Conduit/STUDIO hardcode. Each product gets a YAML profile defining ICP, discovery query groups, tech-signal matchers, pain keywords, scoring weights, and personalization prompts. TwoOps is the first new profile to ride on it.

The first real TwoOps run surfaced everything wrong with the old assumptions:

  • GitHub repo search for azurerm/bicep/aks returns publishers (Microsoft, Kubernetes-SIGs), not Azure-using consumers. Disabled GitHub for TwoOps and leaned on Adzuna's hiring signal as a cleaner proxy.
  • Apollo deprecated three things mid-week: api_key in body (→ X-Api-Key header), /people/search (→ /mixed_people/search, then /mixed_people/api_search after the first 422), and the single-string domain filter (→ list).
  • Manual review was gating on missing email or no pain signals. Apollo gates emails behind paid reveals, so every TwoOps lead was getting parked at manual-review and never scoring. Now only hard blockers (no domain, no stakeholder, individual-level employer) trigger review.
  • Railway's container filesystem is ephemeral. Every deploy wiped data/leads.db and the in-memory Slack pending-approvals store. Migrated both to Postgres.

A pile of dashboard work followed from actually using the thing: run-id-based polling (fast runs were completing before the 3s poller could catch the running state), expandable lead rows showing the full enrichment breakdown, per-product discovery tuning, an E2E test endpoint that builds two synthetic leads and force-routes one to HubSpot and one to Slack.

Small stuff

The personal site got an SEO pass — sitemap, robots, RSS, OG image generation — and the TwofoldTech entry got reframed from "boutique Sitecore consultancy" to "AI lab + studio," because that's what it actually is now. Removed the tokens counter from the footer; it only tracked the auto-blog generator, not real spend, and was misleading.

99 commits. Most of them tightening screws on two products that need to stand up on their own without me sitting next to them.