The Lab · notebook 07 · growth marketing & AI operations

A portfolio
you can run.

I'm Jordan Green. I build growth systems — the creative that earns attention and the machinery that compounds it. Each experiment below is a real case study with a working demo cell. Don't just read the work. Operate it.

In [ ] hello.py
lab.greet(visitor)
Out [ ]
Experiment 001 · lifecycle logged 09 Mar 2024 → 22 Aug 2024

Lifecycle email, rebuilt as a system

Hypothesis

An eight-figure DTC skincare brand was leaking revenue between purchases. A state-based lifecycle system — flows triggered by what a customer actually does — will beat their batch-and-blast calendar.

Method

Mapped every customer state worth an email. Wrote 23 emails across 6 flows in the brand's voice — no template-speak. Wired triggers in Klaviyo off warehouse traits, not just ESP events.

The creative work was the hard part: a welcome arc that tells the product's story instead of begging for a review, a winback ladder that holds the discount back until cheaper nudges fail, a VIP track that never discounts at all. The machinery just makes sure the right story reaches the right person at the right hour.

In [ ] lifecycle_flow_sim

toy model — flows & lift math hardcoded for demo. The real system ran in Klaviyo, triggered off warehouse traits.

Out [ ]
RESULT: SUPPORTED lifecycle share of revenue 24% → 39% in five months · flows outperformed campaigns 3.4× per send
view source of this experiment
# flows.yaml — excerpt from the real engagement (values anonymized)
flow: welcome_arc
  trigger: first_order_placed
  exit: second_order_placed
  sends:
    - { delay: 0d,  angle: "origin story, not a receipt" }
    - { delay: 3d,  angle: "the 60-second routine", gate: opened_prev }
    - { delay: 10d, angle: "review + UGC ask" }
    - { delay: 21d, angle: "the pairing customers add next" }
rule: discounts never enter a flow until two non-offer sends are ignored
Experiment 002 · scoring logged 17 Jan 2025 → 30 May 2025

A lead scorer sales actually trusts

Hypothesis

A field-services SaaS was treating every demo request equally. A transparent points rubric — one a rep can read and argue with — routes leads better than gut feel or a black-box model.

Method

Built the score as plain SQL in the warehouse: firmographics plus intent signals, weights tuned against 18 months of closed-won data. Synced to the CRM hourly. Published the rubric to the sales wiki.

The insight wasn't the math — it was making the math legible. When a rep can see why a lead scored 74, they stop cherry-picking and start trusting the queue. Try it: the rubric below is the actual shape of the model, with the weights in the open.

In [ ] score_lead()
51–200

toy model — same rubric shape as production, weights simplified. The real scorer ran as SQL in the warehouse, synced to HubSpot.

Out [ ]
RESULT: SUPPORTED SQL→opportunity conversion +31% · hot-lead response time 9h → under 4h
view source of this experiment
-- score_leads.sql — rubric excerpt (weights tuned on 18mo closed-won)
select lead_id,
  case emp_band when '1-10' then 4 when '11-50' then 12
       when '51-200' then 25 else 16 end          as pts_size,
  case intent when 'demo_booked' then 40 when 'pricing_2x' then 26
       when 'guide_dl' then 12 else 0 end              as pts_intent,
  case source when 'referral' then 22 when 'organic' then 14
       when 'paid' then 8 else 2 end                   as pts_source
from marts.leads
-- route: ≥62 sales_now · 38–61 nurture_b · <38 newsletter
Experiment 003 · content logged 04 Jun 2025 → 12 Dec 2025

A content engine with humans in the load-bearing spots

Hypothesis

AI can carry research, structure, and first drafts. Humans must own point of view and final edit. Get that division wrong in either direction and you ship slop — or you ship four posts a month forever.

Method

Built a topic-cluster planner and a drafting pipeline with explicit human gates. Every piece is tagged with who did what — a rule we kept in the CMS, not just the deck.

The tags below aren't decoration. They were the operating agreement: human means a person reported and wrote it, AI draft → human edit means the machine structured it and a person made it true and interesting. Publishing the division of labor kept the bar honest at 4× the cadence.

In [ ] expand_cluster()

toy model — three clusters precomputed for demo. The real planner ranked topics by search volume × sales-call frequency.

Out [ ]
RESULT: SUPPORTED cadence 4 → 16 posts/mo · organic sign-ups +2.1× in two quarters · zero retracted posts
view source of this experiment
# pipeline.yaml — the human gates are the product
stage: research      owner: ai       # SERP + call-transcript mining
stage: outline       owner: ai       gate: editor_approves_angle
stage: draft         owner: ai
stage: truth_pass    owner: human    # every claim checked or cut
stage: voice_pass    owner: human    # POV added — the part AI can't fake
stage: publish       rule: byline only if a human owned truth + voice
Experiment 004 · paid logged 02 Feb 2025 → ongoing

Creative volume, with a kill rule

Hypothesis

On paid social, creative testing volume with ruthless kill rules beats bid-tweaking. And there is a spend level where marginal CAC crosses your payback ceiling — past it, growth is just expensive vanity.

