Running Ads Programmatically with Claude Code

Mar 2, 2026

With the ICP defined and the brand aligned, we moved to execution. The goal was to build a full programmatic acquisition stack that could be managed and iterated on efficiently, without a dedicated marketing ops team.

Claude Code ended up being the backbone of the entire operation. Not just for writing code, but for holding the operational playbook in a way that makes every interaction consistent and informed.

Programmatic Growth Playbook.md

Programmatic Growth Playbook

programmatic-growth-playbook.md

Drop this file into your .claude/skills/ directory

Why Meta and LinkedIn need completely different approaches

This is one of the most important things we learned early on, and it shapes everything about how we structure campaigns.

On Meta, creative does the targeting. Meta's algorithm has become incredibly good at finding the right people if you give it broad audiences and great creative. We run broad geo-targeting (US + UK, age 25-55) and let the creative self-select. Our data confirmed this: broad targeting ($42-45 cost per acquisition) actually matched or outperformed interest-targeted ad sets. The implication is clear — on Meta, spend your energy on creative, not on audience segmentation.

On LinkedIn, targeting does the heavy lifting. LinkedIn has something Meta doesn't: professional identity. Job titles, seniority levels, company names, industries. We can target "Executive Assistants at Private Equity firms with 10-50 employees in the US" with precision that Meta simply can't match. The creative matters, but the targeting is where LinkedIn earns its higher cost per impression.

This is why the campaign architectures are fundamentally different on each platform.

Meta: testing lanes and growth lanes

We split Meta into three campaigns with distinct purposes:

META-TEST (30% of budget, ABO)

This is where we experiment. ABO (Ad Set Budget Optimisation) means every creative concept gets equal budget — Meta doesn't pick favourites. One concept per ad set, running in 2-week sprints that rotate across segments: EA → Executive → Enterprise.

Why this matters: with CBO, Meta would dump budget into whatever gets the cheapest clicks, which isn't necessarily what gets the best MQLs (marketing qualified leads — people who meet our criteria for a sales conversation). ABO gives us clean signal isolation. We know exactly what's working and why.

META-GROWTH (45% of budget, CBO)

