Communitygithub.com

mardab96/tiktok-ads-claude-skills

Detects whether a TikTok ad is tiring by comparing the last seven distinct dates with the preceding seven for frequency and CTR, using the bundled fatigue_scan.py script and a 14-date rule, then builds a control-versus-refresh queue. Use when the user asks "is this TikTok ad fatigued", says CTR is dropping while frequency climbs, wants to know when to refresh TikTok creative, or pastes a daily ad export and asks which ads to replace.

tiktok-ads-claude-skills란 무엇인가요?

tiktok-ads-claude-skills is a Claude Code agent skill that detects whether a TikTok ad is tiring by comparing the last seven distinct dates with the preceding seven for frequency and CTR, using the bundled fatigue_scan.py script and a 14-date rule, then builds a control-versus-refresh queue. Use when the user asks "is this TikTok ad fatigued", says CTR is dropping while frequency climbs, wants to know when to refresh TikTok creative, or pastes a daily ad export and asks which ads to replace.

지원 대상✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/mardab96/tiktok-ads-claude-skills/tree/HEAD/creative-fatigue-detector-tiktok-ads

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

Creative Fatigue Detector - TikTok Ads

Use this skill when

You have daily ad-level data and want to know whether delivery is repeating on the same viewers while engagement slides. Deliver a ranked refresh queue with a retained control, not a pause list.

Common requests:

  • "Is this ad fatigued or is it just a bad week?"
  • "CTR keeps falling and frequency is up. Do I refresh?"
  • "Which of these ads should I replace first?"
  • "How often should I rotate creative on this account?"

When not to use

  • A new ad never got attention in its first seconds -> hook-rate-scorer-tiktok-ads.
  • CPA rose and the cause is unknown -> cpa-spike-diagnosis-tiktok-ads.
  • The ad group was edited or is still inside about 25 results or 7 days (T05) -> learning-phase-guard-tiktok-ads first.
  • The user wants new scripts after a verdict -> winning-ad-remix-tiktok-ads or ugc-brief-writer-tiktok-ads.

Required input

One daily CSV at ad level. fatigue_scan.py needs exactly these columns, spelled as below (rename headers if your export differs):

ColumnMeaning
dateISO format YYYY-MM-DD (a trailing time is ignored); other formats are skipped silently
adAd ID or a unique ad name; two ads sharing a name merge into one
impressionsDaily impressions
clicksDaily clicks; use one clicks column for the whole file
frequencyFrequency as the export labels it

Also include spend and conversions for corroboration. Export from Ads Manager Reporting (or Analytics, as labelled in your Ads Manager): ad level, daily breakdown by date, one row per ad per day, widest range that is still one creative era, saved with the date range in the filename. Do not split rows by placement, ad group, or country unless you sum them back to one row per ad per day first.

Also ask for: a creative preview or first-seconds description, an audience and budget change log, and the conversion lag. TikTok for Business MCP data is optional; a pasted export is enough.

Before analysis

  1. Confirm one row per ad per day. Duplicates are summed by the script and double the weighting, so deduplicate first.
  2. Confirm at least 14 distinct dates per ad. Fewer than 14 means the script prints insufficient_window and no verdict exists yet.
  3. Confirm dates are consecutive. fatigue_scan.py takes the last 7 distinct dates and the 7 before them, so an ad paused for 5 days has windows spanning more than 14 calendar days. Flag any gap before trusting a status.
  4. Note which frequency definition the export uses (daily or cumulative, as labelled in your Ads Manager). Frequency is weighted by impressions inside each window, so a cumulative figure rises by construction.

Running the script

python3 ../tiktok-ads-shared/scripts/fatigue_scan.py ads_daily_2026-09-01_2026-09-14.csv

Installed form: python3 ~/.claude/skills/tiktok-ads-shared/scripts/fatigue_scan.py <file.csv>. It makes no network calls and does not modify the file. Exit code 2 plus an ERROR: line means the file is unreadable or a required column is missing.

Output is a tab-separated table:

ad prior_dates current_dates prior_impr current_impr prior_ctr current_ctr prior_freq current_freq status

Reading it:

  • insufficient_window: fewer than 14 distinct dates. prior_dates shows how many dates exist. Verdict needs_data.
  • fatigue_candidate: both windows have at least 3,000 impressions, frequency rose at least 20%, and CTR fell at least 20% (T01).
  • monitor: anything else, including thin impressions or a zero prior CTR. monitor here does not mean healthy; read prior_impr and current_impr yourself.
  • An ad you expected is absent: every one of its dates failed to parse. Fix the date format and rerun.

