Intelligence

Our billing analytics system provides comprehensive tracking across all billing-related user interactions. The system is designed to handle any type of billing flow, whether it's a traditional paywall, an in-product upgrade prompt, or a multi-page checkout process.

Every trial expiration is an opportunity to convert users into paying customers. But tracking user behavior across paywall redirects creates blind spots in your analytics. How many users hit your pricing page? Which plans drive the most conversions? What's your true upgrade rate?

Analytics Black Hole

Plandalf connects these dots, giving you a complete picture of your upgrade funnel. Track every user interaction from the moment they hit your paywall through their conversion journey. Test different pricing tiers, monitor revenue impact, and optimize your upgrade path - all without touching your codebase.

Plandalf Intelligence

Most importantly, you'll understand exactly how users respond to your pricing. See which packages resonate with different user segments, measure the impact of pricing changes, and attribute every dollar of revenue to specific workflows. Turn your paywall into a conversion engine backed by data.

Track Your Upgrade Journey Implement complete funnel tracking in minutes. Just add these events to your upgrade flow to capture the full user journey from trial expiration through successful conversion.

Upgrade Flow

Events

Entry Event

The entry event marks the beginning of a potential billing interaction. It tracks when and why users encounter billing-related interfaces.

Example Usage

javascript
// User is entering the 'upgrade-button' workflow
plandalf.intel.action('entry', {
  flow: "upgrade-button",
});

Attributes

NameTypeRequiredExampleDescription
flowstringusage-upgradeIdentifies the billing workflow flow the user has entered
placementstringeditor-overlayWhere in your application the entry point appears
scenariostringfirst-timeThe variant of the flow shown to this user based on their context
elementstringpro-features-wallA reference of the specific UI element where the entry occurred
restrictionobjectsee belowOptional context about why the user encountered this billing interface

Restriction Object

NameTypeRequiredExampleDescription
reasonenumusage_limitWhy the billing interface is being shown. (gate, usage, geo, rate, seat, lockout, segment, offer)
messagestring"You've reached your template limit"The user-facing message explaining the restriction
currentnumber45Current value (e.g., templates used). Required for usage-based restrictions
limitnumber50Maximum allowed value. Required for usage-based restrictions
stepnumber2Progress indicator for multi-step flows. Starts at 1
entitlementstringtemplatesThe specific feature or capability being restricted

Common Examples

User hits Usage Limit

javascript
plandalf.intel.action('entry', {
  flow: "template-editor",
  scenario: "free-user",
  element: "usage-wall",
  restriction: {
    reason: "usage_limit",
    message: "You've reached your monthly template limit",
    current: 45,
    limit: 50,
    entitlement: "templates"
  },
  placement: "editor-overlay"
});

User hits a Feature Gate

javascript
plandalf.intel.action('entry', {
  flow: "team-settings",
  scenario: "single-user",
  element: "invite-wall",
  restriction: {
    reason: "gate",
    message: "Upgrade to invite team members",
    entitlement: "team_seats"
  },
  placement: "settings-page"
});

Start Event

The start event indicates user intent to proceed with a billing action. It marks the transition from just viewing to actively engaging with the checkout process.

If you have previously identified the flow in the entry event, it is not required for all consecutive actions.

Example Usage

javascript
plandalf.intel.action('start');

Attributes

NameTypeRequiredExampleDescription
elementstringupgrade-ctaReferences the specific UI element that initiated the start action

Common Examples

Starting from a Paywall

javascript
plandalf.intel.action('start', {
  flow: "template-editor",
  scenario: "usage-limit",
  element: "see-plans-button"
});

Starting from Settings

javascript
plandalf.intel.action('start', {
  flow: "team-settings",
  scenario: "expansion",
  element: "add-seats-button"
});

Cancel Event

The cancel event tracks when a user exits out of a started workflow.

This will stop the tracking of the current billing activity.

Example Usage

javascript
plandalf.intel.action('cancel', {
  type: "unload",
  reason: "user_exit",
  flow: "usage-upgrade",
  scenario: "first-time"
});

Attributes

NameTypeRequiredExampleDescription
typeenumunloadHow the cancellation occurred (unload, close, navigate)
reasonstringuser_exitWhy the flow was cancelled
elementstringclose-buttonUI element that triggered the cancellation

Common Examples

User Navigation

javascript
plandalf.intel.action('cancel', {
  type: "navigate",
  reason: "user_exit",
  flow: "template-editor",
  scenario: "usage-limit",
  element: "header-logo"
});