This is where proven winners scale. CBO (Campaign Budget Optimisation, now called Advantage Campaign Budget in Meta's UI) lets Meta allocate budget dynamically across ad sets — Broad, Lookalike 1%, Lookalike 3%, HNWI Lookalike. Only graduated winners from Testing get in here. Max 10-12 active ads at any time.

META-RETARGET (15% of budget, CBO)

Warm audience conversion — website visitors, engaged users, people who started but didn't complete an application.

The remaining 10% is held in reserve as a buffer for scaling winners mid-cycle.

The graduation process: when a creative in META-TEST hits less than $100 MQL cost with 10+ conversions over 14 days, we clone it to META-GROWTH. Clone, never move — the original keeps running in Test so we keep learning from it. We also pause anything in Growth where frequency exceeds 4.0 or MQL cost rises above $150.

LinkedIn: funnel-staged campaigns

LinkedIn doesn't use the same testing/growth split. Instead we stage campaigns by funnel position:

| Campaign | Budget | Purpose | |---|---|---| | Thought Leader | 20% | Omar's boosted organic posts — top of funnel awareness | | Education | 17% | Case study carousels and nurture content — middle of funnel | | Conversion | 37% | Direct lead gen with "Apply for Membership" CTA — bottom of funnel | | ABM (account-based) | 17% | Targeting 148 specific PE/VC/HF firms by company list | | Retarget | 10% | Sequential retargeting by engagement depth |

Three audience segments with different targeting:

  • EAs: job titles (Executive Assistant, Personal Assistant, Chief of Staff) at finance industry firms
  • Executives/HNWIs: Director+ seniority at PE/VC/HF/family offices
  • Enterprise: Travel Managers and Operations Directors at companies with 200+ employees

Audience building

We built custom audiences from multiple sources:

  • Client list uploaded to Meta — SHA-256 hashed personal data (email, phone, name), then generated a 1% US lookalike
  • ABM company list on LinkedIn — 148 PE/VC/HF firms including Blackstone, KKR, Andreessen Horowitz, Sequoia, Bridgewater, Citadel, Iconiq Capital
  • Website visitor retargeting on both platforms
  • RB2B for de-anonymisation — identifies who's visiting joinascend.com by their LinkedIn identity, feeds into both LinkedIn Matched Audiences and HubSpot as prospects

That last one is important because it extends the funnel backwards. Before someone fills out a form, RB2B tells us they visited the site. They enter HubSpot as a prospect. Once they submit an application and qualify (travel budget >$1k/month), they become an MQL (marketing qualified lead). This gives us a full pipeline view: Prospect → Lead → MQL → Meeting Booked → Meeting Completed → Trial Started → Member.

Full funnel attribution in HubSpot

One of the biggest pieces we built was end-to-end source attribution. Every contact that enters HubSpot gets auto-classified into a canonical source channel using a 22-branch priority system:

  1. HeyReach ID present → linkedin_outbound
  2. UTM params (source=meta, medium=paid) → meta_ads
  3. UTM params (source=linkedin, medium=paid) → linkedin_ads
  4. Facebook click ID present → meta_ads
  5. LinkedIn click ID present → linkedin_ads
  6. Partner field set → partnership
  7. Form name analysis → referral or partnership
  8. HubSpot analytics source → fallback classification
  9. Landing page URL patterns → partnership detection
  10. ...down to default other

This attribution propagates from contacts to deals, so we can see full funnel ROI by channel — not just "how many leads did Meta generate" but "how many paying members came from Meta, and what was the gross profit."

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

Why both Python scripts and native HubSpot workflows? Claude Code built Python scripts that interact with the HubSpot API — this is how we developed, tested, and iterated on the attribution logic. We could backfill 576 existing contacts, debug edge cases, and validate the classification against known data. Once the logic was proven and stable, we translated the same rules into native HubSpot workflows so they run automatically on every new contact without any manual intervention.

Nurture flows

We set up email sequences in HubSpot for every stage of the funnel:

  • Lead warm-up (pre-call) — 3-email sequence: Value → Case Study → Book Call. Ejects immediately if a call is booked, so we're not emailing someone who already converted.
  • No-show recovery — reminders at 24h and 1h before the call, plus a reschedule sequence if they don't show up.
  • Free trial nurture — stops all sales emails the moment a trip is booked (because at that point, the product is doing the selling). Emails: Welcome, Value Add, Upgrade Push.
  • Re-engagement — triggers after 60 days of inactivity. Soft check-in, not a hard sell.
  • Renewal defence — "Year in Review" email 30 days before expiry, showing total savings and trips managed.

The 5-minute SLA

Our data showed something we needed to fix: 380 MQLs in Q1 but only 185 calls booked — a 48.7% booking rate. Leads were qualifying but not self-booking a call. They'd fill out the application, get the confirmation email, and then... nothing.

The fix: a 5-minute SLA. When a high-value lead signs up, a Slack alert fires immediately. An account executive calls them within 5 minutes while they're still warm, rather than waiting for them to find time to click a Calendly link. The ownership shifts from the lead to us.

Why Claude Code skills matter here

A skill in Claude Code is essentially a reusable instruction set — a playbook that Claude can reference every time you ask it to do something in a specific domain. Instead of re-explaining your campaign structure, naming conventions, safety rules, and copy principles every session, the skill holds all of that context persistently.

Here's why that matters for growth ops specifically:

ascend-ads (~880 lines) — the master playbook. Contains the full campaign architecture, graduation workflows, safety rules (never delete — only pause, always create as PAUSED, clone don't move), platform-specific rules for both Meta and LinkedIn, copy crafting principles, proof point library, and all current campaign and ad set IDs. When we say "create a new Meta test campaign for the Enterprise segment," Claude already knows the naming convention, the budget, the targeting, the safety checks — because the skill contains all of it.

weekly-growth-report — pulls live data from all three APIs (HubSpot, Meta, LinkedIn) and generates an HTML report with charts showing leads, MQLs, calls, trials, and members by channel alongside spend and CAC. One command, full cross-platform visibility.

ad-creative — batch generation of ad copy from performance data. Enforces platform-specific character limits (Meta: 125 chars visible primary text, 40 char headline; LinkedIn: 150 chars intro, 70 char headline). Analyses winning patterns from existing ads and generates new variations that extend what's working.

cold-email — B2B cold email frameworks with structural templates (Observation → Problem → Proof → Ask), follow-up sequence design, and a personalisation system. Different messaging for different segments, all consistent with the brand voice.

ab-test-setup — hypothesis structure, sample size calculations, primary/secondary/guardrail metric definitions. Ensures we're running experiments properly rather than just launching things and hoping.

The combined effect is that growth ops becomes something one person can run effectively. Not because the tools do the thinking, but because the operational knowledge is codified and consistent across every session.

Outbound: HeyReach, Instantly, and Draftboard

Beyond paid ads, we run three outbound channels — each serving a different purpose in the pipeline.

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

For LinkedIn outbound we use HeyReach, and for cold email we use Instantly. Both platforms offer pre-built sequence templates, which gave us a strong starting point. For the highest-value prospects, we use Draftboard to source warm introductions through existing network connections — lower volume, but significantly more effective at securing meetings with target accounts.

We took HeyReach's connection request sequence (Connect → Value → Follow-Up) and Instantly's cold email templates for B2B outreach and mapped each step against our messaging framework and persona hooks from the rebrand work. The connection request for a PE executive assistant uses completely different language than the one for a crypto founder, because the pain points and motivations are different. We screenshotted each platform's recommended sequence structure, referenced it against our creative angle matrix, and adapted the copy to match — different hooks for each persona, consistent with the brand voice across both channels.

The outbound messaging feeds into the same HubSpot attribution system as everything else. HeyReach IDs get auto-classified as linkedin_outbound, and Instantly replies flow through as email_outbound, so we can track full funnel ROI across paid, organic, and outbound channels in one place.

Where we are now

We've spent roughly $50k on marketing in Q1 2026 across all channels. Cost per lead on Meta is running at $42-45, and cost per MQL is around $100. We're seeing 576 contacts classified by source — partnership 29%, Meta 23%, referral 18%, LinkedIn 17%, with the remainder split across organic, direct, and email outbound — with full funnel tracking from prospect through to paying member.

It's still early. The infrastructure is in place but the next challenge is optimising the core conversion flow — we're converting 48.7% of MQLs to booked calls, which means roughly half of qualified leads are slipping through. The 5-minute SLA is live, creative testing is ongoing, and we're scaling the channels that are working.

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

← Back to the full growth engine overview