KlaviyoNotes

Flows vs campaignsYou blast because flows were never finished

You blast because flows were never finished. Fatigue looks like the list is tired. Holdouts do not exist, so every send 'worked'.

00

The short version

Intern through CEO

Read it once, then stop negotiating with it. Flows vs campaigns for operators is a wiring job: split → calendar → fatigue → holdout. Objects, then edges, then one test conversion. You do not need a new tool to start. You need the first writer to land on one contact this week.

  1. 01

    Operators do not have a Flows vs campaigns problem because they lack Klaviyo. They have it because you blast because flows were never finished.

  2. 02

    Wire these objects first: Written job split, campaign calendar, flow list, fatigue metric, holdout on big sends, profile exclusions.

  3. 03

    Then these edges, in order: Job split doc → each message type owned by flow or campaign, not both · Campaign calendar → sits on top of live flows; checks exclusion of in-flow profiles · Fatigue → sends per profile per week watched; cap written · Holdout → big campaign has a holdout or you cannot claim incrementality

  4. 04

    Done looks like a test you can repeat: List every live flow and this month's campaigns. Find one duplicated job and kill it. Set a fatigue cap. On the next big send, add a holdout even if small. If you cannot name who owns restock — flow or campaign — that is the ticket.

  5. 05

    Start here: A written split of jobs

In even plainer words

Operators already have Klaviyo. The leak is not a missing feature. You blast because flows were never finished. Software did not cause it. A missing write-in did: the person exists in one tool and not in the pipeline.

Here is how you actually wire it. Name the objects: Written job split, campaign calendar, flow list, fatigue metric, holdout on big sends, profile exclusions. Then connect these edges, in order: Job split doc → each message type owned by flow or campaign, not both · Campaign calendar → sits on top of live flows; checks exclusion of in-flow profiles · Fatigue → sends per profile per week watched; cap written · Holdout → big campaign has a holdout or you cannot claim incrementality. If you skip an edge, the next one is decoration. If you add a Klaviyo feature first, you usually skip an edge without noticing.

Prove it with a test, not a screenshot. List every live flow and this month's campaigns. Find one duplicated job and kill it. Set a fatigue cap. On the next big send, add a holdout even if small. If you cannot name who owns restock — flow or campaign — that is the ticket. How you know it worked on the board: Jobs is written (flow vs campaign). If that number is a vibe, do not add traffic.

What to do this week, and only this week: A written split of jobs An intern can run the objects page and one test conversion. A CEO should protect that from a second priority.

Who

Same system. Three jobs.

Read your row

Intern

What you actually do

Day one: write the split. You blast because flows were never finished — finish or formally assign the job to campaigns, but do not do both. No new campaign until the split exists.

Operator

What you protect

You already feel you blast because flows were never finished. You blast because flows were never finished. Protect one sequence for 90 days. The four moves are split → calendar → fatigue → holdout. The edges are Job split doc → each message type owned by flow or campaign, not both then Campaign calendar → sits on top of live flows; checks exclusion of in-flow profiles. A written split of jobs. Campaign calendar sits on flows. Fatigue is measured. Holdouts exist on big sends.

CEO

What you refuse to fund

This is a money leak, not a preference about tools. You blast because flows were never finished. Until jobs is a number you will defend, buying more traffic or more seats makes the leak more expensive. Refuse a second database: Job split doc → each message type owned by flow or campaign, not both.

Example

A Tuesday that looks familiar

Before / after

Before

Tuesday. Someone among operators. You blast because flows were never finished. Klaviyo is open. A colleague asks where a person sits. The answer is a screenshot, a Slack thread, or “I think they’re interested.” The writer (form, calendar, shop, or phone) and the pipeline are two databases.

After

Same Tuesday, after write-in exists. A written split of jobs. Campaign calendar sits on flows. Fatigue is measured. Holdouts exist on big sends. Job split doc → each message type owned by flow or campaign, not both The next move is written. That is the difference between a login and a system.

