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:
| Segment | Micro-intent | |
|---|---|---|
| Time horizon | Weeks to months | Minutes to days |
| Stability | Slow-changing | Fast-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 for | Audience targeting, lifecycle nudges | Real-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:
| Topic | Signal pattern |
|---|---|
purchase_intent_high | Multiple views of the same product / category in last N minutes; cart additions; checkout starts |
purchase_intent_low | Browse without depth; bounces; no recent engagement |
support_seeking | Negative-sentiment messages; refund-related queries; help-page visits |
loyalty_engaged | Reward catalog views; tier-progress checks; redemption attempts |
churn_risk | Drop in baseline engagement vs trailing 30 days; settings-page visits in unusual patterns |
payment_friction | Repeated 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:
- Reads the event’s signal-density contribution (how strongly it predicts each topic)
- Updates a per-contact rolling intent score per topic
- Decays older signals exponentially (recency matters more than count)
- 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_seekingis 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_seekingis active, suppress promotional sends until the support thread is resolved (the contact wants help, not a discount). - If
payment_frictionis active, suppress non-payment-related touches (don’t add noise to a frustrating moment). - If
churn_riskis 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
requiresScoringTierofheuristicorlocal_ml; they render as locked tiles with an unlock hint until the workspace’sscoring_tiermeets 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
| Surface | What it shows |
|---|---|
| Contact detail → Intent panel | Current active intents with confidence scores |
| Segments → Create | Use intent topics as segment predicates (e.g. “in churn_risk for last 7 days”) |
| Journeys → Branch node | Branch on intent state |
| Inbox | Agent 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
- How Actii decides — how intents feed into Actii’s higher-level decisions
- Cross-campaign suppression — uses intents as a suppression input
- Journey-driven dispatch — dispatch policy that reads intent state