Building a Growth Engine from Zero

Mar 2, 2026

When I joined Ascend (formerly FlyFlat) as COO, the company had incredible product-market fit. $20m in annual recurring revenue, 650+ clients including Google Ventures, Ramp, and Charlotte Tilbury, and a 24/7 travel concierge that people genuinely loved. But essentially 0% of revenue came from scalable growth channels. No paid ads, no email outbound, no programmatic acquisition of any kind. 95% of growth was word-of-mouth and a handful of community partnerships.

The goal was to change that — to build a repeatable, measurable growth engine without losing the premium feel that made the product work in the first place.

Six months later, January was our best month ever — $27.6m ARR (annual recurring revenue), 38% growth. Our growth channels are returning ~5x on ad spend after two months, projecting toward 8–10x as pipeline matures. We don't have a formal growth team yet — nearly all of it is built and operated daily through Claude Code.

Here's how we got there.

The three stages

We broke this down into three phases, each building on the last:

  1. Figure out who we're actually targeting — analyse our best customers, enrich their profiles, and build segmented prospect lists from scratch
  2. Reposition the brand — align the messaging and visual identity with who our customers actually are, extract personas from real sales call transcripts, and build the creative angle matrix
  3. Execute programmatically — build the full acquisition stack across paid ads, outbound, and CRM, using Claude Code to manage what would typically require a dedicated growth team

Each of these became a project in its own right. Here's how they connect.

The stack

Research
Find & enrich
Acquire
Reach them
Convert
Nurture & close
Operate
Run everything
The full pipeline — from research through to operations, with Claude Code underpinning all of it.

Stage 1: Finding our ICP (ideal customer profile)

We analysed 4,582 bookings to find where value was concentrated. Roughly 75% of revenue came from executive assistants (EAs) at private equity firms, venture capital funds, hedge funds, and family offices. The secondary ICP was high-net-worth executives who travel frequently, with a higher concentration in sectors like crypto, banking, and venture capital.

Analyse
4,582
bookings by GP
Enrich
Top 500
web + AI research
Segment
6
prospect lists built

From the analysis, we identified our top 500 customers and enriched their profiles using Firecrawl — scraping LinkedIn profiles, company websites, and public sources to build a detailed picture of exactly who they are, what industries they operate in, and what makes them high-value. This enrichment served two purposes:

  • Building lookalike audiences — having richly profiled customer data meant we could create high-quality lookalike audiences on Meta and LinkedIn, reaching people who closely match our best existing clients
  • Defining clear prospect segments — we grouped the data into six targetable segments (finance executives, tech founders, crypto/Web3, luxury/media, consulting/law, HNW solo operators) that could be used across every acquisition channel

Separately, we used Apollo to source entirely new leads — finding verified emails and phone numbers for prospects matching these segments who weren't already in our pipeline. Clay layered on additional enrichment from 100+ data sources to round out each prospect record.

Finding Your ICP.md

Finding Your ICP

finding-your-icp.md

Drop this file into your .claude/skills/ directory

Stage 2: The rebrand

The ICP research exposed a gap: the FlyFlat brand didn't match the clients we were serving. We were positioning as a discount flight service, but our customers were private equity partners, executives at Charlotte Tilbury and Google Ventures, and crypto founders who fly private. The brand needed to reflect the premium concierge service we actually deliver.

We pulled every Fireflies transcript from sales calls with our highest-value clients and ran them through the Jobs to Be Done and Four Forces of Progress frameworks using Claude. Three distinct EA personas emerged, each with fundamentally different motivations:

The Protector
No drama. Certainty above all.
Core driver
Reliability & peace of mind
Key fear
A travel crisis that makes them look bad
Winning message
"Your 2am problem is our job"
The Status Steward
Preserve the perks.
Core driver
Loyalty status & upgrade eligibility
Key fear
Losing airline status for marginal savings
Winning message
"Same cabin, same status, thousands less"
The Outcome Maximiser
Prove the value.
Core driver
Quantifiable ROI & clean documentation
Key fear
Can't prove travel spend is optimised
Winning message
"$127k saved. One client. Six months."

