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.
Super
AI
aiReads 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_modeA 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.
Accounts & Pages
Business Manager
business_managerThe 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_accountWhich 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
pageThe 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
businessWho 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
scanReads 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
pixelThe 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.
Structure
Workflow root
exod_campaignThe 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
campaignOne 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_groupGoogle'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.
Creative
Creative Room
creative_roomThe 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.
Ad
adOne ad: a headline, body copy, a description and an image.
The copy is also the brief the image is drawn from — somebody wrote what this ad is about, so asking a second model to invent an angle would produce a picture of a different ad.
Wiring. Under a Creative Room.
Worth knowing
- An image you generate or pick here is USED at launch, not replaced. Ads with no image get one generated from the copy and whatever Generate brief is in scope.
- An ad missing its headline or body blocks the whole launch rather than being quietly skipped.
- Picking from the ad account's image library stores a Meta CDN link, which expires. On an ad that has never been published, generate instead.
Persona
personaA 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
generateMakes 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.
Rules
Condition
conditionCompares 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
actionWhat 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
branchSplits 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
splitSends 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
ruleWhat 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_routerEXOD'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.