Payment Failure

javascript
plandalf.intel.action('cancel', {
  type: "close",
  reason: "transaction_failed",
  flow: "team-settings",
  scenario: "expansion",
  element: "modal-close"
});

Complete Event

The complete event indicates successful completion of a billing workflow.

Example Usage

javascript
plandalf.intel.action('complete', {
  result: "transaction_successful",
  flow: "usage-upgrade",
  scenario: "first-time"
});

Attributes

NameTypeRequiredExampleDescription
resultstringtransaction_successful"The outcome of the workflow

Common Examples

Successful Purchase

javascript
plandalf.intel.action('complete', {
  result: "transaction_successful",
  flow: "team-settings",
  scenario: "expansion"
});

Comparison Event

The comparison event tracks when users view or interact with plan comparison interfaces.

Example Usage

javascript
plandalf.intel.action('comparison', {
  element: "upgrade-today-grid",
  renew_interval: "P1Y",
  currency: "AUD",
  variant_filters: {
    billing: "annual",
    team_size: "small"
  },
  selection: [
    {
      type: "plan",
      id: "pro_yearly",
      quantity: 1
    }
  ]
});

Attributes

NameTypeRequiredExampleDescription
elementstringupgrade-today-gridIdentifies the comparison interface being viewed
renew_intervalstringP1YISO 8601 duration format for billing period
currencystringAUDThree-letter ISO currency code
variant_filtersobject{billing: "annual"}Key-value pairs of active filters
selectionarraysee belowCurrently selected items in the comparison

Selection Object

NameTypeRequiredExampleDescription
typeenumplanType of item (plan)
idstringpro_yearlyIdentifier of the item
quantitynumber1Number of units selected

Error Event

The error event captures any issues that occur during the billing flow.

Example Usage

javascript
plandalf.intel.action('error', {
  message: "Payment verification failed",
  reason: "card_declined",
  flow: "usage-upgrade",
  scenario: "first-time"
});

Attributes

NameTypeRequiredExampleDescription
messagestring"Payment verification failed"User-facing error message
reasonstringcard_declinedTechnical reason for the error

Preauthorize Event

The preauthorize event tracks when users add new payment methods.

Example Usage

javascript
plandalf.intel.action('preauthorize', {
  id: "pm_xxxxx",
  flow: "usage-upgrade",
  scenario: "first-time"
});

Attributes

NameTypeRequiredExampleDescription
idstringpm_xxxxxPayment method identifier

Interaction Event

The interaction event captures user interactions with billing flows that don't fit other categories.

Example Usage

javascript
plandalf.intel.action('interaction', {
  scene: "pricing-page",
  element: "currency-selector",
  value: "EUR",
  flow: "usage-upgrade",
  scenario: "first-time"
});

Attributes

NameTypeRequiredExampleDescription
scenestringpricing-pageThe context where the interaction occurred
elementstringcurrency-selectorSpecific element interacted with
valueanyEURAny relevant value associated with the interaction

Transaction Event

The transaction event records purchase attempts and completions.

Example Usage

javascript
plandalf.intel.action('transaction', {
  id: "checkout_123",
  items: [
    {
      id: "plan_xxx",
      quantity: 12
    }
  ],
  renew_interval: "P1M",
  currency: "USD",
  variant_filters: {
    billing: "monthly",
    region: "na"
  },
  intent: "upgrade",
  flow: "usage-upgrade",
  scenario: "first-time"
});

Attributes

NameTypeRequiredExampleDescription
idstringcheckout_123Unique identifier for this transaction
itemsarraysee belowList of items in the transaction
renew_intervalstringP1MISO 8601 duration format
currencystringUSDThree-letter ISO currency code
variant_filtersobject{billing: "monthly"}Key-value pairs affecting pricing
intentstringupgradePurpose of the transaction

Transaction Item

NameTypeRequiredExampleDescription
idstringplan_xxxItem identifier
quantitynumber12Number of units

Custom Event

The custom event allows tracking of any additional billing-related interactions.

Example Usage

javascript
plandalf.intel.action('custom', {
  type: "feature_comparison",
  feature: "api_access",
  duration_ms: 5000,
  flow: "usage-upgrade",
  scenario: "first-time"
});

Attributes

Custom events accept any attributes, but it's recommended to:

  • Include standard fields (flow, scenario) when applicable
  • Use consistent naming conventions
  • Document custom event schemas for your team