/digital-marketing-pro:campaign-audit — Cross-Channel Current-State Audit skill
Audit all campaigns running for a brand across channels, with 4-tier triage.
by indranilbanerjee·MIT license·★ 866 Stars on the repo·GitHub ↗
npx degit indranilbanerjee/digital-marketing-pro/skills/campaign-audit#main ~/.claude/skills/campaign-auditChecked ·commit main
Inside this skill
SKILL.md · the author's own words# /digital-marketing-pro:campaign-audit — Cross-Channel Current-State Audit > **Script location.** If your host does not set `${CLAUDE_PLUGIN_ROOT}`, the scripts are in this plugin's `scripts/` folder, next to `skil… This skill produces a single document describing **everything currently running for a brand across every channel** — what's live, what's sp… ## Context efficiency Heavy skill. **Grep before Read** any referenced file, then `Read` only matched ranges with `offset` + `limit`. List the brand's data dir (… Use this skill: - **During agency onboarding** (step 8 of the agency-operations workflow) — within the first week of taking over a new client, before you p… - **Before a quarterly campaign refresh** — establish the baseline you're going to argue against. - **After a brand acquisition or restructure** — when ownership of marketing changes hands and the new team needs a single source of truth… - **After a long pause in account work** (vacation, paternity leave, contract gap) — to re-establish situational awareness without making c…
Word-for-word excerpt, not a result. Read the full SKILL.md ↓
Files of /digital-marketing-pro:campaign-audit — Cross-Channel Current-State Audit
Show the full text258 lines
/digital-marketing-pro:campaign-audit — Cross-Channel Current-State Audit
Script location. If your host does not set
${CLAUDE_PLUGIN_ROOT}, the scripts are in this plugin'sscripts/folder, next toskills/. Run them with Python 3.10 or newer:python, orpython3wherepythonis not found (macOS, many Linux systems).
This skill produces a single document describing everything currently running for a brand across every channel — what's live, what's spending, what's performing, what's leaking budget, what's quietly broken. It's the prerequisite for any informed /digital-marketing-pro:campaign-plan, /digital-marketing-pro:performance-report, or /digital-marketing-pro:competitor-analysis refresh.
Context efficiency
Heavy skill. Grep before Read any referenced file, then Read only matched ranges with offset + limit. List the brand's data dir (~/.claude-marketing/brands/{slug}/, or $CLAUDE_PLUGIN_DATA/digital-marketing-pro/brands/{slug}/ when that env var is set) before opening files. On re-invocation mid-session, skip files already in context.
Use this skill:
- During agency onboarding (step 8 of the agency-operations workflow) — within the first week of taking over a new client, before you propose anything new.
- Before a quarterly campaign refresh — establish the baseline you're going to argue against.
- After a brand acquisition or restructure — when ownership of marketing changes hands and the new team needs a single source of truth for "what are we actually running?"
- After a long pause in account work (vacation, paternity leave, contract gap) — to re-establish situational awareness without making changes.
Why this skill exists
When agencies inherit a brand, the previous owner's "campaign plan" is usually a 40-tab Google Sheet, six dashboards on three platforms, and a list of API integrations nobody remembers wiring up. Without an explicit audit, the new team either (a) silently lets things keep running while they ramp up — and inherits the mistakes, or (b) tears it down and rebuilds — and loses the institutional knowledge of what was actually working.
This skill produces the third option: a single audit document that captures the live state cleanly, scores each item, and feeds directly into the next planning conversation. It is read-only — it never pauses, modifies, or kills a campaign.
What gets audited
| Channel | What's inventoried | What's scored |
|---|---|---|
| Paid search | Active Google Ads / Microsoft Ads campaigns, ad groups, keywords, daily budgets, last-modified dates | Spend efficiency, quality scores, conversion-tracking health, negative-keyword coverage, dead ad groups still spending |
| Paid social | Active Meta / LinkedIn / TikTok / Pinterest / X campaigns + audiences + creatives | Frequency, learning-phase status, creative fatigue, audience overlap, attribution-window correctness |
| Retail media | Amazon Ads, Walmart Connect, Instacart Ads accounts and campaigns | ACOS, branded vs non-branded split, share-of-voice for top SKUs |
| Active automations / journeys (Klaviyo, HubSpot, ActiveCampaign, Brevo, Marketo), send lists, deliverability metrics | Open rates, sender reputation, list hygiene age, GDPR/DPDPA consent provenance for every list, broken templates | |
| Organic social | Posting cadence per platform (last 90 days), engagement rate, follower trend | Cadence consistency, AI-disclosure compliance, locale coverage |
| Content / SEO | Pages publishing in last 90 days, ranking keywords (top 50), schema markup state, internal-link density | Indexation health (GSC), Core Web Vitals, AI-Overview citation rate, technical-debt items |
| AEO / GEO | Brand mention rate across Google AI Mode, Perplexity, ChatGPT search, Claude search, Copilot, Gemini App | Mention rate vs top 5 competitors, citation share, recommendation share |
| CRM + automation | Live workflows in HubSpot / Salesforce / Pipedream / Zapier / Make, segments in use, lifecycle stage mappings | Orphaned workflows (no recent execution), broken connectors, duplicate-contact rate |
| Web analytics | GA4 properties + GSC properties wired to which domains, conversion events configured, consent-mode state | Tag-firing health, event-naming consistency, attribution model selected |
| Influencer / PR | Active creator deals (live + paused), contracted deliverables, FTC-disclosure compliance | Cost per engagement, creator-audience-authenticity check, disclosure completeness |
| Compliance posture | Active brand-level claims, EU AI Act Article 50 disclosure state on AI content, C2PA signing state, cookie/consent banner version | Each regulated claim mapped to a primary source; missing disclosures escalated |
The audit also captures what's NOT happening that should be — channels with zero activity, missing tracking pixels, expired API tokens, abandoned automations.
Process
Step 0 — Prerequisites
This skill assumes:
- The brand profile exists and
/digital-marketing-pro:validate-profile --brand {brand}returnspassedorpassed_with_warnings. If it returnsblocked, refuse and tell the user to fix the blockers first — auditing on a broken profile produces a corrupt baseline. - Connector credentials for the channels in scope are configured (Google Ads, Meta Business, LinkedIn Campaign Manager, the email platform, the CRM, GA4, GSC, etc.). Missing connectors degrade the audit gracefully — they don't block it; the audit just notes "{channel} skipped — connector not configured" in the relevant section.
Step 1 — Confirm the active brand and audit scope
If --brand <slug> was supplied, use it. Otherwise use the active brand. If neither, error: "--brand <slug> required, or run /digital-marketing-pro:switch-brand first."
If --channels <list> was supplied (e.g. paid_search,email,seo), restrict to those. Otherwise audit every channel for which a connector is configured.
If --quick was supplied, run only the channel-level inventory pass (skip the historical performance pull and the AEO/GEO check) — useful for a fast "what's live" snapshot.
Step 2 — Inventory each channel
For each in-scope channel, call the relevant data-pull script with --read-only. Examples:
# Paid search
python "${CLAUDE_PLUGIN_ROOT}/scripts/performance-monitor.py" --brand "{brand}" \
--channel google_ads --action inventory --read-only
# Paid social
python "${CLAUDE_PLUGIN_ROOT}/scripts/performance-monitor.py" --brand "{brand}" \
--channel meta_ads --action inventory --read-only
python "${CLAUDE_PLUGIN_ROOT}/scripts/performance-monitor.py" --brand "{brand}" \
--channel linkedin_ads --action inventory --read-only
# Email
python "${CLAUDE_PLUGIN_ROOT}/scripts/performance-monitor.py" --brand "{brand}" \
--channel email --action automations --read-only
# Organic + SEO
python "${CLAUDE_PLUGIN_ROOT}/scripts/seo-executor.py" --brand "{brand}" --action audit-current
python "${CLAUDE_PLUGIN_ROOT}/scripts/performance-monitor.py" --brand "{brand}" \
--channel organic_social --action cadence
# AEO / GEO (skip for a fast audit)
python "${CLAUDE_PLUGIN_ROOT}/scripts/ai-visibility-checker.py" --brand "{brand}" \
--mode api --competitors "{auto-from-profile or --competitors arg}"
# CRM + automation health
python "${CLAUDE_PLUGIN_ROOT}/scripts/crm-sync.py" --brand "{brand}" --action audit-workflows
# Web analytics health
python "${CLAUDE_PLUGIN_ROOT}/scripts/performance-monitor.py" --brand "{brand}" \
--channel ga4_health --action diagnostic
If a script returns {"error": "..."} instead of inventory, mark that channel as skipped: <reason> and continue. Never fail the whole audit because one channel is broken — the broken channel IS a finding.
Step 3 — Score and triage
For each item discovered, apply the scoring rubric (4-tier, conservative):
| Tier | Meaning | Examples |
|---|---|---|
| 🟢 Healthy | Performing within benchmark, no action needed | Email automation with >25% open rate; Google Ads campaign with QS ≥ 7; SEO page in top 10 for primary keyword |
| 🟡 Quick win | Small fix unlocks meaningful gain (<2hr effort) | Ad copy missing a sitelink extension; email template with broken merge tag; landing page with no schema markup |
| 🟠 Strategic gap | Needs a real intervention (workshop, asset, decision) | No active retargeting audience; no negative-keyword list; no AEO disclosure on AI-generated content |
| 🔴 Red flag / leak | Actively losing money OR creating compliance risk | Campaign spending with conversion tracking broken; email list with no GDPR provenance; CRM workflow firing on duplicate contacts |
A red flag is anything that meets ANY of: (a) measurable monthly waste > $X (default $500, override with --red-flag-spend-threshold), (b) regulatory violation (missing consent, missing AI disclosure, fabricated claim), (c) brand-safety risk (active campaign on retired product, contradiction with another live campaign).
Step 4 — Compose the audit document
Write the audit to ~/.claude-marketing/brands/{slug}/audits/campaign-audit-{YYYY-MM-DD}.md AND publish a user-visible copy to ~/Documents/DigitalMarketingPro/{brand}/audits/{YYYY-MM-DD}-campaign-audit.md (the dual-copy pattern). The document structure:
# Current-State Campaign Audit — {brand_name}
**Run date:** {YYYY-MM-DD}
**Auditor:** /digital-marketing-pro:campaign-audit
**Active brand profile:** {profile_version_or_last_modified}
**Channels in scope:** {list}
**Channels skipped:** {list with reason}
---
## 1. Executive Summary
- **{N} active campaigns** across {M} channels
- **Estimated monthly spend (managed):** {currency} {amount}
- **Healthy items:** {count} · **Quick wins:** {count} · **Strategic gaps:** {count} · **🔴 Red flags:** {count}
- **Top three red flags** — bulleted, with the specific cost or risk
- **Recommended next conversation** — usually one of: budget reallocation, conversion-tracking fix, compliance remediation, channel-mix shift
## 2. By channel
### 2.1 Paid search
| Account | Campaign | Status | Daily budget | Last modified | Spend (30d) | Conversions (30d) | Triage |
|---|---|---|---|---|---|---|---|
| ... | ... | ACTIVE | $X | YYYY-MM-DD | $Y | N | 🟡 Add sitelink extensions |
[Repeat for each channel section. Include the inventory table, the scoring summary, and the per-item triage.]
## 3. Cross-channel observations
- Attribution model in use (and which channels override it)
- Cross-channel audience overlap (Meta retargeting includes Google Ads converters?)
- Cadence collisions (email send + LinkedIn organic + paid social all hitting the same audience the same morning?)
- Funnel gaps (channel produces leads but no nurture sequence wired up)
## 4. Compliance posture
- EU AI Act Article 50 disclosure state on AI content
- C2PA signing state for AI images/video distributed in EU markets
- Consent-mode (cookie banner) version + last consent rate
- Regulated-industry claim register (linked to primary sources)
## 5. AEO / GEO snapshot
Mention rate vs top 5 competitors across Google AI Mode, Perplexity, ChatGPT search, Claude search, Copilot, Gemini App. Citation share, recommendation share, trend vs last audit.
## 6. Quick-wins backlog (do these this week)
Bulleted list. Each item: action · channel · effort · expected impact · who owns it.
## 7. Strategic gaps (queue for next planning conversation)
Bulleted list. Each item: gap · why it matters · what would close it · estimated investment.
## 8. 🔴 Red flags (escalate before continuing routine work)
Bulleted list. Each item: the specific issue · cost or risk in concrete numbers · the literal command or platform action to remediate.
## 9. Channels NOT running that probably should be
Bulleted list. Each item: channel · why it's missing · what minimum viable activation looks like.
---
**Next steps:**
- Take the quick-wins backlog into a 30-min triage with the account lead.
- Bring the strategic gaps to the next `/digital-marketing-pro:campaign-plan` conversation.
- Resolve every 🔴 red flag before the next routine work cycle.
Step 5 — Update the brand's audit history
Append a short entry to ~/.claude-marketing/brands/{slug}/audit-history.json:
{
"audits": [
{
"type": "campaign-audit",
"date": "{YYYY-MM-DD}",
"channels_audited": ["paid_search", "email", "seo", "..."],
"channels_skipped": [{"channel": "linkedin_ads", "reason": "connector_unauthenticated"}],
"healthy_count": N, "quickwin_count": N, "gap_count": N, "redflag_count": N,
"report_path": "{tracking_path}",
"published_path": "{user_visible_path}"
}
]
}
Step 6 — Surface the report to the user
In the conversation, print:
✅ Campaign audit complete for {brand_name}.
Channels in scope: {list}
{N} healthy · {N} quick wins · {N} strategic gaps · {N} 🔴 red flags
📂 Report saved to:
{published_path}
Top 3 red flags:
1. {item}
2. {item}
3. {item}
Next: walk the quick-wins backlog in a 30-min triage, or run
/digital-marketing-pro:performance-check for a metrics-only snapshot,
or /digital-marketing-pro:campaign-plan to start the next planning cycle.
Behaviour rules
- Read-only across every channel. No campaign is paused, edited, or deleted. No email is sent. No CRM record is touched. This is an inventory + scoring pass.
- One channel failure ≠ full audit failure. A failing connector becomes a finding in the "Channels skipped" list, not an exception that aborts the whole skill.
- Concrete numbers, not adjectives. "Wasting $X/month" beats "spending inefficiently." If a number is unavailable, say "unknown — {connector} didn't return it" instead of fabricating one.
- Quote primary sources for compliance findings. Never cite Wikipedia, blog posts, or LLM output as the source for "X regulation requires Y." Use the entries in
skills/context-engine/compliance-rules.md, and if a jurisdiction isn't covered there, mark the finding ascompliance_basis: unverifiedrather than guessing. - Dual-copy the report. Internal (tracking) under
~/.claude-marketing/brands/{slug}/audits/; user-visible under~/Documents/DigitalMarketingPro/{brand}/audits/(or$DIGITAL_MARKETING_PRO_PUBLISH_DIRif set). The dual-copy pattern exists so the user can find the file without spelunking dotfolders.
Arguments
/digital-marketing-pro:campaign-audit [--brand <slug>] [--channels <list>] [--quick]
[--competitors <list>] [--red-flag-spend-threshold <amount>] [--json]
--brand <slug>— brand to audit (else uses active brand)--channels <list>— comma-separated subset to audit (else every channel with a connector configured)--quick— channel inventory only; skip historical pull + AEO/GEO check--competitors <list>— explicit competitor list for the AEO/GEO section (else taken from brand profile)--red-flag-spend-threshold <amount>— override the default $500/month threshold for flagging waste as 🔴--json— emit a machine-readable JSON summary in addition to the markdown report
Related skills + commands
validate-profile— prerequisite check (run first)campaign-plan— what to do with the strategic gaps surfacedlaunch-campaign— what to do once the plan is approvedperformance-check— lighter metrics-only snapshotcompetitor-analysis— pairs naturally with the AEO/GEO sectionaeo-audit— deeper AI-engine visibility audit if Section 5 raises concerns"${CLAUDE_PLUGIN_ROOT}/scripts/performance-monitor.py"— underlying data pulls
| 1 | |
| 2 | name campaign-audit |
| 3 | description "Audit all campaigns running for a brand across channels, with 4-tier triage. \"we just inherited this account\"" |
| 4 | user-invocable true |
| 5 | allowed-tools Read Bash Glob Grep |
| 6 | |
| 7 | |
| 8 | # /digital-marketing-pro:campaign-audit — Cross-Channel Current-State Audit |
| 9 | |
| 10 | > **Script location.** If your host does not set `${CLAUDE_PLUGIN_ROOT}`, the scripts are in this plugin's `scripts/` folder, next to `skills/`. Run them with Python 3.10 or newer: `python`, or `python3` where `python` is not found (macOS, many Linux systems). |
| 11 | |
| 12 | This skill produces a single document describing **everything currently running for a brand across every channel** — what's live, what's spending, what's performing, what's leaking budget, what's quietly broken. It's the prerequisite for any informed `/digital-marketing-pro:campaign-plan`, `/digital-marketing-pro:performance-report`, or `/digital-marketing-pro:competitor-analysis` refresh. |
| 13 | |
| 14 | ## Context efficiency |
| 15 | |
| 16 | Heavy skill. **Grep before Read** any referenced file, then `Read` only matched ranges with `offset` + `limit`. List the brand's data dir (`~/.claude-marketing/brands/{slug}/`, or `$CLAUDE_PLUGIN_DATA/digital-marketing-pro/brands/{slug}/` when that env var is set) before opening files. On re-invocation mid-session, skip files already in context. |
| 17 | |
| 18 | Use this skill: |
| 19 | |
| 20 | **During agency onboarding** (step 8 of the agency-operations workflow) — within the first week of taking over a new client, before you propose anything new. |
| 21 | **Before a quarterly campaign refresh** — establish the baseline you're going to argue against. |
| 22 | **After a brand acquisition or restructure** — when ownership of marketing changes hands and the new team needs a single source of truth for "what are we actually running?" |
| 23 | **After a long pause in account work** (vacation, paternity leave, contract gap) — to re-establish situational awareness without making changes. |
| 24 | |
| 25 | ## Why this skill exists |
| 26 | |
| 27 | When agencies inherit a brand, the previous owner's "campaign plan" is usually a 40-tab Google Sheet, six dashboards on three platforms, and a list of API integrations nobody remembers wiring up. Without an explicit audit, the new team either (a) silently lets things keep running while they ramp up — and inherits the mistakes, or (b) tears it down and rebuilds — and loses the institutional knowledge of what was actually working. |
| 28 | |
| 29 | This skill produces the third option: a single audit document that captures the live state cleanly, scores each item, and feeds directly into the next planning conversation. It is **read-only** — it never pauses, modifies, or kills a campaign. |
| 30 | |
| 31 | ## What gets audited |
| 32 | |
| 33 | | Channel | What's inventoried | What's scored | |
| 34 | |---|---|---| |
| 35 | | **Paid search** | Active Google Ads / Microsoft Ads campaigns, ad groups, keywords, daily budgets, last-modified dates | Spend efficiency, quality scores, conversion-tracking health, negative-keyword coverage, dead ad groups still spending | |
| 36 | | **Paid social** | Active Meta / LinkedIn / TikTok / Pinterest / X campaigns + audiences + creatives | Frequency, learning-phase status, creative fatigue, audience overlap, attribution-window correctness | |
| 37 | | **Retail media** | Amazon Ads, Walmart Connect, Instacart Ads accounts and campaigns | ACOS, branded vs non-branded split, share-of-voice for top SKUs | |
| 38 | | **Email** | Active automations / journeys (Klaviyo, HubSpot, ActiveCampaign, Brevo, Marketo), send lists, deliverability metrics | Open rates, sender reputation, list hygiene age, GDPR/DPDPA consent provenance for every list, broken templates | |
| 39 | | **Organic social** | Posting cadence per platform (last 90 days), engagement rate, follower trend | Cadence consistency, AI-disclosure compliance, locale coverage | |
| 40 | | **Content / SEO** | Pages publishing in last 90 days, ranking keywords (top 50), schema markup state, internal-link density | Indexation health (GSC), Core Web Vitals, AI-Overview citation rate, technical-debt items | |
| 41 | | **AEO / GEO** | Brand mention rate across Google AI Mode, Perplexity, ChatGPT search, Claude search, Copilot, Gemini App | Mention rate vs top 5 competitors, citation share, recommendation share | |
| 42 | | **CRM + automation** | Live workflows in HubSpot / Salesforce / Pipedream / Zapier / Make, segments in use, lifecycle stage mappings | Orphaned workflows (no recent execution), broken connectors, duplicate-contact rate | |
| 43 | | **Web analytics** | GA4 properties + GSC properties wired to which domains, conversion events configured, consent-mode state | Tag-firing health, event-naming consistency, attribution model selected | |
| 44 | | **Influencer / PR** | Active creator deals (live + paused), contracted deliverables, FTC-disclosure compliance | Cost per engagement, creator-audience-authenticity check, disclosure completeness | |
| 45 | | **Compliance posture** | Active brand-level claims, EU AI Act Article 50 disclosure state on AI content, C2PA signing state, cookie/consent banner version | Each regulated claim mapped to a primary source; missing disclosures escalated | |
| 46 | |
| 47 | The audit also captures **what's NOT happening** that should be — channels with zero activity, missing tracking pixels, expired API tokens, abandoned automations. |
| 48 | |
| 49 | ## Process |
| 50 | |
| 51 | ### Step 0 — Prerequisites |
| 52 | |
| 53 | This skill assumes: |
| 54 | |
| 55 | The brand profile exists and `/digital-marketing-pro:validate-profile --brand {brand}` returns `passed` or `passed_with_warnings`. If it returns `blocked`, refuse and tell the user to fix the blockers first — auditing on a broken profile produces a corrupt baseline. |
| 56 | Connector credentials for the channels in scope are configured (Google Ads, Meta Business, LinkedIn Campaign Manager, the email platform, the CRM, GA4, GSC, etc.). Missing connectors degrade the audit gracefully — they don't block it; the audit just notes "{channel} skipped — connector not configured" in the relevant section. |
| 57 | |
| 58 | ### Step 1 — Confirm the active brand and audit scope |
| 59 | |
| 60 | If `--brand <slug>` was supplied, use it. Otherwise use the active brand. If neither, error: `"--brand <slug> required, or run /digital-marketing-pro:switch-brand first."` |
| 61 | |
| 62 | If `--channels <list>` was supplied (e.g. `paid_search,email,seo`), restrict to those. Otherwise audit every channel for which a connector is configured. |
| 63 | |
| 64 | If `--quick` was supplied, run only the channel-level inventory pass (skip the historical performance pull and the AEO/GEO check) — useful for a fast "what's live" snapshot. |
| 65 | |
| 66 | ### Step 2 — Inventory each channel |
| 67 | |
| 68 | For each in-scope channel, call the relevant data-pull script with `--read-only`. Examples: |
| 69 | |
| 70 | |
| 71 | # Paid search |
| 72 | python "${CLAUDE_PLUGIN_ROOT}/scripts/performance-monitor.py" --brand "{brand}" \ |
| 73 | --channel google_ads --action inventory --read-only |
| 74 | |
| 75 | # Paid social |
| 76 | python "${CLAUDE_PLUGIN_ROOT}/scripts/performance-monitor.py" --brand "{brand}" \ |
| 77 | --channel meta_ads --action inventory --read-only |
| 78 | python "${CLAUDE_PLUGIN_ROOT}/scripts/performance-monitor.py" --brand "{brand}" \ |
| 79 | --channel linkedin_ads --action inventory --read-only |
| 80 | |
| 81 | |
| 82 | python "${CLAUDE_PLUGIN_ROOT}/scripts/performance-monitor.py" --brand "{brand}" \ |
| 83 | --channel email --action automations --read-only |
| 84 | |
| 85 | # Organic + SEO |
| 86 | python "${CLAUDE_PLUGIN_ROOT}/scripts/seo-executor.py" --brand "{brand}" --action audit-current |
| 87 | python "${CLAUDE_PLUGIN_ROOT}/scripts/performance-monitor.py" --brand "{brand}" \ |
| 88 | --channel organic_social --action cadence |
| 89 | |
| 90 | # AEO / GEO (skip for a fast audit) |
| 91 | python "${CLAUDE_PLUGIN_ROOT}/scripts/ai-visibility-checker.py" --brand "{brand}" \ |
| 92 | --mode api --competitors "{auto-from-profile or --competitors arg}" |
| 93 | |
| 94 | # CRM + automation health |
| 95 | python "${CLAUDE_PLUGIN_ROOT}/scripts/crm-sync.py" --brand "{brand}" --action audit-workflows |
| 96 | |
| 97 | # Web analytics health |
| 98 | python "${CLAUDE_PLUGIN_ROOT}/scripts/performance-monitor.py" --brand "{brand}" \ |
| 99 | --channel ga4_health --action diagnostic |
| 100 | |
| 101 | |
| 102 | If a script returns `{"error": "..."}` instead of inventory, mark that channel as `skipped: <reason>` and continue. **Never fail the whole audit because one channel is broken** — the broken channel IS a finding. |
| 103 | |
| 104 | ### Step 3 — Score and triage |
| 105 | |
| 106 | For each item discovered, apply the **scoring rubric** (4-tier, conservative): |
| 107 | |
| 108 | | Tier | Meaning | Examples | |
| 109 | |---|---|---| |
| 110 | | **🟢 Healthy** | Performing within benchmark, no action needed | Email automation with >25% open rate; Google Ads campaign with QS ≥ 7; SEO page in top 10 for primary keyword | |
| 111 | | **🟡 Quick win** | Small fix unlocks meaningful gain (<2hr effort) | Ad copy missing a sitelink extension; email template with broken merge tag; landing page with no schema markup | |
| 112 | | **🟠 Strategic gap** | Needs a real intervention (workshop, asset, decision) | No active retargeting audience; no negative-keyword list; no AEO disclosure on AI-generated content | |
| 113 | | **🔴 Red flag / leak** | Actively losing money OR creating compliance risk | Campaign spending with conversion tracking broken; email list with no GDPR provenance; CRM workflow firing on duplicate contacts | |
| 114 | |
| 115 | A red flag is anything that meets ANY of: (a) measurable monthly waste > $X (default $500, override with `--red-flag-spend-threshold`), (b) regulatory violation (missing consent, missing AI disclosure, fabricated claim), (c) brand-safety risk (active campaign on retired product, contradiction with another live campaign). |
| 116 | |
| 117 | ### Step 4 — Compose the audit document |
| 118 | |
| 119 | Write the audit to `~/.claude-marketing/brands/{slug}/audits/campaign-audit-{YYYY-MM-DD}.md` AND publish a user-visible copy to `~/Documents/DigitalMarketingPro/{brand}/audits/{YYYY-MM-DD}-campaign-audit.md` (the dual-copy pattern). The document structure: |
| 120 | |
| 121 | |
| 122 | # Current-State Campaign Audit — {brand_name} |
| 123 | |
| 124 | **Run date:** {YYYY-MM-DD} |
| 125 | **Auditor:** /digital-marketing-pro:campaign-audit |
| 126 | **Active brand profile:** {profile_version_or_last_modified} |
| 127 | **Channels in scope:** {list} |
| 128 | **Channels skipped:** {list with reason} |
| 129 | |
| 130 | |
| 131 | |
| 132 | ## 1. Executive Summary |
| 133 | |
| 134 | - **{N} active campaigns** across {M} channels |
| 135 | - **Estimated monthly spend (managed):** {currency} {amount} |
| 136 | - **Healthy items:** {count} · **Quick wins:** {count} · **Strategic gaps:** {count} · **🔴 Red flags:** {count} |
| 137 | - **Top three red flags** — bulleted, with the specific cost or risk |
| 138 | - **Recommended next conversation** — usually one of: budget reallocation, conversion-tracking fix, compliance remediation, channel-mix shift |
| 139 | |
| 140 | ## 2. By channel |
| 141 | |
| 142 | ### 2.1 Paid search |
| 143 | | Account | Campaign | Status | Daily budget | Last modified | Spend (30d) | Conversions (30d) | Triage | |
| 144 | |---|---|---|---|---|---|---|---| |
| 145 | | ... | ... | ACTIVE | $X | YYYY-MM-DD | $Y | N | 🟡 Add sitelink extensions | |
| 146 | |
| 147 | [Repeat for each channel section. Include the inventory table, the scoring summary, and the per-item triage.] |
| 148 | |
| 149 | ## 3. Cross-channel observations |
| 150 | - Attribution model in use (and which channels override it) |
| 151 | - Cross-channel audience overlap (Meta retargeting includes Google Ads converters?) |
| 152 | - Cadence collisions (email send + LinkedIn organic + paid social all hitting the same audience the same morning?) |
| 153 | - Funnel gaps (channel produces leads but no nurture sequence wired up) |
| 154 | |
| 155 | ## 4. Compliance posture |
| 156 | - EU AI Act Article 50 disclosure state on AI content |
| 157 | - C2PA signing state for AI images/video distributed in EU markets |
| 158 | - Consent-mode (cookie banner) version + last consent rate |
| 159 | - Regulated-industry claim register (linked to primary sources) |
| 160 | |
| 161 | ## 5. AEO / GEO snapshot |
| 162 | Mention rate vs top 5 competitors across Google AI Mode, Perplexity, ChatGPT search, Claude search, Copilot, Gemini App. Citation share, recommendation share, trend vs last audit. |
| 163 | |
| 164 | ## 6. Quick-wins backlog (do these this week) |
| 165 | Bulleted list. Each item: action · channel · effort · expected impact · who owns it. |
| 166 | |
| 167 | ## 7. Strategic gaps (queue for next planning conversation) |
| 168 | Bulleted list. Each item: gap · why it matters · what would close it · estimated investment. |
| 169 | |
| 170 | ## 8. 🔴 Red flags (escalate before continuing routine work) |
| 171 | Bulleted list. Each item: the specific issue · cost or risk in concrete numbers · the literal command or platform action to remediate. |
| 172 | |
| 173 | ## 9. Channels NOT running that probably should be |
| 174 | Bulleted list. Each item: channel · why it's missing · what minimum viable activation looks like. |
| 175 | |
| 176 | |
| 177 | |
| 178 | **Next steps:** |
| 179 | - Take the quick-wins backlog into a 30-min triage with the account lead. |
| 180 | - Bring the strategic gaps to the next `/digital-marketing-pro:campaign-plan` conversation. |
| 181 | - Resolve every 🔴 red flag before the next routine work cycle. |
| 182 | |
| 183 | |
| 184 | ### Step 5 — Update the brand's audit history |
| 185 | |
| 186 | Append a short entry to `~/.claude-marketing/brands/{slug}/audit-history.json`: |
| 187 | |
| 188 | |
| 189 | { |
| 190 | "audits": [ |
| 191 | { |
| 192 | "type": "campaign-audit", |
| 193 | "date": "{YYYY-MM-DD}", |
| 194 | "channels_audited": ["paid_search", "email", "seo", "..."], |
| 195 | "channels_skipped": [{"channel": "linkedin_ads", "reason": "connector_unauthenticated"}], |
| 196 | "healthy_count": N, "quickwin_count": N, "gap_count": N, "redflag_count": N, |
| 197 | "report_path": "{tracking_path}", |
| 198 | "published_path": "{user_visible_path}" |
| 199 | } |
| 200 | ] |
| 201 | } |
| 202 | |
| 203 | |
| 204 | ### Step 6 — Surface the report to the user |
| 205 | |
| 206 | In the conversation, print: |
| 207 | |
| 208 | |
| 209 | ✅ Campaign audit complete for {brand_name}. |
| 210 | |
| 211 | Channels in scope: {list} |
| 212 | {N} healthy · {N} quick wins · {N} strategic gaps · {N} 🔴 red flags |
| 213 | |
| 214 | 📂 Report saved to: |
| 215 | {published_path} |
| 216 | |
| 217 | Top 3 red flags: |
| 218 | 1. {item} |
| 219 | 2. {item} |
| 220 | 3. {item} |
| 221 | |
| 222 | Next: walk the quick-wins backlog in a 30-min triage, or run |
| 223 | /digital-marketing-pro:performance-check for a metrics-only snapshot, |
| 224 | or /digital-marketing-pro:campaign-plan to start the next planning cycle. |
| 225 | |
| 226 | |
| 227 | ## Behaviour rules |
| 228 | |
| 229 | **Read-only across every channel.** No campaign is paused, edited, or deleted. No email is sent. No CRM record is touched. This is an inventory + scoring pass. |
| 230 | **One channel failure ≠ full audit failure.** A failing connector becomes a finding in the "Channels skipped" list, not an exception that aborts the whole skill. |
| 231 | **Concrete numbers, not adjectives.** "Wasting $X/month" beats "spending inefficiently." If a number is unavailable, say "unknown — {connector} didn't return it" instead of fabricating one. |
| 232 | **Quote primary sources for compliance findings.** Never cite Wikipedia, blog posts, or LLM output as the source for "X regulation requires Y." Use the entries in `skills/context-engine/compliance-rules.md`, and if a jurisdiction isn't covered there, mark the finding as `compliance_basis: unverified` rather than guessing. |
| 233 | **Dual-copy the report.** Internal (tracking) under `~/.claude-marketing/brands/{slug}/audits/`; user-visible under `~/Documents/DigitalMarketingPro/{brand}/audits/` (or `$DIGITAL_MARKETING_PRO_PUBLISH_DIR` if set). The dual-copy pattern exists so the user can find the file without spelunking dotfolders. |
| 234 | |
| 235 | ## Arguments |
| 236 | |
| 237 | |
| 238 | /digital-marketing-pro:campaign-audit [--brand <slug>] [--channels <list>] [--quick] |
| 239 | [--competitors <list>] [--red-flag-spend-threshold <amount>] [--json] |
| 240 | |
| 241 | |
| 242 | `--brand <slug>` — brand to audit (else uses active brand) |
| 243 | `--channels <list>` — comma-separated subset to audit (else every channel with a connector configured) |
| 244 | `--quick` — channel inventory only; skip historical pull + AEO/GEO check |
| 245 | `--competitors <list>` — explicit competitor list for the AEO/GEO section (else taken from brand profile) |
| 246 | `--red-flag-spend-threshold <amount>` — override the default $500/month threshold for flagging waste as 🔴 |
| 247 | `--json` — emit a machine-readable JSON summary in addition to the markdown report |
| 248 | |
| 249 | ## Related skills + commands |
| 250 | |
| 251 | [`validate-profile`] — prerequisite check (run first) |
| 252 | [`campaign-plan`] — what to do with the strategic gaps surfaced |
| 253 | [`launch-campaign`] — what to do once the plan is approved |
| 254 | [`performance-check`] — lighter metrics-only snapshot |
| 255 | [`competitor-analysis`] — pairs naturally with the AEO/GEO section |
| 256 | [`aeo-audit`] — deeper AI-engine visibility audit if Section 5 raises concerns |
| 257 | `"${CLAUDE_PLUGIN_ROOT}/scripts/performance-monitor.py"` — underlying data pulls |
| 258 |
Discussion
Browse more free Claude skills.