Skip to main content
See also: Offers REST API reference for request/response shapes, status codes, and error semantics.
An Offer is the fundamental building block of KaireonAI. It represents something you can recommend to a customer — a product, a promotion, a message, or a next-best-action. Every time the Recommend API runs, it evaluates your active offers against a specific customer, filters out ineligible ones, scores the rest, and returns the best matches. If Decision Flows are the engine, Offers are the fuel. Offers belong to a Category (and optionally a sub-category), carry configuration for priority, business value, budget, and scheduling, and connect to Creatives that define the actual content delivered through each Channel.
Only offers with status: "active" are considered by Decision Flows. Draft and paused offers are excluded from all candidate selection.

How Offers Work at Runtime

When a Decision Flow executes via the Recommend API, every offer passes through these stages:

Common Use Cases


Priority and Business Value

Two fields control how aggressively an offer competes during scoring. They look similar but serve different purposes in the PRIE formula: Both are normalized to 0—1 at scoring time. Setting either to 0 eliminates the offer from PRIE scoring entirely (because PRIE is multiplicative).

Priority Bands

Business Value Example (Retail Rewards)

When in doubt, start with priority: 50 and businessValue: 50 (the defaults). Adjust after you see initial performance data in the Business Dashboard.

Status Lifecycle

Offers progress through a defined lifecycle:

Qualification Config

Control which customers are eligible to receive this offer via the eligibility object:

Budget Config

Set spend and impression limits via the budget object: Budget checking uses atomic Redis counter increments (with Prisma fallback) to prevent race conditions under concurrent load. When an offer’s budget is exhausted, it is automatically excluded from decisioning.
The budget_exhausted Contact Policy rule type can also enforce budget limits at the policy level.

Inventory Config

Track finite stock for an offer via the inventory object: When totalStock is set and remainingStock reaches 0, the offer is excluded from batch decisioning (inventory_out_of_stock), and in realtime decisioning its remaining stock feeds the Lagrangian ranking constraint the same way budget does. Recording a conversion for the offer atomically decrements remainingStock (serialized to prevent oversell). An offer with no totalStock is treated as unlimited.

Schedule Config

Restrict when an offer is eligible via the schedule object: Schedule filtering happens early in the pipeline (inventory stage) and applies to both regular and mandatory offers. An offer outside its schedule window is excluded regardless of priority or mandatory status.

Mandatory Governance

Marking an offer as mandatory: true activates a special runtime path for compliance-critical communications. Mandatory offers bypass decisioning gates, bypass suppression policies, and are lifted to the front of the ranking step regardless of their priority or model score. The lift is honored by all four ranking algorithms (topN, diversity, round_robin, explore_exploit) so the default diversity flow does not bury a mandatory regulatory notice in a low-traffic category.

Required Fields

When mandatory is true, the API enforces three governance fields: If any are missing, the API returns 400 Bad Request. Only users with the admin role can create or update mandatory offers.
Mandatory offers bypass decisioning gates and normal ranking. Use this only for regulatory or compliance-critical communications.
mandatoryExpiresAt is enforced both at save time and at decision time. It must be a future date when you save the offer, and once the timestamp passes, the decisioning runtime automatically treats the offer as non-mandatory — it falls back to normal eligibility/fit gating, contact policies, and ranking. You do not need to manually clear mandatory; the override self-retires at its expiry.

Example: Regulatory Disclosure

During the 30-day window, this offer scores 1.0 and appears above all regular recommendations, bypasses propensity thresholds and segment requirements, still respects the daily mandatory cap (default 5 per customer), and automatically stops after April 15.

Emergency Exclusions

The emergencyExcluded flag lets you instantly remove an offer from all recommendations without changing its status or modifying a Decision Flow. Designed for pricing errors, compliance issues, or product recalls. Set via API:
Set via UI: Open the offer detail page and click the Emergency Exclude button.
Emergency exclusion is a blunt instrument — it removes the offer from all channels, all placements, and all segments simultaneously. For targeted suppression (e.g., one channel only), use Contact Policies instead.

Creating an Offer

1

Navigate to Offers

Go to Studio > Offers in the sidebar.
2

Click + New Offer

Click the + New Offer button in the top-right corner.
3

Fill in basic info

Enter the offer name, description, and select a Category and sub-category.
4

Set priority and business value

Choose the priority level (Emphasis) and business value (Impact). Both default to 50.
5

Configure qualification (optional)

Set propensity thresholds, required segments, and recency rules.
6

Configure budget and schedule (optional)

Set impression caps, daily budget limits, start/end dates, and time windows.
7

Fill custom fields

Populate any custom fields defined by the parent category, including computed field formulas.
8

Save and activate

Save as draft, review, then set to active when ready.

Field Reference

Every field accepted by POST /api/v1/offers (create) and PUT /api/v1/offers (update):

API Quick Reference

Create

Response: 201 Created with the full offer object including generated id.

List

Supports optional query parameters: status, categoryId, tags.

Update

Send id in the request body along with the fields to update. Only provided fields are changed.

Delete

Returns 409 Conflict if the offer has creatives or interaction history. Add ?force=true to confirm permanent deletion.
Deleting an offer removes it permanently along with its creatives and interaction history. Consider archiving instead to preserve reporting integrity.

Next Steps

Channels

Define how your offers are delivered to customers.

Creatives

Create the content variants for each offer and channel.

Decision Flows

Build the pipeline that scores, filters, and ranks your offers.

Glossary

Look up key terms used across the platform.