# clix-personalization > Helps developers author and debug Clix personalization templates - Author: Hieu Ho - Repository: clix-so/skills - Version: 20260116144952 - Stars: 5 - Forks: 0 - Last Updated: 2026-02-06 - Source: https://github.com/clix-so/skills - Web: https://mule.run/skillshub/@@clix-so/skills~clix-personalization:20260116144952 --- --- name: clix-personalization display-name: Personalization short-description: Personalization templates description: Helps developers author and debug Clix personalization templates (Liquid-style) for message content, deep links/URLs, and audience targeting. Use when the user mentions personalization variables, Liquid, templates, conditional logic, loops, filters, deep links, message logs, or when the user types `clix-personalization`. user-invocable: true --- # Clix Personalization Use this skill to help developers write **personalized Clix campaigns** using template-based variables and light logic in: - **Message content** (title, body, subtitle) - **Links** (dynamic URL or deep link params) - **Audience targeting** (conditional include/exclude rules) ## What the official docs guarantee (high-signal) - **Data namespaces**: - `user.*` (user traits/properties) - `event.*` (event payload properties) - `trigger.*` (custom properties passed via API-trigger) - Device/system vars: `device.id`, `device.platform`, `device.locale`, `device.language`, `device.timezone`, plus `user.id`, `event.name` - **Missing variables** render as an **empty string**. - **Output**: print values with `{{ ... }}`. - **Conditionals**: `{% if %}`, `{% else %}`, `{% endif %}` with operators `== != > < >= <= and or not`. Invalid conditions evaluate to `false`. - **Loops**: `{% for x in y %}` / `{% endfor %}` (use guards for empty lists). - **Filters**: `upcase`, `downcase`, `capitalize`, `default`, `join`, `split`, `escape`, `strip`, `replace` (chain with `|`). - **Errors**: template rendering errors show up in **Message Logs**. ## MCP-first (source of truth) If the Clix MCP tools are available, treat them as the source of truth: - `clix-mcp-server:search_docs` for personalization behavior and supported syntax If MCP tools are not available, use the bundled references in `references/`. ## Workflow (copy + check off) ``` Personalization progress: - [ ] 1) Identify where the template runs (message / URL / audience rule) - [ ] 2) Identify trigger type (event-triggered vs API-triggered) - [ ] 3) Confirm available inputs (user.*, event.*, trigger.*, device.*) - [ ] 4) Draft templates with guards/defaults - [ ] 5) Validate template structure (balance tags, avoid missing vars) - [ ] 6) Verify in Clix (preview/test payloads, check Message Logs) ``` ## 1) Confirm the minimum inputs Ask only what’s needed: - **Where used**: title/body/subtitle vs URL/deep link vs audience targeting rule - **Campaign trigger**: - Event-triggered → `event.*` is available - API-triggered → `trigger.*` is available - **Inputs**: - Which `user.*` properties are set by the app - Which `event.*` / `trigger.*` properties are passed (include example payload) - **Fallback policy**: what to show when data is missing (default strings, guards) ## 2) Produce a “Template Plan” (before tweaking lots of templates) Return a compact table the user can approve: - **field** (title/body/url/audience) - **template** (Liquid) - **required variables** (and their source: user/event/trigger/device) - **fallbacks** (default filter and/or conditional guards) - **example payload** + **expected rendered output** ## 3) Authoring guidelines (what to do by default) - Prefer **simple variables + `default`** over complex branching. - Add **guards** for optional data and for arrays (`size > 0`) before looping. - Prefer **pre-formatted** properties from your app (e.g., `"7.4 miles"`, `"38m 40s"`) instead of formatting inside templates. - Keep logic minimal; complex branching belongs in the app or segmentation setup. ## 4) Validation (fast feedback loop) If you have a template file (recommended for review), run: ```bash bash /scripts/validate-template.sh path/to/template.liquid ``` This script does lightweight checks (matching `{% if %}`/`{% endif %}`, `{% for %}`/`{% endfor %}`, and brace balancing). It can’t guarantee the variables exist — you still need a payload + console verification. ## 5) Verification checklist - **Missing data**: does the template still read well with empty strings? - **Trigger type**: API triggers use `trigger.*` (not `event.*`). - **Message Logs**: check rendering errors and fix syntax issues first. - **Upstream data**: - If `user.*` is missing → fix user property setting (see `clix-user-management`) - If `event.*` is missing → fix event tracking payload (see `clix-event-tracking`) ## Progressive Disclosure - **Level 1**: This `SKILL.md` (always loaded) - **Level 2**: `references/` (load when writing/debugging templates) - **Level 3**: `scripts/` (execute directly, do not load into context) ## References - `references/template-syntax.md` - Variables, output, conditionals, loops, filters - `references/common-patterns.md` - Copy/paste patterns for messages + URLs + guards - `references/debugging.md` - Troubleshooting missing variables and Message Logs