Skip to content
Case study · Active engagement

Building a sales operating system for a bootstrapped B2B SaaS fintech

Fractional Founding Head of Revenue & Success, via KAGrowth PartnersOctober 2025 → ongoingB2B SaaS · Fintech · Carolinas-adjacent

KAGrowth Partners was engaged in October 2025 to serve as fractional Founding Head of Revenue & Success for a bootstrapped B2B SaaS fintech. The company had about 10 paying users, a product in active development, and no operating layer translating audience definition into pipeline. Over the following months KAGrowth migrated the company off GoHighLevel onto Pipedrive, built a custom sales operating system as a 24/7 Node.js application, and stood up the full multichannel outbound, intent-capture, reply-triage, lead-scoring, post-demo, and proposal-generation motions that now produce 4 to 8 demos per week.

At a glance

4 to 8

Demos per week sourced from the new operating layer

205 → ~20

Leads enrolled to demos sourced in a 4-month outbound window

31

Duplicate CRM records merged during migration

What was broken when KAGrowth was brought in

The company had a clear product audience and a working sales motion lived in the founder's head. What it did not have was an operating layer translating either into pipeline.

The CRM was GoHighLevel. GoHighLevel is built for agencies and local service businesses running high-volume transactional sales, where the architectural assumptions are short cycles, single decision-makers, and channel-of-record marketing automation. None of those assumptions match a multi-stakeholder B2B SaaS consultative close. The stages did not fit the motion, the data model was wrong for the team's selling pattern, and the CRM carried significant data-hygiene debt: 31 duplicate person records identified during cleanup, plus organization-level duplication on top.

Outside the CRM, the gaps stacked up:

  • No structured outbound. No ICP-driven enrollment logic, no multichannel sequences, no deliverability monitoring, no campaign performance intelligence.
  • No intent capture. Website-visitor identification was running, but signals were not scored, tiered, or routed. Hot pricing-page visitors arrived in the same bucket as research-stage browsers.
  • No reply management. Inbound replies to outbound sequences landed in a personal inbox to be triaged by hand.
  • No post-demo motion. Demo recordings existed, but transcripts were not feeding the CRM, follow-up drafts were manual, and proposals were assembled from scratch every time.
  • No lead scoring. Every contact looked the same in the pipeline view.
  • No reporting layer. The founder ran the business off memory and intuition rather than off a dashboard.
  • No reusable workflow for conferences and events. Attendee lists were processed ad hoc.
  • No enforced voice or brand discipline. Drafts could go out sounding like any other generic SaaS vendor.

The single sentence that summarized the operating state: the founder was the bottleneck on every deal.

Migrating off GoHighLevel onto Pipedrive

The first architectural decision was a CRM migration. GoHighLevel was a category mismatch with the actual sales motion, and continuing to build on top of it would have compounded the structural problem. We migrated the company to Pipedrive and restructured the entire data model.

What that meant in practice:

  • Two pipelines, Main and Enterprise, each with its own stage progression. The Main pipeline maps to the standard motion: Lead → Demo Scheduled → Demo Completed → Proposal Sent → Negotiation → Won/Lost. Enterprise carries longer-cycle architecture.
  • A Marketing Status enum that distinguishes lifecycle states (cold, sequenced, replied, engaged, opted out, customer) without overloading deal stages.
  • A source-tag taxonomy that tracks where every contact came from, with field-level discipline so reporting can roll up by channel without manual reclassification.
  • Custom fields for ICP-fit dimensions, intent tier, lead score, signal history, last meaningful interaction.
  • Ownership routing so deals land with the right owner the moment they enter the pipeline.
  • 31 duplicate person records merged during cleanup. Organization-level deduplication completed in parallel.

A separate always-on service deployed on Railway syncs outbound-tool activity to the CRM in real time. Outbound webhooks never block the main sales OS application; the architecture is designed so a slow downstream service cannot break the upstream operating layer.

