Skip to main content

Overview

A creative is a content variant that defines how a specific offer is rendered on a specific channel. Creatives contain the actual messaging — subject lines, headlines, body copy, images, and calls-to-action — along with personalization variables and A/B test configuration. Each creative links one offer to one channel, allowing the same offer to have different presentations across email, push, web, and other delivery mechanisms.

Field Reference

FieldTypeRequiredDefaultDescription
namestringYesInternal name for the creative (1–255 chars)
offerIdstringYesThe offer this creative presents
channelIdstringYesThe channel this creative is delivered through
placementIdstringNonullOptional placement slot within the channel
statusenumNo"draft"Lifecycle status: draft, active, paused, archived
templateTypestringNo"email_html"Content format template (see Template Types below)
contentobjectNo{}The actual content payload (subject, headline, body, etc.)
personalizationarrayNo[]Dynamic variable substitutions (up to 500 items)
constraintsobjectNo{}Frequency caps, cooldown periods, and delivery constraints
abTestVariantstringNonullA/B test variant assignment (e.g., "control", "variant_a", "variant_b")
weightintegerNo100Traffic allocation weight for the variant (0–100)
metricsobjectNo{}Performance metrics (impressions, clicks, conversions)

Template Types

TypeChannelDescription
email_htmlEmailFull HTML email template
email_textEmailPlain text email fallback
push_notificationPushTitle + body + optional image
sms_textSMSPlain text message (160 char recommended)
in_app_bannerIn-AppBanner with image, headline, CTA
in_app_modalIn-AppFull-screen modal overlay
in_app_cardIn-AppCard-style recommendation
web_bannerWebWebsite banner ad
web_overlayWebPopup/overlay
webhook_payloadWebhookCustom JSON payload
whatsapp_templateWhatsAppWhatsApp Business template

Content Object

The content object varies by template type, but common fields include:
{
  "subject": "You're pre-approved for our Premium Card",
  "headline": "Upgrade to 3x Rewards",
  "body": "Hi {{first_name}}, based on your spending patterns...",
  "imageUrl": "https://cdn.example.com/premium-card.png",
  "ctaText": "Apply Now",
  "ctaUrl": "https://example.com/apply?offer={{offer_id}}",
  "deepLink": "myapp://offers/premium-card"
}
FieldDescription
subjectEmail subject line or notification title
headlinePrimary heading text
bodyMain message body (supports {{variable}} placeholders)
imageUrlURL to hero image or thumbnail
ctaTextCall-to-action button text
ctaUrlClick-through destination URL
deepLinkMobile app deep link URI

Personalization Variables

Personalization variables inject dynamic values into the content at delivery time:
{
  "personalization": [
    {
      "variable": "first_name",
      "source": "customer.first_name",
      "fallback": "Valued Customer"
    },
    {
      "variable": "offer_rate",
      "source": "computed.personalized_rate",
      "fallback": "competitive"
    },
    {
      "variable": "offer_id",
      "source": "offer.id",
      "fallback": ""
    }
  ]
}
FieldDescription
variablePlaceholder name used in content (referenced as {{variable}})
sourceData source path — customer.*, computed.*, offer.*, or attributes.*
fallbackDefault value if the source is null or unavailable
Use computed.* sources to inject dynamic computed values like personalized rates or custom pricing into creative content.

A/B Test Variants

Creatives support A/B testing by assigning each creative a variant label and traffic weight:
VariantDescription
controlThe baseline creative (existing or default content)
variant_aFirst test variant
variant_bSecond test variant
Traffic is split according to the weight field on each creative. Weights are relative — if control has weight 50 and variant_a has weight 50, traffic is split 50/50.
[
  { "name": "Email v1 - Control", "abTestVariant": "control", "weight": 50 },
  { "name": "Email v1 - New CTA", "abTestVariant": "variant_a", "weight": 30 },
  { "name": "Email v1 - Short Copy", "abTestVariant": "variant_b", "weight": 20 }
]

A/B Variant Weight Resolution

