A data driver fetches something and publishes it as variables, which is what makes a decision possible further down. When a rule cannot test what you want, the answer is almost always a data driver above it.
Two of them, Contentful Data and Content Cloud Data, resolve content rather than customer facts. They make messages richer; they make no new branch possible.
Calls any HTTP endpoint and reads the response into the journey. Use it when the fact you need lives in a system Xenia has no connector for, or when something outside needs telling and no integration node covers it.
Configure
Required: the URL. Bearer auth also asks for the token, basic auth for a username and password, and API key auth for a key name, a key value, and whether it travels in the header or the query string.
Filling it in from a cURL command
Paste a cURL command into the Request URL field and the rest of the node fills itself: method, headers, body, query parameters, and auth. It is the fastest way in when you already have the call working somewhere else, from Postman, a browser's network tab, or a colleague's message.
What it reads: -X / --request for the method, -H / --header for headers,
-d and its variants for the body, -u and an Authorization header for auth (both
lifted into the Authorization setting rather than left as a raw header), -m /
--max-time for the timeout, and the URL's own query string, which is split out into
Query params. Transport flags such as -L, --compressed, -k and -s are
recognised and ignored. Multipart -F has no equivalent here and is reported rather
than silently dropped.
A plain URL pastes as a plain URL. Only text that starts with curl is treated as a
command.
Caching the response
Under Advanced, a GET node can reuse a recent response instead of calling again. Switch on Cache responses, pick the upstream variables that make one response distinct from another, and set how long an answer stays usable.
Two runs share a response when these variables resolve to the same values and the request is unchanged. Editing the URL, body or headers starts a fresh entry, so a change to the node never serves an answer fetched under the old settings. A rotating bearer token does not, so credentials that change hourly do not defeat the cache.
The cache is shared across the whole workspace and environment, not just one journey run, which is what makes it save real calls. A downstream node reads a cached response exactly as it reads a live one: declared response fields and nested arrays are republished either way.
Caching is GET-only on purpose. Reusing an answer to a POST or DELETE would mean the write silently never happens on the second run, with nothing in the journey to show for it.
Produces
For an object response, one variable per declared response field, named as you named
it. For an array response, {{response}} plus one response. prefixed variable per
declared schema field.
Watch out
Reads a Klaviyo profile, checks list membership, or pushes an event. Useful while Klaviyo is still the system of record for engagement.
Configure
Required: the connector.
Produces
One variable per declared response field. With none declared, only {{response}},
which no rule can test usefully.
Watch out
check_list answers about one named list, not whether the person is engaged in
general.Resolves a Contentful entry so later nodes can render it. Use it when the copy belongs in the CMS, so marketing can change it without touching the journey.
Configure
Required: the connector.
Watch out
Resolves Content Cloud entries for later nodes to use, and names the base entry that an In-Entry Personalization node beneath it will swap sections of.
Not shown in Shopify-billed workspaces.
Configure
Required: the connector.
Watch out
Swaps sections inside the CMS entry resolved upstream, so the page stays the same and one block inside it differs for this customer.
Not shown in Shopify-billed workspaces.
Needs upstream
Configure
Swaps are built in the node's panel and applied there, not typed.
Watch out
Loads the customer's stored Shopify profile, order history, and engagement metrics. This is the node that makes value, frequency, and recency testable, so it is the usual answer to "the journey has no way to know that".
Configure
It acts on whoever is in the run, so there is nothing else to configure.
Produces
{{customerEmail}}, {{customerPhone}}, {{customerFirstName}},
{{customerLastName}}, {{customerCountry}}, {{customerLanguage}},
{{customerSubscribedEmail}}, {{customerOrderCount}}, {{customerTotalSpent}},
{{customerAvgOrderValue}}, {{customerLastPurchaseAt}},
{{customerEmailOpens30d}}, {{customerEmailClicks30d}}.
Watch out
{{customerOrderCount}} counts the last 90 days, not the customer's lifetime.order.* trigger already carries the order and its value, so a second read after
one adds nothing.ENRICH_USER
resolves the same kind of profile.Checks whether the customer bought since a point in time, so a recovery or reminder sequence can stop chasing someone who already purchased.
Configure
Produces
{{purchased}}, {{notPurchased}}, {{orderCount}}, {{checkedEmail}},
{{emailSource}}, {{sinceIso}}, {{checkSkipped}}.
Watch out
{{purchased}},
the journey carries on regardless and the buyer still gets the next nudge. The
correct shape for abandoned-checkout recovery is: wait, check, rule, then send.{{checkSkipped}} rather than failing. Branch on
that if the outcome matters.Makes the customer eligible for a discount and hands the code back as a variable, so a message can carry a code only that customer can use.
Configure
Required: the mode. Existing mode also requires the price rule and the code; create mode also requires the value.
Produces
{{coupon_code}}.
Watch out
{{coupon_code}} is
available to later nodes only.