EXOD

Reference

Nodes

Node reference

Every node you can put on a canvas, what it does, and what will bite you. A workflow is a program; these are its instructions.

A workflow is a program for an ad account

Most ad tools give you forms. EXOD gives you a canvas, and what you draw on it is the thing that runs: the campaigns it creates, the audiences it buys, the copy and pictures it writes, and the rules that change all of it while you sleep.

That distinction matters because a form describes a campaign ONCE. A workflow describes it continuously — it is still there tomorrow, still holding the reasoning, still able to be read, edited and re-run by somebody who wasn't in the room when it was built.

The shape of a campaign

Every workflow has the same spine, because every ad platform has roughly the same one. The root Campaign holds the name and the total daily budget. Under it, a Platform node per network. Under that, the Ad Account that gets billed and the Page ads publish from — both of which feed a Campaign, which holds the objective.

Beneath the campaign sit Ad Sets, one per audience you want to test. Each ad set has a Creative Room, and the room holds the ads. A Destination says where the click lands. That is the whole required structure; everything else — personas, pixels, forms, rules, AI — attaches to it.

Wires carry delivery. Rules watch.

A structure wire is the path spend takes: campaign to ad set to room to ad. When a campaign is live, those wires turn green and a current runs along them from the campaign outward — and it stops dead at anything paused, so a dark branch hanging off a lit campaign tells you exactly which part isn't delivering.

A rule wire is different. It drops from the bottom of a node and means "watch this". A Condition hanging off an ad set reads its numbers; it is not part of what the money flows through, and no current runs along it.

Where a node sits is what it means

Several nodes act on everything beneath them rather than on the one thing they're wired to. A Persona under the root shapes how every ad in the workflow is written and drawn. A Generate node under a Creative Room directs every image in that room. A Schedule above a branch decides when all of it runs.

This is why moving a node changes behaviour, and why nothing copies its settings onto its children when you place it. The relationship is looked up from the graph every time — so rewiring the canvas rewires the meaning, and there is no stale copy left behind to disagree.

When two of these disagree, the more specific one wins. A Generate brief beats a Persona's standing visual direction, for the same reason a note about today beats a policy about every day.

Compile, dry run, launch

Pressing Launch does not send your drawing to Meta. It compiles it — turning the graph into an exact plan of every campaign, ad set and ad it would create — and anything the compiler cannot build faithfully becomes a problem it names and refuses on. There is no best-effort tier, because the failure that matters is not a crash; it is a launch that quietly drops an audience and reports success.

The dry run and the live run compile the same plan through the same code. So the preview cannot promise something the launch then does differently, which is the only way a preview is worth reading.

Launching twice builds a second set of campaigns. It does not update the first — the panel says so when a workflow has already been built.

Choosing a picture and generating one are different acts

An image you generate or pick for an ad is used at launch exactly as it is. An ad with no image gets one drawn from its own copy, the persona above it and the Generate brief in scope. Those two paths never overwrite each other: the automation fills in what you left empty, and it never replaces something you decided.

Every generated image is looked at by a compliance screen before it can become an ad — real logos, invented brand marks, fabricated testimonials and numbers nobody wrote. A rejected image is redrawn once with the reason attached, and an ad that still cannot produce a clean picture is skipped rather than launched as a grey box that spends the same money.

What happens after it launches

A workflow with a Schedule and an armed trigger runs itself. The first live run of any workflow is always a dry one — full traversal, every action described, nothing performed — because "I armed it" and "it is now spending unattended" should not be the same click.

Beneath that, EXOD's own optimizer is already reading the account twice a day: scaling what works, pruning what doesn't, rotating audiences that stopped producing. The State Router node is that machine exposed as five outputs, so a workflow can hang its own actions off the same verdicts rather than approximating them with thresholds.


Super

AI

ai

Reads numbers and returns a judgement.

Read-only by construction: it can decide, it cannot act, and what it decides is always one of a fixed set of choices. The figures are assembled by EXOD and handed over — the model never queries anything, so a finding can only rest on a number that actually exists.

Wiring. Over whatever it should read. Wire the actions it may choose between below it.

Worth knowing

  • Costs real money per run and needs a verified Anthropic key.
  • Two of the tasks — Mordor and the Hive — are super nodes: they write to a memory that outlives the workflow they sit in.

Chaos Mode

chaos_mode

A hard cost-per-lead cap. Kills anything that breaches it and keeps testing, unattended.

Saving this node saves a real account setting that the live optimizer reads — it is not a drawing of a policy, it IS the policy. A super node, in its own red rather than the super gold, because 'reads and remembers' and 'kills things without asking' are different kinds of dangerous.

Wiring. Anywhere on the canvas. It applies to the account, not to what it is wired to.

