Contact model first, journey second
Journey Builder is only as good as your data model. Get the base right:
- Contact = the person (unique
SubscriberKey) - Data Extension (DE) = a table (relational or sendable)
- Contact Attributes = joined DE + Contact Model definition
Never use the Subscriber list as your source of truth — it's a legacy construct.
AMPscript vs. SSJS vs. Content Blocks
- AMPscript — inline personalization inside emails (
%%=Lookup(...)=%%) - SSJS — programmatic content blocks, API calls, complex logic
- Content Blocks — reusable, versioned, marketer-editable
Rule: if a marketer might change it, use a Content Block. If it's logic, use SSJS. Keep AMPscript for row-level merges only.
%%[
var @firstName, @tier
set @firstName = AttributeValue("FirstName")
set @tier = Lookup("Loyalty_Tiers", "TierName", "SubscriberKey", _subscriberkey)
]%%
Hi %%=v(@firstName)=%%, your %%=v(@tier)=%% perks are ready.
Entry sources that don't wake you at 3am
- Data Extension entry with a re-evaluation schedule — safest default
- API entry for real-time (cart abandon, sign-up) — idempotent, expects a
ContactKey - CloudPages — form → journey in one step
- Salesforce Data Event — CRM change data capture
Anti-pattern: nested Filter Activities in Automation Studio feeding a File Drop entry. Every rescue engagement has one.
Real-time with Interaction Studio / Personalization
For sub-second journeys (cart abandon, page-view retarget), let Personalization (formerly Interaction Studio) capture the event and fire an API Event into Journey Builder:
Evergage.sendEvent({
action: 'Cart Abandoned',
cart: { items: [...], total: 148.90 },
user: { id: subscriberKey }
});
Journey waits 60 minutes → sends SMS → waits 24h → sends email → checks purchase attribute → exit if converted.
Einstein Send Time & Content Selection
Two features that move numbers with almost no effort:
- Einstein Send Time Optimization (STO) — per-contact best send hour, drops open rate lift by 10–25%
- Einstein Content Selection — bandit-style content-block picker, learns per contact
Enable them on the send activity — no data science team required.
Journey testing before production
- Use Test Send with a seed DE that includes edge-case rows (null firstName, invalid email, unsubscribed)
- Version every journey (Journey Builder auto-versions, but name the version explicitly)
- Stage in a QA Business Unit with a live-mail suppression rule
- Monitor Not Sent and Errored counts — anything > 0.5% is a data quality bug
Deliverability discipline
Domain warm-up, DMARC/DKIM/SPF, dedicated IPs when volume > 1M/month, and quarterly reputation review with Return Path. Marketing Cloud won't save you from a poorly configured sending domain.