Worked example

Keep it this plain. A person in operators already paid for Klaviyo. You blast because flows were never finished. They add a page, a form, a calendar. None of it writes into a spec. By Friday the calendar has ghosts and the pipeline still looks like the snapshot.

The fix is not a better template. A written split of jobs. Prove write-in: List every live flow and this month's campaigns. Find one duplicated job and kill it. Set a fatigue cap. On the next big send, add a holdout even if small. If you cannot name who owns restock — flow or campaign — that is the ticket. This week is one move: A written split of jobs If that feels too small, that is the point. Operators fail by starting at move four.

01

Leak versus system

Klaviyo

The leak

You blast because flows were never finished. Fatigue looks like the list is tired. Holdouts do not exist, so every send 'worked'.

The system

A written split of jobs. Campaign calendar sits on flows. Fatigue is measured. Holdouts exist on big sends.

How it actually works

Flows for states. Campaigns for pulses: a drop, a season, a story. If Thursday's campaign is doing welcome, cart, and win-back, finish the flows. The list is not tired. It is being used as a megaphone.

Without a holdout you cannot tell if revenue moved because you mailed. That is not sophistication. It is how you keep paying for sends that do not earn.

A written split of jobs. Campaign calendar sits on flows. Fatigue is measured. Holdouts exist on big sends.

You blast because flows were never finished. The fix is a written split, not a nicer campaign. Flows own state (abandoned, post-purchase, lapse, welcome). Campaigns own time (drops, seasons, stories) for people whose state does not already cover that job. A campaign calendar that ignores flows will double-send and then you will 'need more creative'. You needed exclusions.

Fatigue is measured: emails per week, SMS per week. Holdouts exist on big sends so you can see if the blast earned anything versus flows plus organic. If every send is to the whole list, you do not have segmentation and you do not have a split — you have a habit. Wire suppression: in-flow, recently purchased, recently complained.

Two databases: the 'always on' flows and a founder who still sends from a personal tool when they feel a moment. One calendar of record. The intern maps last month's sends onto the split doc and highlights collisions. They do not pick a new theme. Collisions are the work.

Wire

How to connect it

Objects, then edges, then a test

Written job split, campaign calendar, flow list, fatigue metric, holdout on big sends, profile exclusions.

  1. 01

    Job split doc → each message type owned by flow or campaign, not both

  2. 02

    Campaign calendar → sits on top of live flows; checks exclusion of in-flow profiles

  3. 03

    Fatigue → sends per profile per week watched; cap written

  4. 04

    Holdout → big campaign has a holdout or you cannot claim incrementality

Prove write-in

List every live flow and this month's campaigns. Find one duplicated job and kill it. Set a fatigue cap. On the next big send, add a holdout even if small. If you cannot name who owns restock — flow or campaign — that is the ticket.

Day one: write the split. You blast because flows were never finished — finish or formally assign the job to campaigns, but do not do both. No new campaign until the split exists.

02

The spine

Scan first
01

Split

Write which jobs are flows. Campaigns cannot steal them.

02

Calendar

Pulses on top of a working lifecycle.

03

Fatigue

Measured. Frequency caps that are real.

04

Holdout

On big sends. Or do not claim proof.

Steps

Do this in order