Shared sample ../tiktok-ads-shared/examples/data/fatigue_daily.csv returns one fatigue_candidate and one insufficient_window row; compare against ../tiktok-ads-shared/examples/demo-outputs.md.

Analysis workflow

  1. Validate the file and run the script as above. Quote the raw output rows in the reply.
  2. Re-check floors by hand: both prior_impr and current_impr must reach 3,000 (T01). If not, the verdict is needs_data or monitor, never a fatigue call.
  3. Compute the two relative changes: frequency change = current_freq / prior_freq - 1; CTR change = current_ctr / prior_ctr - 1. T01 needs at least +20% and at most -20%.
  4. Locate the scope. Run the same two ratios on sibling ads in the same ad group. If most siblings fell together, suspect audience, season, auction, or tracking before the creative.
  5. Check alternates against the change log: audience or budget edits, a new ad splitting delivery, a bid change, learning re-entry (T05), a landing page change, a promo ending, a placement mix shift (placement-review-tiktok-ads).
  6. Corroborate with direction only: CPM up, CPA up, or conversions per click down in the current window. No threshold exists for these; treat them as support, not proof.
  7. Read the creative: how many seconds before the offer, whether the hook is a trend format, whether comments repeat the same objection (comment-objection-miner-tiktok-ads).
  8. Build the refresh queue: one retained control per ad group, one replacement concept per candidate, and one metric per test.

Decision rules

T01 is a heuristic, not a TikTok rule. It flags candidates; the verdict comes from the checks that follow.

ConditionVerdictNext step
Fewer than 14 distinct datesneeds_dataRe-export a wider range
Either window under 3,000 impressions (T01)needs_dataWait or widen; no fatigue call
Floors met, no candidatemonitorRescan after the next full week
Candidate, alternates unchecked or openpossibleClose the alternate checks
Candidate, siblings stable, no edits in either window, floors metlikelyApproval-ready refresh test
Candidate, siblings fell toopossible audience or auction issueRoute to placement-review-tiktok-ads or cpa-spike-diagnosis-tiktok-ads
Candidate inside a learning window (T05)holdlearning-phase-guard-tiktok-ads

Never mark fatigue confirmed from delivery data alone. confirmed belongs to the result of a controlled refresh test.

Output format

### Fatigue scan
Window: [prior dates] vs [current dates] | Clicks column: [label] | Frequency definition: [..] [ads_export]

| Ad | Prior / current impr | CTR change | Freq change | Script status | Verdict | Alternate explanation checked |
|---|---|---|---|---|---|---|

### Refresh queue
| Rank | Ad | T01 status | Control to retain | Replacement concept | Metric and window | Route |
|---|---|---|---|---|---|---|

### Decision table
| Finding | Evidence | Verdict | Severity | Confidence | Business impact | Next step |
|---|---|---|---|---|---|---|

### Data gaps
[missing item] -> [verdict it prevented]

### Approval needed
[refresh or swap] -> [named owner]. No ad was changed.

Practical example

Illustrative numbers only. Daily export for three ads in one ad group: 16 distinct dates for the first two, 9 for the third. Lag 7 days, no edits in the change log.

adprior_datescurrent_datesprior_imprcurrent_imprprior_ctrcurrent_ctrprior_freqcurrent_freqstatus
UGC-demo-017741200389001.10%0.82%1.802.30fatigue_candidate
UGC-demo-027740100393001.05%1.02%1.701.74monitor
Static-offer-0390000.00%0.00%0.000.00insufficient_window

Raw script output is tab-separated; the table above is the same data reformatted.

  • UGC-demo-01: frequency +27.8%, CTR -25.5%, floors met (T01). Sibling UGC-demo-02 in the same ad group held, and no edits are logged. Verdict likely, severity medium, impact conversion. Refresh: keep UGC-demo-01 as control, test a new first-2-seconds variant plus one new angle against it.
  • UGC-demo-02: monitor.
  • Static-offer-03: 9 dates, needs_data.

Common failure modes

  • Reading monitor as healthy when the window was thin.
  • Calling fatigue when every ad in the ad group fell together; that points at audience, season, or auction.
  • Comparing frequency definitions across exports: a cumulative figure rises by construction.
  • Running a gap-ridden file; the windows silently stretch past 14 calendar days.
  • Letting a budget cut or audience narrowing explain a frequency rise, then blaming the creative.
  • Pausing the control in the same step as launching the replacement, which removes the comparison.
  • Merging two ads that share a name, so one row blends two creatives.

