Skip to main content

Overview

You organize your offers into a business hierarchy — a two-level structure of categories (top-level groupings) and sub-categories (nested beneath them). This hierarchy provides logical organization, drives custom field schemas, and enables category-level rules and reporting.

Categories

A category represents a top-level business domain or product line (e.g., “Credit Cards”, “Personal Loans”, “Insurance Products”).

Field Reference

FieldTypeRequiredDefaultDescription
namestringYesDisplay name of the category (1–255 chars)
descriptionstringNo""Optional description
iconstringNo""Icon identifier for the UI
colorstringNo"blue"Color preset for visual distinction
statusenumNo"active"Lifecycle status: draft, active, paused, archived
ordinalintegerNo0Display order position (min 0)
customFieldsarrayNo[]Schema definition for fields on offers in this category (up to 500 items)

Custom Fields

Categories define a custom field schema that applies to all offers within the category. Each custom field has:
PropertyTypeDescription
namestringField identifier (used as key in offer data)
labelstringDisplay label in the UI
typeenumField type
requiredbooleanWhether the field must be filled
optionsstring[]Choices for select type fields
formulastringFormula expression for computed type fields
outputTypeenumOutput data type for computed fields: number or text

Custom Field Types

TypeDescriptionExample
textFree-text stringProduct description, internal notes
numberInteger valuePoints multiplier, term length
selectSingle choice from optionsRisk tier, product variant
booleanTrue/false togglePre-approved flag, promotional
dateDate valueEffective date, review date
computedFormula-evaluated at decision timePersonalized rate, dynamic discount
Computed fields are the foundation of dynamic computed values. They let you define formulas like base_rate * (1 - customer.loyalty_score * 0.01) that are evaluated per customer at decision time.

Computed Field Formulas

Computed fields use the formula engine with three variable namespaces:
NamespaceSourceExample
(bare name)Other custom field values on the offerbase_rate, annual_fee
customer.*Enriched data from schema tablescustomer.loan_amount, customer.credit_score
attributes.*Request-time attributes from the Recommend APIattributes.tier, attributes.channel

Formula Examples

1. Personalized interest rate — discount based on loyalty score:
Name: personalized_rate
Formula: base_rate * (1 - customer.loyalty_score * 0.01)
Output Type: number
If base_rate is 12.5 and customer.loyalty_score is 80, the result is 12.5 * (1 - 0.8) = 2.5. 2. Dynamic credit limit — capped at 3x income with a floor:
Name: credit_limit
Formula: max(min(customer.annual_income * 3, 50000), 5000)
Output Type: number
Uses the min and max functions to ensure the limit stays between 5,000 and 50,000. 3. Tiered welcome bonus — conditional on customer tier:
Name: welcome_bonus
Formula: customer.credit_score >= 750 ? 500 : customer.credit_score >= 650 ? 250 : 100
Output Type: number
Uses nested ternary expressions: customers with excellent credit get 500, good credit get 250, and everyone else gets 100. 4. Formatted offer label — concatenated string:
Name: offer_label
Formula: concat(attributes.channel, " - ", coalesce(customer.preferred_name, "Customer"))
Output Type: text
Uses concat to build a string and coalesce to fall back if the preferred name is null.
See the Formula Reference for the complete list of supported operators and functions (min, max, round, abs, coalesce, concat, ternary). In the Composable Pipeline, the Compute node also evaluates these formulas.

Computed Field Validation

When you create or update a category with computed fields, KaireonAI validates:
  1. Formula is present — a computed field must have a non-empty formula string.
  2. Output type is validoutputType must be "number" or "text".
  3. Syntax check — click Validate in the UI to parse the formula and catch syntax errors before saving.

Sub-Categories

Sub-categories provide a second level of grouping beneath a category (e.g., “Premium Cards” and “Travel Cards” under “Credit Cards”).

Sub-Category Fields