Method

Weekly batches of six concepts. Each gets a fixed test budget; it dies unless hook rate and early CAC clear the bar. Winners scale until marginal CAC — not blended — hits the ceiling.

Blended CAC is a comfort metric; it averages your best week into your worst decision. The curve below is the honest version: drag the budget and watch where the next dollar stops paying for itself.

In [ ] cac_curve(spend)
$30,000

toy model — smooth saturation curve fitted for demo; the real account had steps and seasonality. Payback ceiling fixed at $120 CAC.

Out [ ]
RESULT: SUPPORTED blended CAC −28% at 1.7× spend · 41 of 68 concepts killed inside week one
view source of this experiment
# testing_rules.yaml — the discipline, codified
batch: 6 concepts / week   test_budget: $500 each
kill_if:
  - hook_rate < 25% at 3s        # creative failed to earn the view
  - CAC > 1.5× ceiling at $500    # no rescue edits, no "one more day"
scale_if: CAC ≤ ceiling for 4 consecutive days
stop_scaling_when: marginal_CAC ≥ $120  # blended lies; marginal doesn't
Experiment 005 · attribution logged 20 Sep 2025 → 15 Apr 2026

One warehouse to end the channel argument

Hypothesis

The weekly fight about "what's working" was really a data fight. Put every touch in one warehouse and show first-touch, last-touch, and linear side by side, and the argument becomes a decision.

Method

ELT from ad platforms, ESP, and CRM into BigQuery. dbt models into one attribution mart that computes all three models on the same touches. A dashboard where the model is a dropdown, not a debate.

No attribution model is the truth — each is a deliberate bias. First-touch flatters discovery, last-touch flatters closers, linear spreads credit like peanut butter. Showing all three at once is the point: the budget call lives where the models agree. Flip the toggle and watch which channels move.

In [ ] attribute(revenue, model)
attribution model

toy model — one quarter of anonymized revenue ($1.9M), touches re-weighted client-side. The real mart lived in BigQuery + dbt.

Out [ ]
RESULT: SUPPORTED — WITH CAVEATS found email undervalued ~2× under last-touch · caveat: models bound the argument, they don't settle it
view source of this experiment
-- fct_attribution.sql — dbt model, excerpt
with touches as (select * from {{ ref('stg_touchpoints') }})
select order_id, channel, revenue *
  case model
    when 'first'  then is_first_touch
    when 'last'   then is_last_touch
    when 'linear' then 1.0 / touch_count
  end as attributed_revenue
from touches cross join models
-- all three models, same touches, one dashboard dropdown

Methods

Two columns, one operator.

Most marketers pick a side. The experiments above only worked because both columns ran in the same head — the copy informed the schema, the schema disciplined the copy.

Creative methods

  • Positioning & message mapsthe sentence that makes the rest of the funnel easier · exp 001
  • Lifecycle & email copywritingflows that read like a founder wrote them · exp 001
  • Creative direction for paidhooks, angles, and the taste to kill your own ads · exp 004
  • Offer & landing page designthe page is the argument; the button is the conclusion
  • Editorial standards for AI-era contenttruth pass, voice pass, honest bylines · exp 003

Technical methods

  • SQL + dbt modelingmarts a marketer can read and a CFO can audit · exp 005
  • Python for pipelines & scoringglue code, schedulers, and the occasional real model · exp 002
  • ESP / CRM orchestrationKlaviyo, HubSpot, Braze — triggered off warehouse traits · exp 001
  • LLM workflows with eval gatesAI where it's strong, humans where it's load-bearing · exp 003
  • Experiment & attribution designmarginal over blended, always · exp 004, 005

The researcher

Notes on the operator.

I've spent ten years in growth roles at DTC brands and B2B SaaS — in-house first, then independent. Somewhere around year four I got tired of handing briefs to engineers and dashboards to marketers and watching meaning die in the handoff, so I learned both jobs well enough to be dangerous in either room.

The notebook format isn't a gimmick. It's genuinely how I work: write the hypothesis down before touching the budget, build the smallest system that tests it, keep what the data supports, log what it doesn't. Most of my wins came from the second attempt at somebody's abandoned first one.

I take on two or three engagements at a time — fractional growth lead, lifecycle rebuilds, or marketing-ops infrastructure. If your growth problem sounds like one of the five experiments above, it probably is one.

Field
growth marketing × AI operations
Years logged
10
Habitat
Portland, OR · works anywhere with a warehouse
Current status
one engagement slot open — Q4 2026
A bright, tidy desk with an open dot-grid notebook, a violet pen, and a mug in soft daylight
fig. 1 — the bench. paper first, pipeline second.
Close-up of a violet fountain pen resting on blank dot-grid notebook paper with mint page markers
fig. 2 — every experiment starts as ink.

Correspondence

Propose the next experiment.

Tell me the metric that's stuck and what you've already tried. I'll reply with a hypothesis — usually within two business days.

In [ ] lab.contact()
lab.contact(channel="any")
Out [ ]