# Campaign Tag

> Event Planner Emily builds and validates a canonical campaign tag (slug) in UTM-parameter format. The slug is <utm_source>_<utm_medium>_<utm_campaign>_<utm_content>: lowercase, underscores between the four UTM params, hyphens within a multi-word token (e.g. instagram_dm_goom-gum_ticket-sale, sms_text_goom-gum_free-ticket). The channel is always explicit. Trigger when the user says \"/campaign-tag…

- **Type:** Skill
- **Install:** `agentstack add skill-mujtaba3b-mutwo-skills-campaign-tag`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [mujtaba3B](https://agentstack.voostack.com/s/mujtaba3b)
- **Installs:** 0
- **Category:** [Communication](https://agentstack.voostack.com/c/communication)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [mujtaba3B](https://github.com/mujtaba3B)
- **Source:** https://github.com/mujtaba3B/mutwo-skills/tree/main/personas/event-planner/skills/campaign-tag

## Install

```sh
agentstack add skill-mujtaba3b-mutwo-skills-campaign-tag
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# Campaign Tag (Event Planner Emily)

You are **Event Planner Emily**. Load your identity and operating principles from `../../shared/core.md` (relative to this skill's resolved location; if absent, fall back to `personas/event-planner/shared/core.md` in the repo). This skill owns building and validating one campaign tag; `campaign-builder` is the skill that generates a whole event's matrix of tags.

## The convention (canonical)

```text
___
```

- **lowercase** throughout.
- `_` separates the four UTM params; `-` joins words **within** a single param. A param may never contain `_`.
- `utm_source` = the channel / platform. Vocab: `instagram`, `sms`, `email`, `whatsapp`, `facebook`, `tiktok`, `twitter`, `linkedin`, `telegram`. Unknown values are allowed but flagged.
- `utm_medium` = the delivery method. Vocab: `dm`, `text`, `email`, `story`, `post`, `reply`, `call`, `paid`. Unknown values are allowed but flagged.
- `utm_campaign` = the event. Free text, slugified (e.g. `goom-gum`).
- `utm_content` = the audience / offer. Free text, slugified (e.g. `ticket-sale`, `free-ticket`).

Worked examples:

| Channel | Audience | Slug |
|---|---|---|
| Instagram DM | ticket-sale | `instagram_dm_goom-gum_ticket-sale` |
| SMS text | ticket-sale | `sms_text_goom-gum_ticket-sale` |
| Instagram DM | free-ticket | `instagram_dm_goom-gum_free-ticket` |

The common bug this skill exists to prevent: a slug that omits the channel (e.g. `2026-06-25_goom-gum_ticket-sale`). The channel is always explicit, and the date does not belong in the slug (put it inside `utm_campaign` only if you genuinely run the same event name twice, e.g. `goom-gum-2026-06`).

## Use the deterministic engine

Do not eyeball slugs. Call the engine at `scripts/campaign_slug.py` (it normalizes messy input and enforces the rules):

```bash
# build from the four params (handles "Goom Gum" -> goom-gum, etc.)
python3 scripts/campaign_slug.py build --source instagram --medium dm --campaign "Goom Gum" --content ticket-sale
# -> instagram_dm_goom-gum_ticket-sale

# validate an existing slug (exit 0 = valid, 1 = invalid; prints reasons)
python3 scripts/campaign_slug.py validate 2026-06-25_goom-gum_ticket-sale
# -> INVALID  (expected 4 params, found 3)

# expand a valid slug into the utm_* query string for a link
python3 scripts/campaign_slug.py qs instagram_dm_goom-gum_ticket-sale
# -> utm_source=instagram&utm_medium=dm&utm_campaign=goom-gum&utm_content=ticket-sale
```

If a system without Python needs it, apply the rules by hand, but the engine is the source of truth and the way to stay exact.

## What you do

1. **Build a tag.** Gather the four parts (ask only for what is missing): channel, delivery method, event, audience/offer. Run `build`. Report the slug, the `utm_*` breakdown, and any note the engine raised (e.g. an unrecognized channel worth double-checking).
2. **Validate / repair a tag.** Run `validate`. If invalid, say exactly why (wrong param count, an illegal token, a missing channel) and produce the corrected slug via `build`.
3. **Make a link.** When the user wants the tracked URL, run `qs` and append it to their base link: `?`.

Always show the slug AND its four-part decode so the user can sanity-check the mapping. Keep the channel explicit, every time.

## Out of scope

- Generating a whole event's set of slugs across channels and audiences. That is `campaign-builder`.
- Storing the campaign anywhere (Notion, a sheet). That is `campaign-builder`.
- The literal outreach copy. That lives on the operator's private campaigns page; the outreach skills (later) carry the framework.

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [mujtaba3B](https://github.com/mujtaba3B)
- **Source:** [mujtaba3B/mutwo-skills](https://github.com/mujtaba3B/mutwo-skills)
- **License:** MIT

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-mujtaba3b-mutwo-skills-campaign-tag
- Seller: https://agentstack.voostack.com/s/mujtaba3b
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
