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:
- Figure out who we're actually targeting — analyse our best customers, enrich their profiles, and build segmented prospect lists from scratch
- 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
- 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
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.
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.
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:
Customer language from these transcripts became the foundation of the brand voice. We codified it into three traits:
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.
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.
Paid ads: Meta and LinkedIn
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:
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.
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:
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:
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.
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.
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.