At runtime, the decision engine normalizes variant weights to select which creative a customer sees:
  1. Collection — All active creatives for the same offer + channel are grouped.
  2. Normalization — Weights are summed and each creative’s probability is calculated as weight / totalWeight. For the example above: control = 50/100 (50%), variant_a = 30/100 (30%), variant_b = 20/100 (20%).
  3. Selection — A deterministic hash of the customer ID is used to pick a variant, ensuring the same customer always sees the same creative across requests.
  4. Fallback — If no abTestVariant is set, the creative is treated as a standalone (no A/B split). If all weights are 0, each creative receives equal probability.
A/B test results are analyzed in the Algorithms module under Experiments. KaireonAI calculates statistical significance using z-tests on conversion rates.

Constraints

FieldTypeDescription
frequencyCapnumberMaximum total impressions of this creative per customer
cooldownHoursnumberMinimum hours between consecutive impressions to the same customer
These creative-level constraints work alongside contact policies which apply broader rules across offers, channels, and categories. Once your creatives are configured, set up qualification rules to control which customers are eligible to see them.

Creating a Creative

1

Navigate to Creatives

Go to Studio > Creatives in the sidebar.
2

Click Create Creative

Click the + New Creative button.
3

Select offer and channel

Choose the offer this creative presents and the channel it will be delivered through. Optionally select a placement slot.
4

Choose template type

Select the appropriate template type for the channel (e.g., email_html for email, push_notification for push).
5

Write content

Fill in the content fields: subject, headline, body, image URL, CTA text, and CTA URL. Use {{variable}} placeholders for dynamic content.
6

Configure personalization

Add personalization variables that map placeholders to data sources with fallback values.
7

Set A/B variant (optional)

If running an experiment, assign a variant role (control, variant_a, variant_b) and traffic weight.
8

Set constraints (optional)

Configure frequency cap and cooldown hours for this creative.
9

Save

Save the creative. It is available for use in Decision Flows immediately.

API Reference

Create a Creative

POST /api/v1/creatives
Content-Type: application/json
Request body:
{
  "name": "Premium Card - Email HTML",
  "offerId": "act_abc123",
  "channelId": "ch_mktg_email",
  "placementId": "pl_header",
  "status": "active",
  "templateType": "email_html",
  "content": {
    "subject": "You're pre-approved, {{first_name}}!",
    "headline": "Upgrade to 3x Rewards",
    "body": "Based on your spending of {{monthly_spend}}, you qualify for our Premium Card at {{offer_rate}}% APR.",
    "imageUrl": "https://cdn.example.com/premium-card.png",
    "ctaText": "Apply Now",
    "ctaUrl": "https://example.com/apply?offer={{offer_id}}"
  },
  "personalization": [
    { "variable": "first_name", "source": "customer.first_name", "fallback": "Valued Customer" },
    { "variable": "monthly_spend", "source": "customer.avg_monthly_spend", "fallback": "" },
    { "variable": "offer_rate", "source": "computed.personalized_rate", "fallback": "19.99" },
    { "variable": "offer_id", "source": "offer.id", "fallback": "" }
  ],
  "abTestVariant": "control",
  "weight": 60,
  "constraints": {
    "frequencyCap": 3,
    "cooldownHours": 72
  }
}
Response (201 Created):
{
  "id": "crv_xyz789",
  "name": "Premium Card - Email HTML",
  "offerId": "act_abc123",
  "channelId": "ch_mktg_email",
  "placementId": "pl_header",
  "status": "active",
  "templateType": "email_html",
  "abTestVariant": "control",
  "weight": 60,
  "constraints": {
    "frequencyCap": 3,
    "cooldownHours": 72
  },
  "createdAt": "2026-03-10T14:30:00Z",
  "updatedAt": "2026-03-10T14:30:00Z"
}

List Creatives

GET /api/v1/creatives
Filter by offerId or channelId using query parameters.

Update a Creative

PUT /api/v1/creatives/:id

Delete a Creative

DELETE /api/v1/creatives/:id

Next Steps

Offers

Define the offers that creatives present to customers.

Channels

Configure the delivery mechanisms for your creatives.

Qualification Rules

Control who is eligible to receive each offer.

Decision Flows

Build pipelines that select and rank creatives for delivery.