Skip to main content

Engagement System

The Engagement system is the core of Raven Client. It manages the lifecycle of in-app messages, nudges, and tooltips.

What is Engagement?​

Engagement is a configuration that defines:

  • When to show something (state machine transitions)
  • What to show (actions)
  • How often to show it (frequency rules)
  • Who should see it (filters and grouping)

CTA Structure​

interface Cta {
ctaId: string; // Unique identifier
rule: {
actions: CtaActionType[]; // Actions to execute
contextParams: string[]; // Context parameters to store
priority: number; // Priority (higher = shown first)
frequency: FrequencyRules; // Frequency control
groupByConfig?: GroupByConfig; // Grouping configuration
stateToAction: Record<string, string>; // State → Action mapping
resetStates: string[]; // States that trigger reset
resetCTAonFirstLaunch: boolean; // Reset on first launch
stateTransition: StateTransition; // State transition rules
stateMachineTTL: number | null; // Time to live
ctaValidTill: number | null; // CTA expiration
};
resetAt: number[]; // Timestamps when reset
actionDoneAt: number[]; // Timestamps when actions executed
activeStateMachines: ActiveStateMachines; // Active state machines
behaviourTagName?: string; // Optional behaviour tag
}

Engagement Lifecycle​

Engagement Lifecycle

Priority​

Engagement is processed in priority order. Lower priority numbers are evaluated first (priority 1 is higher than priority 5):

{
"priority": 1 // Lower number = higher priority
}

If multiple Engagement match an event, the one with the lowest priority number (highest priority) is processed first.

Frequency Control​

Control how often Engagement is shown using frequency rules. See the Frequency Control Guide for detailed information.

Grouping​

Group Engagement by user attributes to create personalized experiences. See the Grouping Guide for detailed information and examples.

Validation​

Engagement is validated before processing:

  1. Expiration Check: Is ctaValidTill in the future?
  2. Frequency Check: Has frequency limit been reached?
  3. Behaviour Tag Check: Is behaviour tag exposure valid?
  4. Group By Check: Are required groupBy keys present?

State Machine Management​

Each Engagement can have multiple active state machines (when using groupByConfig):

{
"activeStateMachines": {
"user-123": {
"currentState": "1",
"lastTransitionAt": 1234567890,
"context": {"userId": "123"},
"createdAt": 1234567890
},
"user-456": {
"currentState": "2",
"lastTransitionAt": 1234567891,
"context": {"userId": "456"},
"createdAt": 1234567890
}
}
}

Engagement Expiration​

Engagement can expire:

{
"ctaValidTill": 1735689600000 // Unix timestamp
}

After expiration, the Engagement is no longer processed.

Reset on First Launch​

Reset Engagement state on first app launch:

{
"resetCTAonFirstLaunch": true
}

Useful for onboarding flows that should start fresh.

Best Practices​

  1. Unique Engagement IDs: Use descriptive, unique IDs
  2. Set Priorities: Use priorities to control order (lower number = higher priority)
  3. Limit Frequency: Always set frequency limits
  4. Use Grouping: Group when personalization is needed
  5. Set Expiration: Set expiration for time-sensitive Engagement
  6. Test Thoroughly: Test Engagement with different scenarios

Engagement Processing Flow​

Engagement Processing Flow

Next Steps​