FieldTypeDescription
namestringDisplay name
descriptionstringOptional description
categoryIdstringParent category ID
ordinalnumberDisplay order within the parent category
With your hierarchy in place, you can create offers within it. Before doing so, understand how deletions cascade through the hierarchy.

Cascade Behavior

Deleting a category will cascade-delete all its sub-categories. However, offers are unlinked (their categoryId and subCategoryId are set to null) rather than deleted, preserving historical data and interaction history.
Deleting a sub-category unlinks its offers in the same way — offers are preserved but lose their sub-category association. Here is a summary of what happens at each level:
ActionSub-CategoriesOffersCreativesDecision Traces
Delete a CategoryCascade-deletedUnlinked (categoryId set to null)Unaffected (linked to offers, not categories)Preserved with original category ID
Delete a Sub-CategoryN/AUnlinked (subCategoryId set to null)UnaffectedPreserved with original sub-category ID
Because offers are unlinked rather than deleted, you will not lose any historical decision traces, outcomes, or experiment data when reorganizing your hierarchy.

Creating a Category

1

Navigate to Business Hierarchy

Go to Studio > Business Hierarchy in the sidebar.
2

Click Create Category

Click the + New Category button.
3

Fill in category details

Enter the name, description, icon, and color.
4

Define custom fields

Add custom fields that will apply to all offers in this category. For each field, specify the name, label, type, and whether it is required.
5

Add computed fields (optional)

For computed fields, enter the formula expression and select the output type (number or text). Click Validate to check the formula syntax before saving.
6

Save

Save the category. It is immediately available for creating offers and sub-categories.

Creating a Sub-Category

1

Select parent category

In the Business Hierarchy view, click on the category you want to add a sub-category to.
2

Click Add Sub-Category

Click the + Sub-Category button within the category detail panel.
3

Fill in details

Enter the sub-category name and optional description.
4

Save

Save the sub-category. It appears nested under its parent category.

API Reference

Create a Category

POST /api/v1/categories
Content-Type: application/json
Request body:
{
  "name": "Personal Loans",
  "description": "Personal lending products",
  "icon": "banknotes",
  "color": "blue",
  "status": "active",
  "ordinal": 2,
  "customFields": [
    { "name": "base_rate", "label": "Base APR", "type": "number", "required": true },
    { "name": "term_months", "label": "Term (Months)", "type": "number", "required": true },
    { "name": "min_credit_score", "label": "Min Credit Score", "type": "number", "required": false },
    {
      "name": "personalized_rate",
      "label": "Personalized Rate",
      "type": "computed",
      "formula": "base_rate * (1 - customer.loyalty_score * 0.01)",
      "outputType": "number"
    },
    {
      "name": "credit_limit",
      "label": "Dynamic Credit Limit",
      "type": "computed",
      "formula": "max(min(customer.annual_income * 3, 50000), 5000)",
      "outputType": "number"
    }
  ]
}
Response (201 Created):
{
  "id": "cat_personal_loans",
  "name": "Personal Loans",
  "description": "Personal lending products",
  "icon": "banknotes",
  "color": "blue",
  "status": "active",
  "ordinal": 2,
  "customFields": [ ... ],
  "createdAt": "2026-03-10T14:30:00Z",
  "updatedAt": "2026-03-10T14:30:00Z"
}

Create a Sub-Category

POST /api/v1/categories/:categoryId/sub-categories
Content-Type: application/json
{
  "name": "Debt Consolidation",
  "description": "Loans for consolidating existing debt",
  "ordinal": 1
}

List Categories

GET /api/v1/categories
Returns all categories with their sub-categories and custom field schemas.

Delete a Category

DELETE /api/v1/categories/:id
This cascade-deletes all sub-categories and unlinks all offers. This action cannot be undone.

Next Steps

Offers

Create offers within your categories.

Computed Values

Full guide to dynamic computed values and formula syntax.

Formula Reference

Complete operator and function reference for the formula engine.

Composable Pipeline

Use the Compute node to evaluate formulas at decision time.