Skip to Content

Micro-intent engine

A micro-intent is the customer’s near-term goal — what they’re trying to do right now, not what stage they’re in lifecycle-wise. The micro-intent engine lets Active Reach pick the right next message based on signal density over the last few minutes, hours, or days, rather than waiting for a customer to settle into a segment.

Why micro-intents, not just segments

Segments describe who a customer is. Intents describe what they’re doing. The two are complementary:

SegmentMicro-intent
Time horizonWeeks to monthsMinutes to days
StabilitySlow-changingFast-changing — a single event can flip it
Example”VIP — Gold tier — F&B vertical""Browsing dessert menu — high purchase intent — abandoned twice this week”
Used forAudience targeting, lifecycle nudgesReal-time next-best-touch decisions

A segment tells you the customer is a Gold-tier VIP. A micro-intent tells you that right now, they’ve added desserts to a cart three times in 20 minutes without completing — so the next message should be a desserts-specific incentive, not the generic “we miss you” they’d get from a lifecycle journey.

Intent topics

The engine groups behaviour into intent topics — coherent themes that map to actions. Standard topics include:

TopicSignal pattern
purchase_intent_highMultiple views of the same product / category in last N minutes; cart additions; checkout starts
purchase_intent_lowBrowse without depth; bounces; no recent engagement
support_seekingNegative-sentiment messages; refund-related queries; help-page visits
loyalty_engagedReward catalog views; tier-progress checks; redemption attempts
churn_riskDrop in baseline engagement vs trailing 30 days; settings-page visits in unusual patterns
payment_frictionRepeated checkout attempts; payment method updates; failed-charge retries

Custom topics can be defined per workspace at Engage → Automations → Micro-intents → Topics.

How an intent gets assigned

For every event a contact emits, the engine:

  1. Reads the event’s signal-density contribution (how strongly it predicts each topic)
  2. Updates a per-contact rolling intent score per topic
  3. Decays older signals exponentially (recency matters more than count)
  4. Surfaces the top-N topics above a threshold as the contact’s “active intents”

A contact can have multiple active intents at once (purchase_intent_high + loyalty_engaged is a common combo for engaged shoppers).

Acting on intents

Intents are first-class inputs to:

  • Send nodes in journeys — branch on whether a topic is active
  • Playbook triggers — fire a playbook when a topic becomes active
  • Cross-campaign suppression — silence promotional messaging when support_seeking is active
  • Frequency caps — softer caps for high-intent contacts, stricter for low-intent

You can also surface intents in the contact detail sidebar so support agents see what the customer is currently trying to do.

Intent-driven suppression

The engine has opinionated defaults about what not to do:

  • If support_seeking is active, suppress promotional sends until the support thread is resolved (the contact wants help, not a discount).
  • If payment_friction is active, suppress non-payment-related touches (don’t add noise to a frustrating moment).
  • If churn_risk is active, switch from promotional to relationship messaging (apology, win-back offer, owner check-in).

These are configurable per-workspace — defaults exist but can be overridden if your audience behaves differently.

Frequency caps per intent

Every intent topic has its own cap budget separate from the workspace-wide cap. A contact in purchase_intent_high can receive more touches than a baseline contact because the intent itself is a green light — they’re asking to engage. The opposite holds for low-intent contacts.

The effective cap for any given send is:

min(workspace_cap, contact_cap, intent_cap_for_active_intents)

In-app pattern tiles — where they surface

The engine ships a catalog of named intent patterns — pre-wired rule shapes that compile to a typed IntentRule the in-app wizard can stamp directly into a campaign’s display_rules.trigger_config. Today’s catalog includes:

  • 4 anonymous patterns (shipped, always unlocked) — Hesitating Buyer, Bouncing Researcher, Stuck-at-Checkout, Returning Hover-Browser. No identity required; they read session-layer signals (scroll depth, dwell, exit intent, rage clicks, price hovers).
  • 4 identified-contact patterns (locked-by-data) — Win-back At-Risk, VIP Whisper, Price-Sensitive Nudge, and one more. Each carries a requiresScoringTier of heuristic or local_ml; they render as locked tiles with an unlock hint until the workspace’s scoring_tier meets the requirement.

As of the 2026-05-27 in-app persona split, these tiles surface on the /create discovery surface as the Smart trigger patterns featured row, not inline on the list page. The list page is now persona-grouped (outcome cards for SMB, dense table for Marketer); the trigger-pattern tiles moved to /create for more prominence as the wizard’s first row of options, rather than competing with campaign rows on the list. Selecting a tile deep-links into the wizard with ?pattern=<id>, which prefills display_rules.trigger_type='micro_intent' plus the pattern’s intentRule and frequencyCap. See the in-app channel guide for the full discovery shell.

Where to see intent state

SurfaceWhat it shows
Contact detail → Intent panelCurrent active intents with confidence scores
Segments → CreateUse intent topics as segment predicates (e.g. “in churn_risk for last 7 days”)
Journeys → Branch nodeBranch on intent state
InboxAgent sidebar shows intents so support handles the call with context

Measurement

The engine is opaque about how intents are computed (we don’t publish thresholds), but transparent about what intents are active and what signals drove them. Every intent assignment on the contact detail page can be expanded to show the contributing events.

You can also see aggregate intent distribution at Engage → Automations → Micro-intents → Health — useful for sanity-checking that the engine is detecting variety, not collapsing everyone into one or two topics.

What’s next