Worth knowing

  • It acts on its own judgment with no confirmation step. That is the entire feature, and it is why it doesn't look like anything else.

Platform

Platform

platform

Which ad network this branch of the workflow runs on.

Everything downstream belongs to that network — its accounts, its Pages, its campaigns. Drawn as a square tile because the logo identifies it faster than any label could.

Wiring. Under the root Campaign. Ad accounts, Pages and campaigns below it.

Worth knowing

  • A Google branch compiles through an entirely separate compiler and launcher. Meta rules — Pages, ad sets — are not applied to it, and vice versa.

Fan-out

Multi Source

multi_source

Builds the same structure across every account and Page wired into it.

One workflow, several ad accounts. This is the node that multiplies everything below it, which is why it has a colour nothing else in the palette comes near.

Wiring. Between the sources and the campaign they should each build.

Worth knowing

  • The budget is per CAMPAIGN. Three accounts at $28/day is $84/day, not $28 divided three ways.

Accounts & Pages

Business Manager

business_manager

The portfolio the accounts and Pages belong to. Google's equivalent is the manager (MCC) account.

An agency picks the client's portfolio once and everything below it is confined to that client's assets. Without one, every account the login can reach is offerable.

Wiring. Under a Platform. Ad accounts and Pages below it.

Worth knowing

  • Meta refuses an ad account from one Business Manager paired with a Page from another. The canvas confines the pickers so that pairing can't be drawn in the first place.

Ad Account

ad_account

Which account gets billed.

Chosen from what OAuth already discovered, never typed by hand — an account the token can't reach would only fail at launch, after the campaign structure was half-created. Unusable accounts are shown and disabled with the reason rather than hidden.

Wiring. Under a Platform (or a Business Manager). Feed it INTO the campaign it should bill.

Worth knowing

  • The account must feed the campaign, not merely sit beside it. A campaign with no ad account above it refuses to compile — 'there is nothing to bill'.
  • Add several under one Platform, joined by a Multi Source, to build the same campaign in every one of them.

Page

page

The Facebook Page ads publish from.

Every Meta ad is published by a Page — it is the identity in the feed. Google Search has no equivalent, which is why this node is Meta-only.

Wiring. Under a Platform. Feed it into the campaign, alongside the ad account.

Worth knowing

  • A Page access token is also what creates an Instant Form. If the Page was connected before form support existed, reconnect Meta or form creation fails at launch.

Business

business

Who the ads are for — your business, on the canvas.

The same facts onboarding collects: what you do, what you sell, your industry, your offer, your price point. It is your account's real record rather than a copy, so editing it here changes what every other part of EXOD reads, and every workflow you own can drop one in and get the same answers.

Wiring. Anywhere above the campaigns it should inform. Near the root is usual, so it reaches everything.

Worth knowing

  • It shows the subset of your account record that changes how an ad is WRITTEN. Billing, API keys and budget ceilings live on the same record and deliberately aren't here — a node carrying those couldn't safely be published to the marketplace.
  • Saving edits the account, not just this canvas. Two workflows with a Business node are looking at one record, not two copies that can drift.

Scan website

scan

Reads a real website and turns it into the brief everything below it writes from.

The only node that fetches something on demand — you press Scan and it loads the page. It reads what the site says it does, what it sells, who for, how it sounds, and any proof or offer already in writing, then hands that to the copy and image generation beneath it. Creates nothing on any ad platform; it produces knowledge.

Wiring. Above whatever should write with it — usually near the root, so the whole workflow benefits.

Worth knowing

  • It EXTRACTS, it does not invent. A site that states no guarantee, rating or offer produces empty fields, and the copy is written without them rather than with plausible substitutes — a fabricated proof point on a real business's ad is that business's problem, not ours.
  • A site that renders entirely in JavaScript often returns almost no readable text. The node says so rather than confidently summarising nothing.
  • The scan is a snapshot taken when you pressed the button. A site that changes afterwards doesn't update it — rescan.

Pixel

pixel

The pixel this branch measures against, and which event on it counts as a conversion.

Lists the real pixels on the ad account above it, then merges saved Custom Conversions with standard pixel events carrying their true 30-day fire counts — the same two lists Meta's own conversion picker shows. Creates nothing; it names an existing pixel and picks the signal the ad sets below it bid toward.

Wiring. Under the Ad Account it belongs to, or under the campaign. Both are found.

Worth knowing

  • Without a Pixel node the launch falls back to your account-level conversion setting — and if that can't resolve, the campaign is built as TRAFFIC. It buys clicks, not conversions, whatever the campaign node's objective says.
  • Events that have never fired are still offerable, because Meta accepts them and a shop that hasn't sold anything yet is exactly the account that needs a Purchase campaign. They are labelled 'never fired' — optimising toward one means Meta has nothing to learn from.
  • Changing the pixel clears the conversion. An event chosen on one pixel is not a fact about another.