Guardrails

  • Do not call fatigue from fewer than 14 distinct dates or from either window under 3,000 impressions (T01).
  • Do not call a monitor row healthy; state the impressions that produced it.
  • Do not invent a rotation cadence or a lifespan for creative; only the supplied data can justify a refresh.
  • Do not promise that a refresh will recover CTR or CPA.
  • Do not recommend pausing the control; propose a retained control and a matched replacement.
  • Do not hide the conversion lag, the clicks column used, or the frequency definition.
  • Do not change any live ad, budget, bid, or audience; stop at an approval-ready refresh queue.

Individual skills in this repo

This repo contains 18 individual skills — each has its own dedicated page.

mardab96/tiktok-ads-claude-skills

Runs an ordered, layer-by-layer triage of an unfamiliar TikTok Ads account (tracking, structure, learning, creative, bidding, landing page) and hands the first blocker to one named sibling skill. Use when the user inherits a TikTok account, onboards a client, asks where to start, says TikTok results dropped with no known cause, asks whether an account is ready to scale, or says "audit this TikTok account" without naming a problem.

mardab96/tiktok-ads-claude-skills

Reconciles TikTok Ads Manager conversions with GA4, Shopify, CRM, or app analytics using a baseline-ratio method, separating click-through from view-through credit, attribution window and timezone differences, and real tracking drift (T07). Use when a TikTok media buyer or client says "TikTok says 200 sales, Shopify says 90", "GA4 does not show our TikTok conversions", "TikTok ROAS looks too good", "the gap got bigger this month", or "which number do we report to the client".

mardab96/tiktok-ads-claude-skills

Checks whether a TikTok ad group's bidding strategy fits its goal, budget, and conversion volume using the labels TikTok currently lists (Maximum Results, Target Cost per Result, value options as shown in the account) and asks for a screenshot before mapping any legacy name. Use when someone types "Maximum Results or Target Cost per Result", "Cost Cap vs Lowest Cost on TikTok", "our target CPA is too low and delivery died", "bid strategy check", or "should we use hybrid bidding".

mardab96/tiktok-ads-claude-skills

Builds a staged TikTok budget plan with entry gates, one change per observation window, stop rules, and a recorded rollback, using T04, T05, T06, and T10 from the shared register. Use when someone types "can we scale this TikTok campaign", "double the budget on the winner", "how fast can I raise the daily budget", "scale before the sale", or "plan the budget increase for next week".

mardab96/tiktok-ads-claude-skills

Strips personal data from TikTok ad comments, clusters them into objections, questions, proof requests, and noise with counts, links each cluster to product facts, and drafts reply options and hook ideas for approval. Use when the user pastes TikTok comments and asks "what are people objecting to", "mine the comments for hooks", "draft replies to these comments", "what do viewers keep asking", or wants an FAQ and creative briefs built from comment themes.

mardab96/tiktok-ads-claude-skills

Diagnoses a TikTok CPA jump by splitting it into CPM, CTR, and CVR movement between a baseline and a current window with the cpa_decompose.py helper, then checking tracking, changes, mix, creative, and landing page in that order. Use when someone types "TikTok CPA doubled", "cost per purchase is up 40%", "why did CPA spike", "CVR dropped but clicks are fine", or "the client wants to know what broke".

mardab96/tiktok-ads-claude-skills

Turns TikTok Shop and GMV Max reporting into a per-product cost-stack ledger with refunds, affiliate commissions, seller-funded coupons, referral fees, ad spend, COGS, and seller-borne shipping, using gmv_profit.py to flag any incomplete cost stack (T09). Use when a TikTok Shop seller or media buyer says "GMV Max ROI looks great but we are not making money", "is this product profitable on TikTok Shop", "check our TikTok Shop margins", "affiliate commissions are eating us", or before raising a GMV Max budget or ROI target.

mardab96/tiktok-ads-claude-skills

Scores the opening seconds of TikTok ads by computing 2-second and 6-second view rates and a thumb-stop proxy from ad-level export columns, comparing them with like-for-like ads, and scoring the script opening on a five-point rubric. Use when the user asks "which TikTok hook is weak", "what's my hook rate", "why do people scroll past my ad", wants a hook test plan, or pastes a transcript of the first seconds next to video-view columns.

mardab96/tiktok-ads-claude-skills

