home / skills / clix-so / skills / api-triggered-campaigns

api-triggered-campaigns skill

/skills/api-triggered-campaigns

This skill helps developers configure and trigger API-triggered campaigns in Clix from backend services with safe auth and dynamic personalization.

npx playbooks add skill clix-so/skills --skill api-triggered-campaigns

Review the files below or copy the command above to add this skill to your agents.

Files (11)
SKILL.md
6.8 KB
---
name: clix-api-triggered-campaigns
display-name: API-Triggered Campaigns
short-description: API-triggered campaign setup
description: Helps developers configure API-triggered campaigns in the Clix console and
  trigger them from backend services with safe auth, payload schemas, dynamic
  audience filters (trigger.*), and personalization best practices. Use when the
  user mentions transactional notifications, backend-triggered sends,
  campaign_id trigger APIs, or "API-triggered campaigns".
user-invocable: true
---

# API-Triggered Campaigns (Backend → Clix)

Use this skill to set up **API-triggered campaigns** in the Clix console and
trigger them from your backend with dynamic data (`trigger.*`) for:

- Transactional notifications (orders, password reset, receipts)
- Workflow messages (assignments, approvals)
- System alerts (moderation, support tickets)
- Programmatic sends where marketers/ops should control content + targeting

## What the official docs guarantee (high-signal)

- API-triggered campaigns are configured in the console, then triggered via:
  `POST /api/v1/campaigns/{campaign_id}:trigger`
- Authentication uses **secret** headers:
  - `X-Clix-Project-ID`
  - `X-Clix-API-Key`
- Request `properties` become **`trigger.*`** for:
  - **Dynamic audience filtering** (console audience rules)
  - **Personalization** in templates (title/body/deep links)
- `audience.broadcast=true` sends to all users eligible under the campaign’s
  segment definition; `audience.targets` narrows to specific users/devices
  (still filtered by the segment definition).
- Dynamic audience filters are intentionally constrained for performance: **max
  3 attributes** in the audience definition.

## MCP-first (source of truth)

If Clix MCP tools are available, treat them as the **source of truth**:

- Use `clix-mcp-server:search_docs` to confirm the latest API contract + limits:
  - query examples:
    - `"API-triggered campaign trigger endpoint"`
    - `"campaigns/{campaign_id}:trigger audience targets broadcast"`
    - `"trigger.* dynamic audience filters limitations"`

If MCP tools are not available, use the bundled references:

- API contract → `references/api-contract.md`
- Console setup + dynamic filters → `references/console-setup.md`
- Backend patterns (auth, retries, timeouts) → `references/backend-patterns.md`
- Security/key handling → `references/security-and-keys.md`
- Personalization + dynamic filters →
  `references/personalization-and-dynamic-filters.md`
- Debugging checklist → `references/debugging.md`

## Workflow (copy + check off)

```
API-triggered campaign progress:
- [ ] 1) Confirm goals + trigger source (what backend event sends the message?)
- [ ] 2) Define campaign contract (properties keys/types; PII policy)
- [ ] 3) Configure campaign in console (API-triggered + audience rules + templates)
- [ ] 4) Implement backend trigger wrapper (auth, timeout, retries, logging)
- [ ] 5) Validate trigger plan JSON (schema + naming + safety)
- [ ] 6) Verify in Clix (test payloads, Message Logs, segment matching)
```

## 1) Confirm the minimum inputs

Ask only what’s needed:

- **Campaign**: where is it in the console? do you already have `campaign_id`?
- **Channel**: push / in-app / email / etc. (affects message template fields)
- **Audience mode**: broadcast vs explicit targets
- **Dynamic filter keys**: which `trigger.*` keys are used in audience rules
- **Properties**: list of keys + types + example values (avoid PII by default)
- **Backend**: runtime and HTTP client (Node/Fetch, Axios, Python, Go, etc.)

## 2) Create a “Trigger Plan” (before touching backend code)

Create `api-trigger-plan.json` in `.clix/` (recommended) or project root.

**Recommended location**: `.clix/api-trigger-plan.json`

**Plan schema (high-level):**

- `campaign_id` (string)
- `audience.mode`: `"broadcast" | "targets" | "default"`
- `audience.targets` (if mode is `"targets"`)
- `dynamic_filter_keys` (array of up to 3 snake_case keys)
- `properties` (map of snake_case keys → `{ type, required?, example?, pii? }`)

Example:

```json
{
  "campaign_id": "019aa002-1d0e-7407-a0c5-5bfa8dd2be30",
  "audience": {
    "mode": "broadcast"
  },
  "dynamic_filter_keys": ["store_location"],
  "properties": {
    "store_location": {
      "type": "string",
      "required": true,
      "example": "San Francisco"
    },
    "order_id": { "type": "string", "required": true, "example": "ORD-12345" },
    "item_count": { "type": "number", "required": true, "example": 3 },
    "pickup_time": { "type": "string", "required": false, "example": "2:30 PM" }
  }
}
```