Why, then done when
  1. 01

    Write the leak in one sentence

    On one line, for operators: You blast because flows were never finished. Add who gets hurt (calendar, cash, inbox, or reputation). If two people write different sentences, you do not agree yet — stop and agree.

    Why: Teams skip this and jump into settings. Then every person is fixing a different problem with the same login.

    Done when: One sentence. Shared. No adjectives required.

  2. 02

    Name the objects

    Written job split, campaign calendar, flow list, fatigue metric, holdout on big sends, profile exclusions.

    Why: If objects aren't named, software invents a second database.

    Done when: A stranger can list them.

  3. 03

    Split

    Write which jobs are flows. Campaigns cannot steal them. Then wire: Job split doc → each message type owned by flow or campaign, not both

    Why: Operators cannot skip this edge. You blast because flows were never finished. If it is not true, Klaviyo is already a second database.

    Done when: Job split doc → each message type owned by flow or campaign, not both is true on a test.

  4. 04

    Calendar

    Pulses on top of a working lifecycle. Then wire: Campaign calendar → sits on top of live flows; checks exclusion of in-flow profiles

    Why: Operators skip this and the leak returns as a private language. Fatigue is measured: emails per week, SMS per week. Spec tags, fields, and states have to be the same objects the next workflow will read.

    Done when: Campaign calendar → sits on top of live flows; checks exclusion of in-flow profiles is true on a test.

  5. 05

    Fatigue

    Measured. Frequency caps that are real. Then wire: Fatigue → sends per profile per week watched; cap written

    Why: Operators feel this as You blast because flows were never finished. Two databases: the 'always on' flows and a founder who still sends from a personal tool when they feel a moment.

    Done when: Fatigue → sends per profile per week watched; cap written is true on a test.

  6. 06

    Prove write-in

    List every live flow and this month's campaigns. Find one duplicated job and kill it. Set a fatigue cap. On the next big send, add a holdout even if small. If you cannot name who owns restock — flow or campaign — that is the ticket.

    Why: Calendar full + pipeline empty means two databases.

    Done when: One test conversion, one contact, right stage/state.

  7. 07

    Put a number on the wall

    Every Monday, look at Jobs (Flow vs campaign), then fatigue (Not a vibe). Write one action or write “hold.” A dashboard with no action is theatre.

    Why: What gets reviewed gets run. What only lives in a tool gets ignored the week someone is busy.

    Done when: Three numbers. One owner. Fifteen minutes. Actions attach.

  8. 08

    Finish one move this week

    A written split of jobs

    Why: Operators fail by starting at move four. Interns fail by making a 40-item checklist. CEOs fail by adding a second priority. One proven write-in beats an elegant plan.

    Done when: The move is true, or you can name the blocker in one sentence.

Walkthrough

The four moves, expanded

Same spine. More words.
01

Name the objects

Written job split, campaign calendar, flow list, fatigue metric, holdout on big sends, profile exclusions.

If objects aren't named, software invents a second database.

You blast because flows were never finished.

02

Split

Write which jobs are flows. Campaigns cannot steal them. Then wire: Job split doc → each message type owned by flow or campaign, not both

Operators cannot skip this edge. You blast because flows were never finished. If it is not true, Klaviyo is already a second database.

On Klaviyo, this means the data model matches how operators actually work — not the snapshot demo. Edge: Campaign calendar → sits on top of live flows; checks exclusion of in-flow profiles

03

Calendar

Pulses on top of a working lifecycle. Then wire: Campaign calendar → sits on top of live flows; checks exclusion of in-flow profiles

Operators skip this and the leak returns as a private language. Fatigue is measured: emails per week, SMS per week. Spec tags, fields, and states have to be the same objects the next workflow will read.

A written split of jobs. Campaign calendar sits on flows. Fatigue is measured. Holdouts exist on big sends.

04

Fatigue

Measured. Frequency caps that are real. Then wire: Fatigue → sends per profile per week watched; cap written

Operators feel this as You blast because flows were never finished. Two databases: the 'always on' flows and a founder who still sends from a personal tool when they feel a moment.

A written split of jobs

Why

Questions people actually ask

Pushback is normal

Why not just buy another Klaviyo feature?

Because the login already exists. You blast because flows were never finished. Fatigue looks like the list is tired. A new feature on a missing spec is a second database. Finish this edge first: Job split doc → each message type owned by flow or campaign, not both.

Why start with objects instead of a workflow?

Day one: write the split. You blast because flows were never finished — finish or formally assign the job to campaigns, but do not do both. No new campaign until the split exists. Workflows on unnamed objects fire on folklore. Name contact (or profile), stage or state, and the writer (form, calendar, metric) before any on-switch.