Sequences planned TikTok edits around the learning phase, separating urgent repairs from optimisation, naming which edits TikTok itself labels as affecting learning, and ordering one observable action at a time with rollback. Use when someone types "can I edit this ad group during learning", "will this reset the learning phase", "campaign is in learning, what can we change", "sequence these changes", or "the client wants five edits this week".

mardab96/tiktok-ads-claude-skills

Checks TikTok Pixel and Events API health from Events Manager screenshots and an Ads Manager export, covering event match signals, event_id deduplication between browser and server events, parameter completeness on value events, and primary-event drops against stable clicks (T10). Use when a TikTok media buyer says "purchases dropped but clicks are flat", "check our TikTok pixel", "is Events API deduplicating", "Events Manager shows a diagnostic warning", "TikTok value does not match our orders", or before any bid, budget, or scale call that depends on TikTok conversion data.

mardab96/tiktok-ads-claude-skills

Reviews TikTok Ads delivery split between the TikTok placement and Pangle or TikTok Ad Network inventory (as labelled in your Ads Manager), testing CPA and downstream quality per placement against T08 and keeping brand safety and suitability as a separate question. Use when a TikTok media buyer says "should we turn off Pangle", "where is our TikTok spend actually going", "automatic placement is eating budget", "network traffic converts badly", "is our TikTok ad showing next to unsafe content", or when a client asks for a placement and brand safety readout.

mardab96/tiktok-ads-claude-skills

Reviews TikTok Search Ads search terms and keywords and decides what to add as a keyword, add as a negative, or watch, with match handling as labelled in the account and a lag-aware waste floor. Use when someone types "review our TikTok search terms", "negative keyword list for TikTok Search Ads", "which queries should become keywords", "broad match is bringing junk", or "Search Ads spend with zero conversions".

mardab96/tiktok-ads-claude-skills

Audits a TikTok Smart+ campaign by mapping what Smart+ automates against what the media buyer still controls (creative supply, audience exclusions, conversion event, budget, bidding), then ranks the risks. Use when someone types "audit our Smart+ campaign", "what does Smart+ actually control", "Smart+ vs manual", "Smart+ spend is up but results are flat", or "can we trust Smart+ with this budget".

mardab96/tiktok-ads-claude-skills

Compares TikTok Spark Ads with brand-handle ads like-for-like by matching objective, optimization event, audience, offer, placements, bidding label, dates, and concept before any metric is read, then records authorization status and designs a matched test when no clean pair exists. Use when the user asks "do Spark ads perform better than our brand ads", "Spark vs non-Spark", "should we boost creator posts", "why is the creator ad cheaper", or pastes ad-level data with a format column and wants a verdict.

mardab96/tiktok-ads-claude-skills

Writes a complete creator-facing UGC brief for TikTok ads, with viewer situation, one message, three hook options, scene structure, claims allowed and forbidden, do and don't lists, disclosure, usage rights, and a Spark authorization note, plus an internal approval checklist. Use when the user says "write a UGC brief for TikTok", "brief a creator", "I need a creator script with approved claims", "what rights do I need to run this creator video as an ad", or has product facts and needs something a creator can film from.

mardab96/tiktok-ads-claude-skills

Finds mature TikTok campaigns, ad groups, and ads that spent past a CPA-based floor with zero reported conversions, after excluding rows still inside the conversion lag, using the wasted_spend.py helper. Use when someone types "where is the wasted spend on TikTok", "which ad groups burn budget with no conversions", "what can we cut before we scale", "zero conversion ads", or "clean this account before the client call".

mardab96/tiktok-ads-claude-skills

Writes the weekly TikTok Ads client report as a plain-language narrative, a scorecard against the client goal, and next-week decisions with owners and approvals, after an integrity check on tracking, lag, and learning status (T04, T05, T07, T10). Use when an agency or freelance TikTok media buyer says "write the weekly TikTok report", "client update is due", "explain this week's TikTok results to the client", "what do we tell the client about CPA going up", or "set up a repeatable TikTok report format".

mardab96/tiktok-ads-claude-skills

Turns one proven TikTok ad into N distinct angle scripts, each with hook, body beats, CTA, on-screen text, and a shot list, after deconstructing why the winner worked and checking every claim against product facts and rights. Use when the user says "remix my winning TikTok ad", "give me new angles on this winner", "I need five scripts like this one", "my best ad is wearing out, what next", or pastes a winning transcript and asks for variations.

관련 스킬