## 3) Configure campaign in the console (API-triggered)

- Set the campaign type to **API-Triggered**.
- Build audience rules using `{{ trigger.* }}` for dynamic filters.
- Use `{{ trigger.* }}` in message templates + deep links.

See: `references/console-setup.md` for exact guidance and limitations.

## 4) Implement backend trigger wrapper (best practices)

Backend wrapper responsibilities:

- **Auth**: load `X-Clix-Project-ID` and `X-Clix-API-Key` from
  environment/secret store (never commit).
- **Timeout**: set a short timeout (e.g., 3–10s) and fail fast.
- **Retries**: retry only on transient failures (network/5xx), with backoff; do
  not retry blindly on 4xx.
- **Dedupe**: prevent double-sends in your system (e.g., unique key per order
  event) since the API call is “send-like”.
- **Logging**: log `campaign_id`, your correlation id (order id), and the Clix
  response (e.g., `trigger_id`).

Copy/paste examples:

- Node: `examples/trigger-campaign-node.js`
- Python: `examples/trigger-campaign-python.py`

## 5) Validate the plan (fast feedback loop)

Run:

```bash
bash <skill-dir>/scripts/validate-api-trigger-plan.sh .clix/api-trigger-plan.json
```

This validator checks:

- valid JSON
- `campaign_id` present
- `dynamic_filter_keys` is ≤ 3 and snake_case
- `properties` keys are snake_case and have valid types
- example values match declared types
- `targets` entries specify exactly one of `project_user_id` or `device_id`

## 6) Verify (Clix + end-to-end)

Minimum verification:

- Campaign is **API-Triggered** and `campaign_id` matches.
- If using dynamic audience filters, the `trigger.*` keys exist in the API call
  and match audience rules exactly.
- Trigger once with a known-good payload; confirm delivery + inspect Message
  Logs for rendering errors.

See `references/debugging.md`.

## Progressive Disclosure

- **Level 1**: This `SKILL.md` (always loaded)
- **Level 2**: `references/` (load when implementing details)
- **Level 3**: `examples/` (load when copy/pasting backend code)
- **Level 4**: `scripts/` (execute directly; do not load into context)

## References

- `references/api-contract.md`
- `references/console-setup.md`
- `references/backend-patterns.md`
- `references/security-and-keys.md`
- `references/personalization-and-dynamic-filters.md`
- `references/debugging.md`

Overview

This skill helps developers configure API-triggered campaigns in the Clix console and implement safe backend triggers. It guides plan creation, dynamic audience filters (trigger.*), authentication handling, payload schemas, and verification steps to run reliable transactional and workflow sends.

How this skill works

The skill defines a Trigger Plan (api-trigger-plan.json) that lists campaign_id, audience mode, dynamic_filter_keys (≤3) and typed properties. It maps request properties to trigger.* for audience filtering and template personalization, and provides backend wrapper patterns (auth via X-Clix-Project-ID/X-Clix-API-Key, timeouts, retries, dedupe, logging) plus validation and verification steps.

When to use it

  • Sending transactional notifications from your backend (orders, receipts, password resets).
  • Triggering workflow or system alerts programmatically with marketer-controlled templates.
  • When you need dynamic audience filtering based on event properties (trigger.*).
  • Implementing safe, auditable backend sends with retries, timeouts, and dedupe.
  • When you must validate payload schemas and avoid sending PII inadvertently.

Best practices

  • Create a .clix/api-trigger-plan.json before coding to lock down keys, types, and audience mode.
  • Load X-Clix-Project-ID and X-Clix-API-Key from a secrets store; never commit keys.
  • Limit dynamic_filter_keys to at most three snake_case attributes for performance.
  • Use short timeouts (3–10s), retry only on transient errors (network/5xx), and avoid retrying on 4xx.
  • Log campaign_id, your correlation id, and Clix responses; implement idempotency to prevent double-sends.

Example use cases

  • Order confirmation: backend sends order_id, item_count, and store_location; store_location used in dynamic audience rules.
  • Password reset: trigger an immediate single-user send using audience.targets with project_user_id.
  • Moderation alert: send system notifications to users in a specific region using trigger.region as a dynamic filter.
  • Marketing ops control: developers trigger content that marketers update in the console without code changes.

FAQ

What headers authenticate trigger calls?

Include X-Clix-Project-ID and X-Clix-API-Key from your secret store in the request headers.

How many dynamic filter keys can I use?

Audience dynamic filters are limited to a maximum of three trigger.* attributes for performance reasons.

When should I use broadcast vs targets?

Use broadcast to send to all users who match the campaign segment; use targets to address specific project_user_id or device_id entries while still honoring segment rules.