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.createdortransaction-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
| Field | Required | Description |
|---|---|---|
| Profile ID | No | Profile identifier — can be ID, email, or any supported handle value. Omit to estimate without a specific profile |
| Profile ID Handle | No | The handle type for the identifier (e.g. email, card_pos). Leave empty to use the default profile ID lookup |
| Location | No | Location to scope rate resolution |
| Total | Yes | Transaction total amount |
| Transacted At | Yes | Transaction datetime in YYYY-MM-DD HH:mm:ss format. Defaults to current time in your client_timezone setting |
| Timezone | Yes | Timezone for the transaction. Defaults to your client_timezone setting |
Item Fields (one or more required)
| Field | Required | Description |
|---|---|---|
| Name | Yes | Item name |
| SKU | No | Product SKU |
| Product Variant SKU | No | Variant SKU |
| Price Sell | Yes | Sell price of the item |
| Quantity | Yes | Quantity — supports negative values for returns (e.g. -1) |
| Price Current | No | Current/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
| Status | Condition |
|---|---|
404 | trigger_id not found, or profile_id / location_id not found |
422 | Validation failed (e.g. missing required fields), or trigger event is transaction-item.created but no items were provided |
How It Works
- A
POSTis sent totransactions/incentive-estimatewith the mock transaction payload - The API builds an in-memory transaction from the provided data — nothing is written to the database
- The trigger identified by
trigger_idis loaded with all its configured actions - The actions are executed in dry-run mode (
mockpath) against the in-memory transaction context - 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
filteraction returnstrueif the condition passed, orfalseif 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:
| Action | Dry-run supported |
|---|---|
| Create Point | Yes |
| Create Points | Yes |
| Create Tier Point | Yes |
| Create Tier Points | Yes |
| Create Point With Rate | Yes |
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.
Updated 10 days ago