The migration sequence, in six steps

  1. Audit the GoHighLevel state. Pull record counts (contacts, opportunities by pipeline, notes, tasks, conversations), inventory every custom field and its fill rate, list active users by last-activity date, and catalog every workflow and tag with usage counts. The audit is the migration. Skipping it means moving garbage into a clean system.
  2. Design the Pipedrive schema before any data moves. Decide pipelines and stages, the Marketing Status enum, the source-tag taxonomy, custom fields for ICP fit and lead score, and ownership routing rules. The destination schema is the operating layer; the GoHighLevel schema was the constraint to break.
  3. Provision Pipedrive in dependency order. Create users and teams first so owner IDs exist, then pipelines and stages so deal_stage_id can be set on insert, then activity types, then custom fields. Capture each custom field's hash key in a mapping table because every subsequent API call references it.
  4. Build the mapping tables. GoHighLevel user ID to Pipedrive user ID, pipeline plus stage to Pipedrive pipeline_id and stage_id, GoHighLevel custom field ID to Pipedrive hash key, tag to label or multi-option value, opportunity status to deal status plus lost_reason. The mapping tables are the migration. Everything else is plumbing.
  5. Load in dependency order and deduplicate as you go. Organizations first, then Persons, then Deals linked to the right Persons, then Notes and Activities. The PlanSync migration merged 31 duplicate person records during this phase, plus organization-level deduplication in parallel. Loading deals before persons creates patching work that is miserable to clean up later.
  6. Cut over with a defined freeze window or dual-write. Either freeze writes to GoHighLevel for a fixed window and do a final delta migration, or run webhooks pushing new GoHighLevel records into Pipedrive in near-real-time during a parallel period. Active sales teams that cannot stop selling for a weekend need the dual-write path.

The custom sales operating system

The system that runs the day-to-day GTM motion is a Node.js application deployed on Render. It runs 24/7 as the autonomous intelligence layer beneath the entire sales motion. No third-party agent frameworks. Built from scratch with minimal, well-maintained dependencies.

The operating principle is constrained autonomy: the system proposes, the operator approves. Every external write action, whether a CRM update, a sequence enrollment, an outbound message, or a calendar invite, goes through an HMAC-signed Proceed/Cancel approval gate delivered through Google Chat. The system can do anything the operator could do, but never without an audit trail and a sign-off.

What the system does, in order of how it touches a typical deal:

Outbound enrollment

The system runs a 12-step multichannel sequence in Lemlist over 30 days, with LinkedIn touches interleaved with email, two voice notes, and a calendar link reserved for the break-up step. ICP filtering happens before enrichment spend. An industry qualifier check via Serper and Claude Haiku runs first; PDL (People Data Labs) enrichment runs only if the contact passes. A deliverability monitor auto-pauses any campaign on a bounce rate above 3% and alerts via Google Chat. 200 contacts are currently enrolled in the active track; 830 additional qualified contacts are staged for the next batch.

Intent scoring

Website-visitor identification feeds an intent scorer that tiers traffic into three tiers plus an enterprise flag. Tier 1 (pricing page, contact page, ecosystem overview, or two or more product pages in one session) triggers enrichment, ICP qualification, sequence enrollment, and an immediate Google Chat alert. Tier 2 routes to product-specific sequences. Tier 3 routes to nurture. A separate Sales Navigator signal monitor watches saved accounts for new-hire-in-role and promotion signals; either triggers enrichment and a contextual sequence enrollment.

Reply intelligence

Inbound replies to outbound sequences land pre-classified into five categories: Hot Demo Interest, Warm Soft Interest, Objection, Out of Office, Unsubscribe/Not Interested. Classification runs on Claude Haiku; drafting runs on Claude Sonnet. The Objection category routes through a playbook with response frameworks for the eight recurring objection types the team has seen. A wrong-person handler enriches the correct contact and drafts a warm intro to them, linked to the right CRM record. An OOO handler logs the return date and schedules a follow-up activity for return-plus-one-day.

Lead scoring

A composite 0 to 100 lead score runs daily at 6am ET across four dimensions: ICP Fit (40 points), Signal Strength (25 points), Engagement (20 points), Timing (15 points). Deterministic. Zero LLM cost. The score drives morning-briefing prioritization and triggers deal-coaching nudges.

Operating rhythm

A 9am ET daily briefing posts to Google Chat: new leads, hot replies, website visitors, stale deals (no activity in 14+ days), campaign health (sent, open, reply, click, bounce, interested rates against thresholds). Before the briefing sends, a Daily Action Plan job runs a full pipeline sweep, assembling per-deal context in parallel from the CRM, Gmail (90-day thread lookback), the outbound tool, the intent tool, and an observation snapshot log. One reasoning call per deal produces a prioritized, draft-ready action queue with Proceed/Skip gates. The operator walks into the day with the work already staged.

Pre-demo prep

90 to 105 minutes before any scheduled demo, the system pushes a pre-call brief to Google Chat with contact context, firm details, pain points pulled from prior interactions, and talking points based on the product pages the contact visited.

Post-demo workflow

Triggered automatically when a deal moves to Demo Completed in Pipedrive. The system pulls the demo transcript via the demo-recording tool's API, extracts pain points, product interest, objections, key account numbers, current tools, next steps, and competitor mentions, writes the extraction back to CRM notes, drafts a follow-up email in the operator's voice referencing specific call moments, and pre-populates a proposal template based on the demo's interest signals. Both drafts land in Google Chat for review.