Budget

Daily Budget

budget

A budget applied to what sits below it.

Most workflows never need one — the root Campaign's total is divided between platform branches automatically. This exists for the cases where a specific branch should be pinned rather than derived.

Wiring. Above whatever it should constrain.

Worth knowing

  • Meta's campaign budget optimisation owns the real split between ad sets. A per-ad-set number is EXOD's planned share and bookkeeping, not an instruction Meta honours.

Timing

Every

schedule

How often everything below it runs, and the hours it may run in.

Without one, a graph describes what to do and never says when — which is the difference between a diagram of an optimizer and an optimizer.

Wiring. Above whatever it should drive.

Worth knowing

  • A Schedule is a control, not a delivery step. It doesn't carry spend, and the live-delivery current on the canvas stops at it.

Wait

wait

A durable pause inside a run.

'Change this, wait 48 hours, look again' is the shape of every honest ad test, and a graph that can't hold a wait can only express changes it never checks.

Wiring. Between the change and the check.

Structure

Workflow root

exod_campaign

The root of a workflow. Carries its name and its total daily budget.

EXOD's own object — nothing on any ad platform corresponds to it. Everything else in the workflow hangs beneath it, and the budget set here is the ceiling the platform branches divide between them. A workflow has exactly one.

Wiring. Nothing above it. Platform nodes below, one per network the workflow runs on.

Worth knowing

  • The budget here is the workflow TOTAL. Two platform branches at $25/day each is $50/day, not $25 split — the compiler reports the sum so it can be checked against your account ceiling before anything is created.

Campaign

campaign

One real campaign on one ad account.

Carries the objective and becomes an actual campaign object at launch. A workflow can hold several, and a Multi Source above one turns it into a campaign per account.

Wiring. Under a Platform, fed by an Ad Account and a Page. Ad sets and a Destination below.

Worth knowing

  • The objective here can be overridden at launch. Meta's real objective is computed from the conversion — a LEADS campaign with no usable conversion signal is built as TRAFFIC.
  • Launching twice builds a SECOND campaign. It does not update the first. The launch panel warns when a workflow has already been built.

Ad Group

ad_group

Google's equivalent of an ad set — a tight keyword theme.

Google puts the budget on the campaign, not here, so an ad group is about relevance rather than spend: a handful of closely-related keywords and the ads that answer them.

Wiring. Under a Google campaign. Keywords and ads below.

Worth knowing

  • Because the budget is campaign-level, the per-unit levers on Google are bids, pausing the ad group, and pruning keywords — not moving this one's budget.

Audience

Ad Set

ad_set

One audience: who, where, how much, and for how long.

Meta has no smaller unit — targeting, geography, budget and schedule all live on the ad set together. Several under one campaign is how you test audiences against each other.

Wiring. Under a Campaign. A Creative Room below it holds its ads.

Worth knowing

  • An ad set that targets nowhere refuses to compile. At least one location is required.
  • An age range on a broad ad set forces Meta's Advantage+ Audience off — the two are mutually exclusive, and the launcher handles it rather than letting Meta silently ignore the age range.

Keywords

keywords

What someone typed into Google for this ad group to show.

Grounded in Google's own Keyword Planner rather than invented — seeded from the site EXOD already scanned, so the terms come back with real search volumes and competition instead of plausible guesses.

Wiring. Under a Google ad group.

Worth knowing

  • Phrase and exact match to start. Broad match on a small budget with no conversion history spends fast and teaches little.
  • Negative keywords are not optional at these budgets — jobs, free, DIY, cheap will otherwise take a real share of the spend.

Creative

Creative Room

creative_room

The workspace where an ad set's ads are written, generated and compared.

A container rather than a step — nothing flows through it. It stands in for its ads on the canvas so a campaign with twenty-five of them doesn't draw twenty-five preview cards, and you open it to work on them side by side.

Wiring. Under an Ad Set. Ads below it, plus any Generate node that should direct them.

Worth knowing

  • 'Generate N images' fills in ads that have no picture and deliberately skips ones that do. Redrawing an approved image is per-ad and explicit.
  • Live ads read back from an ad account can't be removed here — that's a change to a real object with spend history, and it belongs in the publish queue.

Persona

persona

A named strategist's framework, applied to everything beneath it.

Doesn't create anything. It shapes how copy downstream is written AND how images are drawn — each persona carries a doctrine, a visual direction, and the set of visual formats its method can justify.

Wiring. Wire it above whatever it should shape — usually right under the root, so it reaches the whole workflow.

