plugins/maccing-growth/skills/tiktok-ads/SKILL.md
Use when managing TikTok Ads campaigns, creating ads, optimizing campaigns, checking metrics, or automating TikTok Ads. Triggers on "tiktok ads", "tiktok campaign", "tiktok ads manager", "tiktok pixel", "tiktok events api", "spark ads", "tiktok targeting", "tiktok creatives", "tiktok lead generation".
npx skillsauth add andredezzy/maccing tiktok-adsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Automation-first approach to TikTok Ads. Use MCP servers and the Marketing API for programmatic operations. Browser guidance only when API/MCP can't handle it.
Project data lives in .maccing/growth/tiktok-ads/<account>/README.md. This file contains only generic, reusable platform knowledge.
BEFORE ANY ACTION, ALWAYS READ THE PROJECT FILES:
1. .maccing/growth/README.md (if exists)
2. .maccing/growth/tiktok-ads/<account>/README.md (if exists)
These contain current state: pixel IDs, campaign data, pending actions.
Without reading them, you WILL operate on stale data.
ALWAYS USE MCP OR API FOR OPERATIONS WHEN AVAILABLE.
BROWSER GUIDANCE IS THE FALLBACK, NOT THE DEFAULT.
Priority order:
amekala/ads-mcp or AdsMCP/tiktok-ads-mcp-server) — campaign CRUD, reports, analyticstiktok-business-api-sdk-official) — full lifecycle managementreference/automation.md; do NOT use Playwriter for antidetect-sensitive surfaces.After every session: update patterns, add new API learnings, document what worked/failed.
WHEN GUIDING ANY MANUAL ACTION, PROVIDE THE FULL CLICK PATH.
NEVER give vague directions. ALWAYS give the exact click sequence.
Never recommend changes without data. Read metrics first, diagnose second, prescribe third.
| Platform | URL | Purpose | |---|---|---| | TikTok Business Account | TikTok app | Organic profile, basic "Promote" feature, NOT an ads account | | TikTok Ads Manager | ads.tiktok.com | Campaign builder, budgets, targeting, creatives, bids | | TikTok Business Center | business.tiktok.com | Admin layer: team permissions, multiple ad accounts, shared pixels |
Solo advertiser: Ads Manager is enough. Business Center is for teams/agencies.
Campaign (objective, budget)
└── Ad Group (targeting, bid, placement, schedule)
└── Ad (creative, CTA, destination URL)
| Category | Objective | Optimizes For | Best For | |---|---|---|---| | Awareness | Reach | Unique impressions | Brand launches | | Consideration | Traffic | Link clicks | Landing page visits | | | Video Views | 2s or 6s views | Content-first strategy | | | Community Interaction | Followers, profile visits | Account growth | | Conversion | Lead Generation | Form submissions | In-app lead capture (Instant Form) | | | Website Conversions | Site actions (sign-up, purchase) | Registration, purchases | | | App Promotion | Installs, in-app events | Mobile app installs | | | Product Sales | Purchases via TikTok Shop | E-commerce |
Authorization flow:
| Dimension | Options | |---|---| | Age | 13-17, 18-24, 25-34, 35-44, 45-54, 55+ (18+ mandatory for financial content) | | Gender | All, Male, Female | | Location | Country, region/state, city-level | | Language | Device/app language | | Household Income | US only (Top 5%, 10%, 25%, 50%) |
| Type | What It Is | Intent Level | |---|---|---| | Interests | Long-term engagement patterns | Medium | | Behaviors | Recent actions in last 15 days | High | | Custom Audiences | Upload CRM data, website visitors, app users | Highest | | Lookalike Audiences | Similar to source. Narrow 1%, Balanced 5%, Broad 20% | Medium-High | | Smart+ | AI-driven fully automated targeting | Varies |
| Strategy | How It Works | When to Use | |---|---|---| | Lowest Cost | Spend full budget at cheapest results | Starting out, learning phase | | Cost Cap | Target average CPA you specify | Have target CPA, want volume | | Bid Cap | Maximum per-result bid. Lower volume. | Strict budget discipline |
Billing methods: oCPM (conversions), CPC (traffic), CPM (reach), CPV (video views)
Progression: Start Lowest Cost → collect 50+ conversions → switch to Cost Cap
| Metric | All Industries | Finance/Insurance | |---|---|---| | CPM | $9.16 | $13-18 | | CPC | $1.02 | $1.71-2.20 | | CPV | $0.03 | $0.03-0.08 | | CTR | 1.0% | 0.72% | | CVR | 1.8% | 1.02% | | CPA | $56.67 | $35-75 (leads) |
| Region | CPM | CPC | vs. US | |---|---|---|---| | United States | $10.72 | $1.18 | Baseline | | UK/Europe | $8-15 | $0.90-2.00 | -10-25% | | Latin America | $4.18 | $0.42 | -60% | | Southeast Asia | $3.05 | $0.31 | -70% |
| Level | Minimum | |---|---| | Ad group daily | $20/day | | Campaign daily | $50/day | | Meaningful testing | $500-1,000 | | Seeing results | $5,000+/month |
Standard events:
| Event | When to Fire |
|---|---|
| PageView | All pages |
| ViewContent | Product/plan pages |
| ClickButton | CTA buttons |
| CompleteRegistration | After sign-up |
| SubmitForm | Lead form submissions |
| Purchase | After purchase (replaces deprecated PlaceAnOrder) |
Equivalent to Meta CAPI / GA4 Measurement Protocol. Sends events server-to-server.
Endpoint: POST https://business-api.tiktok.com/open_api/v1.3/event/track/
Authentication: Access-Token header (NOT Authorization: Bearer)
Payload structure v1.3:
{
"event_source": "web",
"event_source_id": "<pixel_id>",
"data": [{
"event": "CompleteRegistration",
"event_id": "<dedup_id>",
"event_time": 1717200000,
"user": {
"ttclid": "<raw_string>",
"email": "<sha256_hash>",
"external_id": "<sha256_hash>"
},
"page": { "url": "https://example.com/signup" },
"properties": { "content_name": "sign_up" }
}]
}
Critical rules:
event_time: Unix seconds (NOT ISO 8601, NOT milliseconds)CompleteRegistration, Purchase)response.ok before response.json() (non-JSON error bodies crash otherwise)code: 0 in response bodyevent_id: same ID in browser pixel ttq.track() and server Events APICredentials setup:
Ads Manager → Assets → Events → Web Events → Open pixel → Settings → Generate Access Token
| Sector | Restriction Level | Review Time | Documents Required | |---|---|---|---| | Fornecedor de serviços de Internet | Free | 24h | None | | Aplicações e software | Free | 24h | None | | Educação | Free | 24h | None | | Serviços financeiros | RESTRICTED | 3-7 days | Licenses, disclaimers, 18+ mandatory |
TikTok does NOT cross-reference CNAE codes with sector field. Enforcement is at ad content + landing page level.
Universally prohibited: Binary options, MLM (downline recruitment), pyramid schemes, get-rich-quick, penny auctions, payday loans
Restricted (requires pre-approval): Cryptocurrency exchanges, Forex/FX trading, CFDs, financial spread betting
Allowed with disclaimers: Licensed investment platforms, banking, insurance, personal finance apps, budgeting tools
Required disclaimers: "Investments carry risk", "Past performance does not guarantee future results" — must appear as on-screen TEXT (85% watch muted)
| Parameter | Recommended | |---|---| | Aspect ratio | 9:16 (vertical) — mandatory for best performance | | Resolution | 1080x1920px | | Duration | 9-15 seconds (awareness), 30-60 seconds (lead gen) | | File size | Up to 500MB | | Format | MP4, MOV | | Captions | Required — 85% watch muted |
| MCP Server | Capabilities | |---|---| | amekala/ads-mcp | 31 TikTok tools (campaign CRUD, analytics, creative fatigue). Also supports Google/Meta/LinkedIn. | | AdsMCP/tiktok-ads-mcp-server | Campaign CRUD, analytics, audience/creative management. Self-hosted Python. | | ysntony/tiktok-ads-mcp | Read-only: 6 tools (campaigns, ad groups, ads, reports). |
pip install tiktok-business-api-sdk-official
OAuth 2.0 flow:
auth_codePOST /open_api/v1.2/oauth2/access_token/Access-Token header on all requestsSandbox available immediately. Production approval: 5-10 business days.
/v2/video/list/: 600 requests/minute — Note: this endpoint belongs to the TikTok for Developers creator/content API (not the Marketing API; Marketing API endpoints use /open_api/v1.x/ paths)| Dimension | TikTok | Google Search | Meta (FB/IG) | |---|---|---|---| | User intent | Discovery/entertainment | Active search intent | Social/interest-based | | Funnel stage | Top/mid (demand gen) | Bottom (demand capture) | Mid (demand gen) | | Primary format | Vertical video | Text (search ads) | Image/video/carousel | | Average CPC | $1.02 | $3-5 (finance) | $1.10 | | Min daily budget | $20/ad group | $1 | $1 | | Learning phase | ~50 conversions | ~1-2 weeks | ~50 conversions | | MLM policy | Explicitly banned | Case-by-case | Case-by-case | | Binary options | Banned | Banned | Banned |
| Formula | Structure | Best For |
|---|---|---|
| Specific Outcome | [Result] in [timeframe] | Cold traffic |
| PAS | Problem → Agitate → Solution | Retargeting |
| AIDA | Attention → Interest → Desire → Action | Cold traffic |
| Skeptic Script | "I know what you're thinking..." | Low-trust verticals (finance) |
| 3 Mistakes | "3 mistakes [audience] make..." | Educational content |
| Hook-Proof-Payoff-CTA | Hook (0-3s) → Proof (3-15s) → Payoff (15-25s) → CTA | Universal best performer |
Dynamic CTA outperforms any single CTA by ~12%. Select 3-5 relevant options and let TikTok auto-optimize per viewer.
| Objective | Best CTAs to Include | |---|---| | Education / Learning platform | Learn More, Sign Up, Subscribe, Get Started | | Lead generation | Sign Up, Learn More, Get Quote | | E-commerce | Shop Now, Learn More, View Now |
Always include a verbal CTA inside the video at 20-25 second mark. On-screen button is often ignored.
At $20/day in SEA/South Asia markets, CPMs are $0.20-$2.00 (vs $8-$15 in US). Your $20 buys what $100-$200 buys in Western markets. Note: this $0.20-$2.00 range reflects the lowest-cost markets in the region — specifically Philippines, Pakistan, and Bangladesh (see country benchmarks below). The broader SEA regional average CPM is ~$3.05 (see Regional Benchmarks above), driven by higher-cost markets like Singapore and Thailand.
Rules:
Phase progression:
| Metric | Philippines | Pakistan | Bangladesh | |---|---|---|---| | CPM | $0.50–$2.00 | $0.30–$1.50 | $0.20–$1.00 | | CPC | $0.05–$0.35 | $0.03–$0.20 | $0.02–$0.15 | | CTR | 0.8–1.5% | Similar | Similar | | Ad audience | 50M+ adults | 66.9M adults | 46.5M adults | | Peak hours | 6-9 PM PHT (UTC+8) | 8-11 PM PKT (UTC+5) | 9-11 PM BST (UTC+6) | | Language | Taglish (Tagalog+English) | Urdu/English mix | Bengali/English mix |
Key insights:
Allowed: Financial literacy, "learn to trade", market education, personal finance Prohibited: Revenue claims, P&L screenshots, "guaranteed profits", "passive income"
Safe framing: "financial education", "learn to trade", "understand markets", "build knowledge" Dangerous framing: "get rich", "guaranteed profits", "earn money", "passive income"
| Gotcha | Detail | |--------|--------| | Country is permanent | Country, currency, timezone CANNOT be changed after creation | | Country locks default targeting | Must change at Ferramentas → Controles de audiência to target other countries | | Industry affects review | "Serviços financeiros" = 3-7 day review. "Internet services" = 24h | | Identity verification required | Phone SMS mandatory before accessing Events Manager | | India permanently banned | TikTok banned in India since June 2020. No advertising possible. | | Philippines unavailable | Philippines not available as targeting option for Brazil-based accounts (as of May 2026). Reason unknown — may be currency/region restriction. | | "Binary" in name = instant suspension | Accounts with company names containing binary-options brand terms have been auto-suspended on first publish — TikTok bans binary options; avoid such terms in brand naming. | | Account suspension is pre-emptive | Unlike Google Ads (which reviews ads individually), TikTok may suspend the entire account before any ad runs. No opportunity to prove compliance first. |
| Gotcha | Detail |
|--------|--------|
| "Vendas" has sub-destinations | Must select "Site" for website conversions (default is TikTok Shop) |
| URL field is TEXTAREA, not INPUT | input[placeholder*="URL"] won't find it |
| "Tailored ad variations" popup blocks everything | Cannot be dismissed. Work around with JS focus |
| File upload limit in Playwriter | 50MB limit in remote CDP. Compress with ffmpeg first |
| Gotcha | Detail |
|--------|--------|
| Use v1.3, NOT v1.2 | v1.2 endpoint /pixel/track/ has different payload structure |
| Auth header: Access-Token | NOT Authorization: Bearer |
| event_time: Unix seconds | NOT ISO 8601, NOT milliseconds |
| Event names: PascalCase | CompleteRegistration, Purchase. snake_case is silently dropped |
| PlaceAnOrder deprecated | Use Purchase |
| email/externalId: SHA-256 hashed | Lowercase + trim BEFORE hashing. ttclid: raw, NOT hashed |
For UI automation use the global AdsPower fallback ladder (reference/automation.md). The Playwriter notes below are retained as reference only; not the recommended path.
| Gotcha | Detail |
|--------|--------|
| Extension mode FAILS on TikTok Ads | Page redirects invalidate CDP sessions. Use --direct mode. |
| Direct mode requires chrome://inspect/#remote-debugging | User must enable manually |
| snapshot() often returns empty | Use screenshot() as fallback |
| TikTok uses Vue/React | evaluate() to set values doesn't trigger reactivity. Use click + type. |
tools
Use when working with André's self-hosted Google Workspace MCP (the `google-workspace` plugin) — driving Calendar, Gmail, Drive, Docs, Sheets, Slides, Forms, Tasks, Chat, or Contacts via the `mcp__plugin_google-workspace_workspace__*` tools, OR setting up / troubleshooting its OAuth (first-run consent, 7-day test-mode re-auth, credential storage). Covers the account-isolation rule (never use the `mcp__claude_ai_*` Google connectors — different account).
tools
Use when working with the Notion API or MCP — creating, editing, querying, or moving databases, data sources, pages, views (table/board/gallery/chart), formulas, rollups, relations, blocks, icons, or covers; or hitting Notion API/MCP errors (validation_error, pagination, permission, 400/409).
tools
YCloud — a multi-channel communications provider (CPaaS: WhatsApp, SMS, Voice, Email), not a Meta-only BSP. This skill covers its WhatsApp Business operations: console navigation, account creation/onboarding, Embedded Signup, campaigns/inbox/journeys, auto-unsubscribe chatbot, the public-API-vs-dashboard-backend distinction, BSP migration, and read-only CDP automation. Use when operating YCloud for WhatsApp dispatch: embedded signup, campaign sends, campaign analytics, inbox, auto-unsubscribe chatbot, opt-out attribution, dashboard automation. Triggers on: 'ycloud', 'CPaaS', 'BSP', 'bulk campaign', 'whatsapp dashboard', 'embedded signup', 'auto-unsubscribe', 'opt-out chatbot', 'campaign analytics', 'dispatch automation', 'ycloud free plan', 'zero markup', 'ycloud account creation', 'ycloud onboarding', 'ycloud signup code'.
development
YCloud v2 REST API reference for WhatsApp messaging via the BSP layer. Covers every callable endpoint: sending and listing messages (async and sendDirectly), template CRUD, phone number and WABA metadata, wallet balance, webhook management, contacts, unsubscribers/opt-outs, and media upload. Includes live-verified behavior deviations, pagination gotchas, and filter limitations. Use when calling the YCloud v2 REST API for WhatsApp — sending/listing messages, templates, phone numbers/WABA, wallet/balance, webhooks, contacts, unsubscribers, media, pagination gotchas. Triggers: 'ycloud api', 'X-API-Key', '/v2/whatsapp/messages', 'ycloud webhook', 'ycloud pagination', 'ycloud balance', 'sendDirectly', 'unsubscribers endpoint'.