Proposal generation

Four proposal templates are wired for one-click generation via Gamma. A Google Form submitted post-demo triggers an Apps Script POST to a webhook on the sales OS. Claude Sonnet drafts Executive Summary, Product Roadmap, Next Steps, and the final follow-up email in parallel. Gamma generates the proposal from the appropriate template. A Chat alert delivers the proposal URL and the final email draft. End-to-end: approximately one minute.

Inbound and intake

A Google Drive intake folder workflow (intake/, processing/, completed/, failed/) handles any CSV or Excel dropped in. Triage runs first (blacklist plus ICP filter, no API spend), an approval message goes to Chat with row count and estimated enrichment cost, and on approval the full enrichment pipeline runs. The pipeline is source-agnostic with column mapping in the UI, fuzzy auto-match, header-row detection across the first 20 rows, ICP filtering before enrichment spend, and an AI agent that extracts emails from scraped content where needed.

Event capture

A Chrome extension plus a mobile web capture page using Sonnet vision, writing to the CRM with a Google Sheets backup, makes conference and event motions reusable rather than ad hoc.

Voice and brand discipline as code

The KAGrowth principle: a system that drafts on the operator's behalf has to draft in the operator's voice. We codified the voice rules into a versioned reference and enforced them across every drafting path in code:

  • No em dashes (active sanitizer that strips and rewrites)
  • No antithesis or 'not X, it's Y' constructions
  • No formal openings or closings
  • Peer-to-peer tone
  • Single CTA per email
  • No links in body except the break-up step

An anti-fabrication block is injected into all 11 outbound drafting paths in the system. It covers four fabrication modes: invented assets, colleague commitments the operator did not make, invented people, external events that did not happen. Every draft passes through this guard before it can reach the approval queue.

Integrations and the cost discipline

The system runs on:

  • CRM: Pipedrive (21 MCP tools wired)
  • Outbound: Lemlist (7 MCP tools wired)
  • Intent: Leadfeeder for website-visitor identification
  • Demo recording: Claap for transcript API access
  • Enrichment: PDL (People Data Labs) for LinkedIn enrichment after Proxycurl shut down in July 2025
  • Proposals: Gamma
  • Calendar: Google Calendar with real-availability lookups (45-minute openings, Monday to Thursday preferred, Friday fallback, 9am to 5pm ET window)
  • Email: Gmail with 90-day thread lookback wired into every drafting path
  • Files: Google Drive scoped to a single folder
  • Alerts and approvals: Google Chat
  • Hosting: Render for the main sales OS, Railway for the outbound-sync service
  • Memory: Upstash Redis for per-user conversation history (20-turn rolling window, 24-hour TTL)
  • LLMs: All calls routed through OpenRouter via a single utility. Claude Haiku for classification and vision, Claude Sonnet for drafting. Daily spend cap.

A separate conversational layer uses a Claude.ai project as the strategic reasoning surface (interpreting campaign data, pressure-testing copy, working ICP edge cases). Inside Google Chat, free-text messages route to Claude Sonnet with read-only MCP tools and 20-turn conversation history; write-intent detection proposes the action with a Proceed/Cancel gate before any execution.

What the operating layer has produced

Headline: 4 to 8 demos per week sourced from the new operating layer.

Representative outbound sequence performance, 4-month window:

  • 205 leads enrolled
  • ~20 demos sourced
  • 48% open rate
  • 23.4% LinkedIn invitation acceptance rate
  • 21.3% click rate
  • 0.7% bounce rate against a 3% auto-pause threshold

Operating cadence shift. The daily 9am briefing runs off live data from the CRM, outbound tool, intent tool, and the lead scoring model rather than off the founder's memory. The Daily Action Plan produces a prioritized, draft-ready action queue before the workday starts.

Post-demo cycle time. Follow-up and proposal preparation collapsed from manual after every call to a personalized draft and pre-populated proposal in Google Chat within minutes of the call ending.

Proposal generation time. From manual deck assembly to a Google Form submission producing a generated proposal in approximately one minute.

Reply triage. Inbound replies arrive pre-classified into five categories with drafts already prepared.

CRM cleanup. 31 duplicate person records merged plus organization-level deduplication completed as part of the migration off GoHighLevel.

Single-operator leverage. The system replaces what would otherwise require a full SDR team, a marketing-ops person, and a sales engineer working in parallel.

Conversion gating. Closed-won conversion is currently gated by product readiness, not by demand. The close motion is built and operational; revenue conversion tracking begins in earnest when the product reaches general availability.

See where your sales system is leaking.

Start with a free fit call. Fifteen minutes to talk through the current pain and whether there is a real reason to fix the system now.