Customer language from these transcripts became the foundation of the brand voice. We codified it into three traits:

Premium
Composed, precise, earns attention without adjectives
Personal
One person helping another — warm but efficient
Reliable
Show through facts, not feelings — specific numbers only

We then built a creative angle matrix — 6 psychological hooks (pain, identity, social proof, effortlessness, savings, exclusivity) mapped across all three audience segments — so every ad, email, and landing page speaks to segment-specific motivations.

Rebranding with Data.md

Rebranding with Data

rebranding-with-data.md

Drop this file into your .claude/skills/ directory

Stage 3: Executing programmatically

With the ICP defined and the messaging aligned, we built the full acquisition stack across paid ads, outbound, and CRM. This is the kind of work that would normally require a dedicated growth team — it's manual, time-consuming, and requires specialist knowledge across multiple platforms where the rules change constantly as algorithms evolve. Claude Code made it possible to build and operate the entire system without one.

Meta and LinkedIn require fundamentally different approaches because of how each platform finds your audience:

  • On Meta, creative does the targeting. Meta's algorithm finds the right people if you give it broad audiences and strong creative. We run broad geo-targeting (US + UK, 25–55) and let the ad itself self-select who engages. Our data confirmed this — broad targeting actually matched or outperformed interest-based targeting on cost per lead.
  • On LinkedIn, targeting does the heavy lifting. LinkedIn has professional identity data that Meta doesn't — job titles, seniority, company names, industries. We can target "Executive Assistants at private equity firms with 10–50 employees" with precision that Meta can't match.

This means the campaign architectures are completely different on each platform:

Meta
Creative-led — broad audiences, let creative self-select
30%
Test new creative · Equal budget per concept
45%
Scale winners · Dynamic budget allocation
15%
Retarget warm audiences · Site visitors & engaged
LinkedIn
Identity-led — job titles, seniority, company lists
20%
Thought leadership · Boosted founder posts
17%
Case studies · Mid-funnel education
37%
Direct lead gen · Application CTA
17%
Account-based targeting · 148 PE/VC/HF firms
10%
Sequential retarget · By engagement depth

Outbound: LinkedIn, email, and warm introductions

Beyond paid ads, we run three outbound channels:

  • HeyReach — automated LinkedIn connection requests and messaging sequences, adapted per persona
  • Instantly — cold email campaigns with multi-step follow-ups, segment-specific messaging
  • Draftboard — warm introductions to our highest-value prospects through existing network connections (lower volume, but the highest conversion rate of any channel)

All three feed into the same tracking system as paid ads, so we can measure ROI across every channel in one place.

HeyReach
LinkedIn Outbound
Connection request → value message → follow-up sequence
Messaging adapted per persona (PE EAs, crypto founders, enterprise)
Feeds warm contacts into HubSpot automatically
Instantly
Cold Email
Structured as: Observation → Problem → Proof → Ask
Multi-step follow-up sequences per segment
Brand-voice consistent across all messaging
Draftboard
Warm Introductions
Identify highest-value prospects from pipeline
Source introductions through existing network
Lower volume — highest meeting-to-close rate

The CRM (customer relationship management): HubSpot rebuilt from scratch

We needed a system that could answer one question at any point: for every person who becomes a paying member, which channel brought them in and how much did it cost?

To do this, we rebuilt HubSpot from the ground up around three things:

Source attribution — every new contact is automatically tagged with the channel that brought them in. We started with the standard platform integrations (Meta's Conversions API, LinkedIn's insight tag, HubSpot's native analytics), but found they left significant gaps — contacts slipping through unattributed, misclassified sources, and no coverage for outbound channels. So we built an additional rules engine on top that checks outbound IDs, ad click IDs, UTM parameters, form data, and referral fields in priority order. The result is near-100% attribution across every channel.

A clear funnel — contacts move through defined stages, with each transition tracked and timestamped automatically:

HubSpot CRM
Architecture overview
Source attribution
Meta AdsLinkedIn AdsLinkedIn OutboundEmail OutboundReferralPartnershipOrganic
Contact funnel
Prospect
Lead
Qualified
Meeting
Trial
Opportunity
Customer
Key automations
22-branch source attributionAuto-classifies every contact by channel on creation
Stage progressionAdvances contacts through the lifecycle funnel automatically
Deal-contact syncPropagates source channel to deals for full-funnel ROI
5-minute SLA alertsSlack notification fires within 5 min for high-value leads
Nurture flowsLead warm-up, no-show recovery, trial onboarding, renewal defence

Automations at every stage — rather than relying on manual follow-up, each stage of the funnel triggers the right action:

  • New qualified lead? An email nurture sequence starts immediately.
  • High-value lead signs up? A Slack alert fires so our team can call them within 5 minutes while they're still engaged, instead of waiting for them to self-book.
  • Meeting booked but no-show? An automatic reschedule sequence kicks in.
  • Trial started? Sales emails stop — the product does the selling.
  • Approaching renewal? A "Year in Review" email goes out 30 days before expiry showing total savings.

The channel tag follows the contact all the way from first touch to paying member, so we can see exactly which channels are generating revenue — not just leads.

How Claude Code runs all of this

The entire system was built by connecting Claude Code directly to the HubSpot, Meta, and LinkedIn APIs. Once the logic was proven and working, we packaged it into Claude Code skills — reusable instruction sets that hold the full operational playbook (campaign structures, naming conventions, safety rules, copy principles) so every session picks up where the last one left off.

This means we can run recurring operations as simple slash commands:

/daily-ad-review
Pulls performance data from Meta and LinkedIn, flags underperforming campaigns, and recommends budget shifts
/weekly-growth-report
Generates a full cross-platform report with charts across leads, MQLs, calls, trials, and members by channel — used directly in investor updates
/new-campaign
Creates campaigns with the correct naming conventions, budget splits, and safety rules already baked in
/creative-batch
Generates new ad copy variations informed by performance data, respecting platform-specific character limits

The result is that growth ops runs as a continuous, incremental process rather than a series of one-off projects. Each session builds on the last, and the operational knowledge compounds over time.

Programmatic Growth Playbook.md

Programmatic Growth Playbook

programmatic-growth-playbook.md

Drop this file into your .claude/skills/ directory

Six months later

January was our best month ever — $27.6m ARR, 38% growth since I joined last August. Our growth channels are returning ~5x on ad spend after two months, projecting toward 8–10x as pipeline matures. We don't have a formal growth team yet — nearly all of it is built and operated daily through Claude Code.

$50k
Q1 spend
$42–45
Cost per lead (Meta)
48.7%
MQL → booked call
576
Contacts classified
Contacts by source
Partnership
29%
Meta ads
23%
Referral
18%
LinkedIn ads
12%
Outbound
10%
Direct & other
8%
Projected return on ad spend
~$13k
Q1 ad spend
~5x
Current return
8–10x
Projected (with retention)
$2,500
Annual membership

It's still early. The biggest challenge right now is converting more qualified leads into actual sales conversations — roughly half of the people who qualify are dropping off before booking a call. We're tackling this on two fronts:

  • Faster response times — calling high-value leads within 5 minutes of sign-up instead of waiting for them to self-book a Calendly link
  • Rebuilding the onboarding flow — we're moving toward a fully WhatsApp-native application process, since that's where the concierge service actually lives. Rather than sending prospects to a web form, the goal is to meet them on the channel they'll use as a member from day one

If you want to chat about any of this, drop me an email at omarismailb@gmail.com.