Worth knowing

  • The name never appears in the ad itself. It shapes EXOD's reasoning about how to write, not the words a customer reads.
  • A persona shapes copy and pictures; it does not touch targeting or budget. A $1-a-day framework wired above a broad national ad set at $25/day produces copy that argues with its own media buy.
  • A Generate node's brief BEATS the persona's visual direction where they disagree — the specific instruction wins over the standing one.

Generate

generate

Makes a creative from scratch — copy, an image, or a video.

Separate from AI nodes because these PRODUCE an asset rather than return a judgement. Its brief is art direction for everything drawn beneath it, and it directs by position rather than by wire: a Generate node under a Creative Room shapes every ad in that room.

Wiring. Under a Creative Room or an Ad Set. It is a sibling of the ads it directs, not a step before them.

Worth knowing

  • It fills in ads that have NO image. An image you already generated or picked is used as-is at launch — choosing and generating are different acts.
  • The brief beats an upstream Persona's visual direction where the two disagree.
  • Video generation needs a verified Seedance (ARK) key; images need OpenAI.

Destination

Destination

destination

Where the click lands.

An Instant Form, an EXOD landing page, a product page, or any URL. The four are kept apart because what you PICK differs even though Meta receives the same field.

Wiring. Under a Campaign. Point it at a Form node when it's in Instant Form mode.

Worth knowing

  • Two different destinations under one campaign is a blocking error — Meta sets the link per ad, so this has to be split into separate campaigns.
  • An Instant Form destination with no Form node wired to it blocks the launch. Without it, the ad would be rejected at ad-creation time, after the campaign and ad sets already existed.

Instant Form

form

A Meta Instant Form — the questions a lead answers without leaving Facebook.

Defines the prefilled fields, the qualifying questions, the intro and the privacy policy. Its own node rather than a panel on the Destination because one form is normally reused across several ad sets, and a definition living inside one destination can't be shared by another.

Wiring. Pointed at by a Destination node in Instant Form mode.

Worth knowing

  • Meta refuses to create a form without a privacy policy URL. The compiler blocks the launch rather than letting it fail halfway through, after the campaign already exists.
  • Name, email and phone are all prefilled from the profile, so a form asking only for those can be submitted in two taps by somebody who read nothing. One qualifying question is the biggest lever on lead quality there is.
  • A custom question that duplicates a prefill field, or asks for a protected attribute, makes Meta reject the WHOLE AD. Questions are sanitised before submission and dropped ones are reported.

Rules

Condition

condition

Compares a metric to a threshold.

Every metric it offers is a number EXOD already reads back from the platform, so a rule written against one can actually be evaluated. On its own it only states a fact — an Action is what acts on it.

Wiring. Hangs off whatever it watches. An Action on its Yes branch.

Worth knowing

  • `days_live` is the most important guard available. Almost every other threshold is nonsense before the platform has left its learning phase.

Action

action

What happens when a condition holds.

A deliberately small, closed set — every one maps onto something EXOD's publish path can already perform on a live object. An action list that outran the platform layer would be a promise the graph couldn't keep.

Wiring. On a Condition's Yes branch, or a State Router's outputs.

Worth knowing

  • 'Replace it with this' is two nodes — a pause AND a create. Modelling it as one would hide the half that spends money.

Branch

branch

Splits the flow: one path when a condition holds, another when it doesn't.

Both paths are real and both are drawn, so what happens in the negative case is as visible as the positive one.

Wiring. Yes and No outputs, each feeding what should happen.

Split test

split

Sends even shares down two paths and compares them.

A structured test rather than a condition — nothing is being checked, two things are being run against each other.

Wiring. Two outputs, A and B.

Optimizer note

rule

What EXOD's own optimizer decided about this ad set, and why.

Read-only. It reports a decision the live optimizer already made rather than defining a new one.

Wiring. Hangs off the ad set it describes.

Ad set state

state_router

EXOD's ad-set state machine as one node with five outputs.

Learning, winning, scaling, fatiguing, losing. This is the thing that actually runs live accounts today. Five separate threshold conditions can approximate it; none of them can BE it, because the states are decided together and only one can hold at a time.

Wiring. Over an ad set. One branch per state.

Worth knowing

  • The labels matter more here than anywhere else on the canvas — five unlabelled outputs would tell you a fork exists and leave 'which one scales the winner' to be guessed.

Output

Blueprint

blueprint

A subgraph parked off to the side, not live.

The thing a rule points at when it says 'replace it with this' — without one, 'this' has no referent.

Wiring. Not connected to the live path. Referenced by a Create-from-blueprint action.

Read-only nodes

Ads

ads

Several ads, summarised as one node.

What a compiled campaign draws when it reads a live ad set back off an account: the count and the aggregate state, with the individual ads in the setup panel.

Wiring. Under an ad set or ad group, from a compiled campaign.

Join Our Discord for Support