What does “wired” actually mean?

A test conversion creates or updates one person, on the right stage or state, with the fields the next sequence will read. List every live flow and this month's campaigns. Find one duplicated job and kill it. Set a fatigue cap. On the next big send, add a holdout even if small. If you cannot name who owns restock — flow or campaign — that is the ticket. If you merge after the test, identity is wrong — fix that, do not add a dedupe automation.

Why write it down if the team already knows?

If it is only in someone's head, a new hire needs a story, reporting cannot be defended, and automations fire on folklore. Writing is how two people mean the same object on Monday.

Why does this keep coming back after we 'set it up'?

Because setup was a project, not a review. Holdout (Or the send did not prove itself) is how you stop the leak returning dressed as a new feature. If Placed Order is dirty, every metric is theatre. If browse collides with cart, you trained people to ignore you. Discount-first abandon trains the wrong buyer — especially when consideration is long. Score the system. Then ship the two worst gaps. Not another brand story.

Why should operators care about this versus more leads?

More leads into a leak is a more expensive leak. A written split of jobs. Campaign calendar sits on flows. Fatigue is measured. Holdouts exist on big sends. Watch jobs before you buy traffic. If that number is folklore, acquisition is a vanity spend.

What if we do not have time?

Then you only have time for the objects page and one test conversion. A written split of jobs That is the intern version of strategy. Protect it from a second priority for seven days.

03

Skip this / do this

Same four moves

Skip this

Leaving objects unnamed because Klaviyo is “set up”.

Do this

Written job split, campaign calendar, flow list, fatigue metric, holdout on big sends, profile exclusions.

Skip this

Building a workflow or flow before a writer lands on one contact.

Do this

Job split doc → each message type owned by flow or campaign, not both

Skip this

Calling it done because a screenshot looks busy.

Do this

List every live flow and this month's campaigns. Find one duplicated job and kill it. Set a fatigue cap. On the next big send, add a holdout even if small. If you cannot name who owns restock — flow or campaign — that is the ticket.

Skip this

Leaving “Holdout” to chance.

Do this

On big sends. Or do not claim proof.

Misses

How this usually goes wrong

Then the fix

The usual miss

Calling Klaviyo “set up” because someone logged in and imported a snapshot.

Do this instead

Write which jobs are flows. Campaigns cannot steal them. Then prove write-in: List every live flow and this month's campaigns.

The usual miss

Building the workflow or flow before the writer (form, calendar, shop event) lands on one contact.

Do this instead

Connect Job split doc → each message type owned by flow or campaign, not both first. Automations on a missing writer invent a second database.

The usual miss

Adding a page, form, flow, or campaign every time last week hurt.

Do this instead

Name which edge is missing. Fix that edge. Hurt is usually a skipped write-in, not a missing asset.

The usual miss

Reporting that nobody will defend in a meeting — screenshots, vanity opens, 'interested' counts.

Do this instead

Jobs: Written. Flow vs campaign. If you cannot say it out loud, it is not a scoreboard.

The usual miss

Hiring or retaining an agency to invent the spec while also running the calendar.

Do this instead

Hands on a known sequence are useful. Hands inside a missing spec pick the louder job (the calendar) and the leak stays.

04

What to watch

A scoreboard

Jobs

Written

Flow vs campaign

Fatigue

Measured

Not a vibe

Holdout

On big sends

Or the send did not prove itself

This week

A written split of jobs

01

A written split of jobs

02

Campaign calendar sits on flows

03

Fatigue is measured

04

Holdouts exist on big sends

Want the longer lesson, not the page for this niche? Flows compound. Campaigns pulse.

Working notes

DTC Retention Scorecard

Score your Klaviyo and lifecycle system the way an operator would. Request the file. It arrives by email — not a public dump, not a drip of slogans.

Request the notes ↗
Next

Talk through the sequence.

Email and WhatsApp stay open. A call is for installing the system.