1. Store each merchant’s brand
Create a custom object type for the branding, for examplemerchant_brand,
and one record per merchant. Use the merchant’s ID as the record’s
external ID, and give it the fields your email needs:
Load them like any other data: with the API
(
POST /api/v1/cdp/custom-objects/types,
then POST /api/v1/cdp/custom-objects),
an import, or a sync. A color is a hex (#1D5FD1), an rgb() or hsl() with
plain numbers, or a CSS color name. Anything else is treated as empty.
If your journeys start from a person rather than an event that names the
merchant, also link people to merchants and merchants to their brand. See
Relationship types.
2. Add a Look up record step
In the journey, add Look up record right before the email step, and set:- Record type:
Merchant Brand. - Save as: the name later steps use, for example
brand. It becomes{{brand.logo_url}},{{brand.primary_color}}and so on. - How to find it:
- By an ID this run carries: insert the variable that holds the
merchant’s ID, such as
event.merchant_idon the event that started the journey, a person attribute, or a field of a record an earlier step loaded. - Linked to the person: pick how the person is linked, up to three hops (person → merchant → merchant brand).
- By an ID this run carries: insert the variable that holds the
merchant’s ID, such as
- Fields to load: tick every field the email uses (up to 30). Only these are available to later steps.
- If several match (linked to the person): pick the field that decides which record wins, and whether the highest or lowest value wins. Without it, several matches load nothing.
3. Bind the email to the record
Open the email template in the editor:- Colors: next to any color (text, heading, button, divider, background),
choose
{ }(Use a variable for…) and typebrand.primary_color. The swatches you pick become the fallback, used when the value is empty or isn’t a color. - Logo and images: on an image, choose
{ }and typebrand.logo_url. The image you already had becomes the Fallback image URL. Always keep a fallback image: without one, a merchant with no logo gets an empty image. - Copy: use the record anywhere you write text, for example
Your order with {{brand.name | default: 'us'}}in the subject.
What happens at send time
- The run always continues. If no record is found, the step records No record found, the fields are empty and the email uses its fallbacks.
- Unsafe values are removed. Before an email goes out, Boom checks the
values that came from your data. A value that would add a script, an event
handler or a
javascript:link is removed. - Each run shows what it found. The run’s timeline says Record found: Marea, or why nothing was found (no match, an empty ID, several matches and no rule).
What publishing checks
Everybrand.<field> the journey reads, including inside its email
templates, must be loaded by a Look up record step saved as brand that
runs before it. If the email reads brand.primary_color and the step doesn’t
load it, publishing is refused and names the field to add.
Other channels and uses
Saved records work in emails, WhatsApp, SMS, Instagram and Messenger messages, HTTP requests and Dispatch event steps. Decision and Case steps can’t readbrand.* directly; to branch on whether a record was found, use the step’s
Found output.
With the API and MCP
Journeys built over the API or MCP use the same step (LOAD_OBJECT, with
objectType, saveAs, lookup and attributes) and the same publish checks.
See Journeys for the node reference and Use Boom from
MCP to connect an AI agent.