Node reference
Every node type, its fields, and its wiring constraints
The graph model
Nodes, connections, entry views, and how it is stored
Server vs browser
Which nodes run before the page is sent, and which run after
Patterns
Worked examples and troubleshooting
The graph model
A page’s events are a directed graph of nodes. Every node has:- a type (
data.type) — the real identity of the node, e.g.script_rule,dynamic_container,component_split_test - a node code (
data.node_code) — a short stable identifier used by analytics and split-test reporting - input and output pins —
input_1,output_1,output_2… Connections are stored on both ends, so a link appears in the source node’soutputs.output_N.connectionsand in the target’sinputs.input_M.connections. - a position on the canvas (
pos_x,pos_y)
Reading a branch
Outputs are ordered, and the order is the meaning:- Output 1 — the first pin. For a condition node this is the true / Yes branch.
- Output 2 — the second pin. For a condition node this is the false / No branch.
Entry views
Every flow starts from an entry node (the node labelled Loaded). A page may have several. Each entry node appears as a View in the left rail of the builder. You can name it (pencil icon), reorder the list by dragging, and each view remembers its own camera position on the canvas. The order is saved asentry_views_order.
Global page events
Alongside per-page events, a brand has one Global Page Events graph — open it with Manage Global Page Events in the builder toolbar. Global events are merged into every page’s flow and are ordered ahead of the page’s own events. Use them for brand-wide concerns (cloaking, IP rules, universal tagging) instead of copying the same nodes onto every page.Where it is stored
Page events are loaded and saved through:global in place of the page ID for the brand-wide graph. Save is POST only — there is no PUT, and these are session-authenticated app endpoints, not public API-key endpoints.
The response body is the builder’s export:
When a page has no events yet,
GET .../events returns 200 with an empty body — not {} and not 404. Handle that case if you are reading the endpoint programmatically.node_codes where missing, and creates or updates the split-test records referenced by any split_test / component_split_test node.
Server vs browser
Each node declares where it can run. The platform splits your graph into a server pass and a browser payload.
How the split is decided: a branch is sent to the browser if it — or anything below it — is a browser-only node. Certain nodes are pinned to the server even when they have browser children (
script_rule, page_variant, product_check, cloaking_house, is_whitelisted, url_redirect, set_variable, set_checkout_bumps, block_request, split_test, execute_automation). When such a node picks a branch that belongs to the browser, the server hands that branch over to the browser payload and stops there.
Browser events are serialised into the page as window.page_events and executed by the funnel runtime script. Save your flow and reload the page to pick up changes.
Node catalogue
The full list — purpose, fields, inputs/outputs and constraints for every node — lives in the Page Events Node Reference. Quick orientation:Flow control
Flow control
Loaded (entry) · Router · Sequence · Stop Next Events Execution
Conditions — server
Conditions — server
Script Rule · Query Parameter Condition · Is Customer · Has Purchased Any Upsell · Referred By Affiliate · Is From Country / State / EU / Timezone · Is Using VPN/Proxy · Is Whitelisted? · Has Tag · Cloaking.house · Product Check (+ Match Product / Match All)All of these compile to a script and take the true branch on Output 1.
Conditions & triggers — browser
Conditions & triggers — browser
On Exit Intent · On Form Success · On Add To Cart · CTA: On Shown · When scrolled to · Scroll Check · Element In View · If Showed CTA · If Added To Cart · Video: Is muted / On Pause / On Goal Reached / Progress Check
Content & routing
Content & routing
Dynamic Content · Load Another Page · Redirect to Page · Redirect to URL · Show Popup · Show / Hide Element · Show / Hide Video CTA · Wait Seconds · Execute Javascript on Client
Session, commerce & security
Session, commerce & security
Tag User · Whitelist visitor · Mark visitor as NOT whitelisted · Set Merchant · Clear Merchant · Set Checkout Page · Set Checkout Bumps · Set Variable · Execute Automation on Customer · Block Request
Split testing
Split testing
Component Split Test · Split Test · Traffic Distribution · ComponentSee Split Testing for the full wiring.
Nodes are filtered by permission. If a node is missing from Add Node, your role probably lacks its permission — for example split-test nodes need
split_tests.create / split_tests.update, and Set Checkout Bumps only appears on pages flagged as checkout pages.Common patterns
Whitelisting from a URL parameter
- Loaded → Query Parameter Condition (
vtID, operatoris not empty) - Output 1 → Whitelist visitor (
0minutes = permanent) - Output 2 → leave empty, or route to compliant content
Blocking traffic outside a country
- Loaded → Is From Country with
USselected - Output 1 (true) → leave empty
- Output 2 (false) → Block Request with your message
Merchant by traffic source
- Loaded → Query Parameter Condition (
sourceispartner1) → Output 1 → Set Merchant - Output 2 → a second Query Parameter Condition (
sourceispartner2) → Output 1 → Set Merchant - Output 2 → nothing; the domain default applies
Video: pause, then show the CTA
- Video: On Pause → Video: Progress Check (
30%) - Output 1 → Wait Seconds (
2) → Show Video CTA (with Scroll to CTA if you want the page to jump) - Output 2 → nothing
Swapping content for one affiliate
- Loaded → Referred By Affiliate (pick the affiliate)
- Output 1 → Dynamic Content → container
pricing, componentaffiliate-pricing - Output 2 → nothing; the container’s default content renders
Best practices
- Prefer the purpose-built condition over a Script Rule. Is From Country, Is Using VPN/Proxy, Query Parameter Condition and friends are readable at a glance and self-documenting. Save Script Rule for logic they cannot express.
- Combine instead of nesting. One Is From Country with three countries beats three chained nodes. If a chain would be three levels deep, write one Script Rule.
- Put server decisions first. Everything that routes, cloaks or selects content should run before the first browser node.
- Name your split tests and variants. Those names are what you read in analytics later.
- Use views to keep the canvas readable, not to separate behaviour — every view runs.
Troubleshooting
Nothing happens on the page
Nothing happens on the page
Save the flow and reload the page — browser nodes are shipped with the HTML, so an unsaved change is not live. Then check that the branch is actually reachable: a node wired to nothing, or attached below a condition whose other branch is being taken, will not run.
A branch runs when it should not
A branch runs when it should not
Check which output you attached to. Output 1 is true, Output 2 is false. This trips people up most often with Block Request and Load Another Page.
Only one of my two actions runs
Only one of my two actions runs
Every node except Sequence allows one connection per output. Add a Sequence node and give it an output per action, or chain the actions.
A node refuses to connect
A node refuses to connect
The builder enforces parent restrictions. Component only attaches to Traffic Distribution; Traffic Distribution only to a split-test node; Video: Is muted only below On Exit Intent; Product Check: Match Product/All only below Product Check. See wiring rules.
Everything after my split test is ignored
Everything after my split test is ignored
A Component Split Test ends its branch after swapping the container. Wire follow-up work before it, not after it.
A condition always takes the same path
A condition always takes the same path
Open the Debug Window → Page Events tab. It shows each Script Rule’s result, execution time, console output and the full data it received. Remember that parameter names and values are case-sensitive.
Split-test or container dropdown is empty
Split-test or container dropdown is empty
The container list is read from the page itself. On builder pages the container must be a Split Test Container / Dynamic Container block with its name trait filled in; on coded pages the tag must be written as
<split-test id="…" name="…"> with id immediately before name. Click the reload icon next to the dropdown after saving the page.