From Synter
Pre-launch checks for ad campaigns — geo targeting, exclusion lists, tracking setup, budget. Run before enabling paused campaigns.
How this skill is triggered — by the user, by Claude, or both
Slash command
/synter:campaign-preflightThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Ensures campaigns are properly configured before launch to prevent wasted ad spend and spam traffic.
Ensures campaigns are properly configured before launch to prevent wasted ad spend and spam traffic.
Run structural validation FIRST before any other checks. This ensures the campaign has all required components to actually serve ads.
| Platform | Script | Checks |
|---|---|---|
google_ads_validate_campaign_structure | Ad groups, ads, keywords (Search), budget, conversion tracking | |
| Meta | meta_ads_validate_campaign_structure | Ad sets, ads, targeting, budget, pixel |
linkedin_ads_validate_campaign_structure | Creatives, approval status, targeting, budget, insight tag | |
reddit_ads_validate_campaign_structure | Ad groups, ads, targeting, budget, pixel | |
| Microsoft | microsoft_ads_validate_campaign_structure | Ad groups, ads, keywords (Search), budget, UET tag |
| TikTok | tiktok_ads_validate_campaign_structure | Ad groups, ads, targeting, budget, pixel |
| X | x_ads_validate_campaign_structure | Line items, promoted tweets, targeting, budget, funding |
POST /tools/run
{
"script_name": "google_ads_validate_campaign_structure",
"platform": "GOOGLE",
"args": ["--campaign-id", "customers/123/campaigns/456"],
"user_id": <USER_ID>
}
{
"success": true,
"is_complete": true,
"checks": [
{"name": "has_ad_groups", "passed": true, "level": "error", "message": "Campaign has 2 ad groups"},
{"name": "ad_groups_have_ads", "passed": true, "level": "error", "message": "All ad groups have enabled ads"},
{"name": "has_keywords", "passed": true, "level": "error", "message": "Campaign has 15 keywords"},
{"name": "budget_configured", "passed": true, "level": "error", "message": "Budget: $50.00/day"},
{"name": "conversion_tracking", "passed": true, "level": "warning", "message": "Account has 3 conversion actions"}
]
}
BLOCKING: If is_complete: false, DO NOT enable the campaign. Fix missing components first.
EVERY ad must have UTM parameters before launch. Without UTMs, you cannot attribute traffic in GA4, HubSpot, or any analytics tool.
| Parameter | Value |
|---|---|
utm_source | Platform name: google, meta, linkedin, reddit, microsoft, tiktok, x |
utm_medium | cpc (search), paid-social (social), display (display), video (video) |
utm_campaign | Campaign name (slugified, lowercase, hyphens) |
utm_content | Ad group/ad set name (slugified) |
utm_term | Keyword or ad variant name (optional) |
| Platform | Where UTMs Live | How to Verify | Fix Script |
|---|---|---|---|
| Google Ads | Final URL suffix or tracking template | run_gaql query for ad_group_ad.ad.final_urls | google_ads_set_url_suffix |
| Meta | Ad url_tags or URL parameters on creative link | meta_ads_get_insights — check ad URLs | meta_ads_update_adset |
| Creative click-through URL | linkedin_ads_list_campaigns — inspect creative URLs | Manual update in creative | |
click_url on ad or destination_url on post | reddit_ads_fix_utms --dry-run | reddit_ads_fix_utms | |
| Microsoft | Final URL suffix or tracking template | Campaign export | microsoft_ads_update_campaign |
| TikTok | Landing page URL on ad | tiktok_ads_list_ads — check URLs | Update via ad creation |
| X | Website card URL | x_ads_get_analytics — check card URLs | Update card URL |
TEXT posts cannot have click_url. If you find TEXT-type ads without UTMs:
destination_urlclick_urlreddit_ads_fix_utms to batch-fix{
"script_name": "reddit_ads_fix_utms",
"platform": "REDDIT",
"args": ["--account-id", "a2_xxx", "--profile-id", "t2_xxx", "--dry-run"]
}
Look for WOULD_CREATE_POST_AND_AD (TEXT posts needing replacement) and WOULD_CREATE_AD (IMAGE posts needing UTM ads).
Without conversion tracking, campaigns cannot optimize for business outcomes. Always verify before launch.
| Platform | Tracking Pixel/Tag | Verification Script | Required For |
|---|---|---|---|
| Google Tag (gtag.js) or GTM | verify_website_tracking, google_ads_list_conversions | Smart Bidding, Maximize Conversions | |
| Meta | Meta Pixel | verify_website_tracking, meta_ads_manage_pixel | OUTCOME_SALES, Conversion optimization |
| LinkedIn Insight Tag | verify_website_tracking, gtm_list_tags | Conversion tracking, website demographics | |
| Reddit Pixel | verify_website_tracking, reddit_ads_manage_pixel --list | CONVERSIONS objective | |
| Microsoft | UET Tag | verify_website_tracking | Conversion goals |
| TikTok | TikTok Pixel | verify_website_tracking | Conversion optimization |
| X | X Pixel (Web Tag) | x_ads_manage_web_tag | Conversion tracking |
{
"script_name": "verify_website_tracking",
"platform": "REDDIT",
"args": ["--url", "https://example.com"]
}
This checks for ALL platform pixels on the target URL. Flag any missing ones.
gtm_publish to publish pending changesmaximize_clicks / target_spend until conversions are verified (15-30 conversions minimum for smart bidding)If the client uses GA4 or HubSpot, verify UTM parameters are flowing through:
Traffic acquisition report for reddit / paid-social source/mediumCRITICAL: Campaigns without geo targeting will show to ALL countries including spam countries.
POST /tools/run
{
"script_name": "google_ads_export_campaigns",
"platform": "GOOGLE",
"args": ["--campaign-filter", "<CAMPAIGN_NAME>"],
"user_id": <USER_ID>
}
Look for "Geo Targets: Not set" - this is a red flag.
Tier 1 (High-value markets):
Tier 2 (Good secondary markets):
Spam Countries (AVOID):
POST /tools/run
{
"script_name": "google_ads_set_campaign_geo_targets",
"platform": "GOOGLE",
"args": ["--campaign-ids", "<CAMPAIGN_IDS>", "--tier", "1,2"],
"user_id": <USER_ID>
}
Note: Demand Gen campaigns require ad group-level targeting. The script handles this automatically.
Review daily budgets:
Check for common negative keywords:
Verify ads run during business hours if B2B:
Video requirements:
Location targeting at ad group level (not campaign level)
Audience targeting:
Keyword match types:
Ad extensions:
Image assets:
Placement exclusions:
When reviewing campaigns, output a summary like:
## Campaign Pre-Flight Report
| Check | Status | Notes |
|-------|--------|-------|
| Campaign Structure | ✅/⚠️/❌ | Complete / Missing components |
| UTM Tracking | ✅/⚠️/❌ | All ads tagged / X ads missing UTMs |
| Conversion Tracking | ✅/⚠️/❌ | Pixel installed + events firing / Missing |
| Geo Targeting | ✅/⚠️/❌ | Tier 1+2 / Not set |
| Budget | ✅/⚠️ | $X/day |
| Ad Schedule | ✅/⚠️ | 24/7 / Business hours |
| Negative Keywords | ✅/⚠️ | X keywords / None |
**Recommendation:** [Enable/Fix issues first]
BLOCKING checks (must fix before launch):
Warning checks (recommended but not blocking):
For bulk campaign review:
Mines projects and conversations into a searchable memory palace. Activates on queries about MemPalace, memory palace, mining, searching, palace setup, wings, rooms, drawers, or recalling past work.
Guides Payload CMS config (payload.config.ts), collections, fields, hooks, access control, APIs. Debugs validation errors, security, relationships, queries, transactions, hook behavior.
Implements vector databases with Pinecone, Weaviate, Qdrant, Milvus, pgvector for semantic search, RAG, recommendations, and similarity systems. Optimizes embeddings, indexing, and hybrid search.
npx claudepluginhub synter-media-ai/plugin --plugin synter