Incentive Estimation


Overview

The Estimate Incentives tool lets you simulate what incentives would be awarded for a mock transaction — without saving any data. It is useful for verifying that rates and conditions are configured correctly before going live.


Where to Find It

The Estimate Incentives block appears automatically in the reaction builder when:

  • The reaction type is Trigger
  • The trigger event is transaction.created or transaction-item.created
  • At least one action is configured

Click Estimate incentives in the builder to open the estimation panel.


How to Use It

Fill in the mock transaction details, then click Estimate.

Transaction Fields

FieldRequiredDescription
Profile IDNoProfile identifier — can be ID, email, or any supported handle value. Omit to estimate without a specific profile
Profile ID HandleNoThe handle type for the identifier (e.g. email, card_pos). Leave empty to use the default profile ID lookup
LocationNoLocation to scope rate resolution
TotalYesTransaction total amount
Transacted AtYesTransaction datetime in YYYY-MM-DD HH:mm:ss format. Defaults to current time in your client_timezone setting
TimezoneYesTimezone for the transaction. Defaults to your client_timezone setting

Item Fields (one or more required)

FieldRequiredDescription
NameYesItem name
SKUNoProduct SKU
Product Variant SKUNoVariant SKU
Price SellYesSell price of the item
QuantityYesQuantity — supports negative values for returns (e.g. -1)
Price CurrentNoCurrent/RRP price of the item

Making an API Call

Endpoint: POST /transactions/incentive-estimate

Required scope: create-transactions

Request Body — with profile

{
  "trigger_id": 42,
  "profile_id": "[email protected]",
  "profile_id_handle": "email",
  "location_id": "10",
  "total": 150.00,
  "transacted_at": "2026-04-16 09:00:00",
  "timezone": "Australia/Melbourne",
  "items": [
    {
      "name": "Blue T-Shirt",
      "sku": "SHIRT-001",
      "price_sell": 75.00,
      "price_current": 99.00,
      "quantity": 2
    }
  ]
}

Request Body — without profile

Use this form to test rate rules and filters that do not depend on a specific profile's attributes or statuses.

{
  "trigger_id": 42,
  "location_id": "10",
  "total": 150.00,
  "transacted_at": "2026-04-16 09:00:00",
  "timezone": "Australia/Melbourne",
  "items": [
    {
      "name": "Blue T-Shirt",
      "sku": "SHIRT-001",
      "price_sell": 75.00,
      "price_current": 99.00,
      "quantity": 2
    }
  ]
}

Response

{
  "data": {
    "<action-uuid>": { ... }
  }
}

For transaction-item.created triggers, data is an array — one result object per line item:

{
  "data": [
    { "<action-uuid>": { ... } },
    { "<action-uuid>": { ... } }
  ]
}

Error Responses

StatusCondition
404trigger_id not found, or profile_id / location_id not found
422Validation failed (e.g. missing required fields), or trigger event is transaction-item.created but no items were provided

How It Works

  1. A POST is sent to transactions/incentive-estimate with the mock transaction payload
  2. The API builds an in-memory transaction from the provided data — nothing is written to the database
  3. The trigger identified by trigger_id is loaded with all its configured actions
  4. The actions are executed in dry-run mode (mock path) against the in-memory transaction context
  5. Each action computes its result without persisting any records; the results are collected and returned

Results by Trigger Type

  • transaction.created — actions run once against the whole transaction. Returns a single object keyed by action UUID.
  • transaction-item.created — actions run once per line item. Returns an array of result objects, one per item, in item order.

Example Result

{
  "data": {
    "abc-earn-points": {
      "value_initial": 150,
      "value_remaining": 150,
      "source_type": "transaction"
    }
  }
}

A filter action returns true if the condition passed, or false if the transaction would have been excluded.

If an action fails validation (e.g. missing a required argument in its configuration), its UUID key will contain a validation error object instead of a result.


Supported Actions

Only actions that implement dry-run execution are fully supported. The following actions support mock estimation:

ActionDry-run supported
Create PointYes
Create PointsYes
Create Tier PointYes
Create Tier PointsYes
Create Point With RateYes

Actions without a dedicated dry-run implementation fall back to their standard handle() logic wrapped in a database transaction that is always rolled back, so no data is persisted — but side effects such as external API calls or events may still fire.