home / skills / clix-so / 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-campaignsReview the files below or copy the command above to add this skill to your agents.
---
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`
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.
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.
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.