Cross-platform creative A/B testing for ads across Google, Meta, LinkedIn, X, Reddit, TikTok, and Amazon. Use for creative testing, ad variant analysis, winner selection, and performance comparison.
78%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Passed
No findings from the security scan
Fix and improve this skill with Tessl
tessl review fix ./skills/creative-testing/SKILL.mdA/B tests ad creatives across all connected advertising platforms. Creates test variants, monitors performance, determines statistical winners, and applies winning creatives platform-wide.
Read-only by default. This skill:
--apply flag to make any changespython3 scripts/create_test.py \
--name "Q1 2026 Hero Image Test" \
--platforms google,meta,linkedin \
--variants 3 \
--metric ctr \
--confidence 95 \
--min-impressions 1000 \
--output test_config.jsonpython3 scripts/upload_variants.py \
--test-id test_config.json \
--variant-a /path/to/hero_v1.png --headline-a "Try Free Today" \
--variant-b /path/to/hero_v2.png --headline-b "Start Your Trial" \
--variant-c /path/to/hero_v3.png --headline-c "Get Started Free"python3 scripts/monitor_test.py \
--test-id test_config.json \
--output performance.jsonpython3 scripts/analyze_results.py \
--test-id test_config.json \
--performance performance.json \
--output analysis.jsonpython3 scripts/apply_winner.py \
--test-id test_config.json \
--analysis analysis.json \
--dry-run
# Remove --dry-run to execute
python3 scripts/apply_winner.py \
--test-id test_config.json \
--analysis analysis.json \
--applypython3 scripts/monitor_test.py \
--all-active \
--summary-onlypython3 scripts/create_test.py \
--name "Headline Test" \
--platforms meta \
--type headline \
--variants 4 \
--metric ctrpython3 scripts/create_test.py \
--name "Image Test" \
--platforms google,meta \
--type image \
--variants 3 \
--metric cvrpython3 scripts/generate_report.py \
--test-id test_config.json \
--format markdown \
--output creative_report.mdpython3 scripts/sync_winner.py \
--test-id test_config.json \
--source-platform meta \
--target-platforms google,linkedin,tiktok \
--dry-runUses Bayesian A/B testing with Beta-Binomial model for CTR/CVR:
n = 2 × (Z_α/2 + Z_β)² × p(1-p) / δ²
Where:
- Z_α/2 = 1.96 (95% confidence)
- Z_β = 0.84 (80% power)
- p = expected baseline rate
- δ = minimum detectable effect| Metric | Formula | Use Case |
|---|---|---|
| CTR | Clicks / Impressions | Awareness campaigns |
| CVR | Conversions / Clicks | Conversion campaigns |
| CPC | Spend / Clicks | Cost efficiency |
| ROAS | Revenue / Spend | Revenue optimization |
| CPL | Spend / Leads | Lead generation |
| Parameter | Required | Default | Description |
|---|---|---|---|
--name | Yes | - | Test name for tracking |
--platforms | No | all | Comma-separated platform list |
--type | No | full | Test type: headline, image, video, full |
--variants | No | 2 | Number of variants (2-5) |
--metric | No | ctr | Primary metric: ctr, cvr, cpc, roas |
--confidence | No | 95 | Confidence level (90, 95, 99) |
--min-impressions | No | 1000 | Minimum impressions before analysis |
--max-duration | No | 14d | Maximum test duration |
--budget-split | No | equal | Budget allocation: equal, weighted |
--dry-run | No | false | Preview without applying |
--apply | No | false | Execute winner promotion |
| Script | Purpose |
|---|---|
create_test.py | Create new A/B test configuration |
upload_variants.py | Upload creative variants to platforms |
monitor_test.py | Track real-time performance metrics |
analyze_results.py | Statistical analysis and winner detection |
apply_winner.py | Promote winner, pause losers |
sync_winner.py | Replicate winning creative to other platforms |
generate_report.py | Create detailed test reports |
platform_creative_adapters.py | Platform-specific creative management |
{
"test_id": "ct_2026011801",
"name": "Q1 2026 Hero Image Test",
"created_at": "2026-01-18T10:00:00Z",
"status": "running",
"platforms": ["google", "meta", "linkedin"],
"type": "full",
"primary_metric": "ctr",
"confidence_level": 95,
"min_impressions": 1000,
"max_duration_days": 14,
"variants": [
{
"id": "A",
"name": "Control",
"headline": "Try Free Today",
"image_url": "https://your-cdn.com/creatives/hero_v1.png"
},
{
"id": "B",
"name": "Variant B",
"headline": "Start Your Trial",
"image_url": "https://your-cdn.com/creatives/hero_v2.png"
}
],
"budget_split": {
"A": 50,
"B": 50
}
}{
"test_id": "ct_2026011801",
"analyzed_at": "2026-01-25T10:00:00Z",
"status": "winner_found",
"winner": "B",
"confidence": 97.3,
"platforms": {
"google": {
"variants": {
"A": {
"impressions": 12500,
"clicks": 375,
"conversions": 45,
"spend": 187.50,
"ctr": 3.0,
"cvr": 12.0,
"cpc": 0.50
},
"B": {
"impressions": 12500,
"clicks": 500,
"conversions": 65,
"spend": 187.50,
"ctr": 4.0,
"cvr": 13.0,
"cpc": 0.375
}
},
"winner": "B",
"confidence": 98.5,
"lift": {
"ctr": 33.3,
"cvr": 8.3,
"cpc": -25.0
}
},
"meta": {
"variants": {
"A": {
"impressions": 18000,
"clicks": 540,
"conversions": 54,
"spend": 270.00,
"ctr": 3.0,
"cvr": 10.0,
"cpc": 0.50
},
"B": {
"impressions": 18000,
"clicks": 720,
"conversions": 79,
"spend": 270.00,
"ctr": 4.0,
"cvr": 11.0,
"cpc": 0.375
}
},
"winner": "B",
"confidence": 99.1,
"lift": {
"ctr": 33.3,
"cvr": 10.0,
"cpc": -25.0
}
}
},
"aggregate": {
"winner": "B",
"confidence": 97.3,
"total_impressions": 61000,
"lift": {
"ctr": 33.3,
"cvr": 9.5,
"cpc": -25.0
},
"recommendation": "Promote Variant B across all platforms. Expected +33% CTR improvement."
}
}Required environment variables:
# Platform Connection IDs
# Platform Account IDs
GOOGLE_ADS_CUSTOMER_ID
META_AD_ACCOUNT_ID
LINKEDIN_AD_ACCOUNT_ID
TWITTER_AD_ACCOUNT_ID
REDDIT_AD_ACCOUNT_ID
TIKTOK_ADVERTISER_ID
AMAZON_ADS_PROFILE_ID
# Google Ads specific
GOOGLE_ADS_DEVELOPER_TOKEN
GOOGLE_ADS_LOGIN_CUSTOMER_ID
# Database for test tracking
DATABASE_URL| Error | Cause | Solution |
|---|---|---|
INSUFFICIENT_DATA | Not enough impressions | Extend test duration or increase budget |
NO_WINNER | Variants too similar | Increase minimum detectable effect |
UPLOAD_FAILED | Creative rejected by platform | Check format/size requirements |
TEST_EXPIRED | Max duration reached | Analyze current data or restart |
VARIANT_PAUSED | Platform paused underperformer | May indicate quality issues |
SYNC_FAILED | Cross-platform sync error | Check target platform credentials |
Part of the Synter free skills collection — open-source agent skills for advertising, PPC, and marketing automation.
Want this skill (and 40+ more) running on autopilot against your live ad accounts? Try Synter — AI Agent Media Buyers that connect to Google, Meta, LinkedIn, TikTok, Reddit, Amazon, and 7+ more platforms.
Synter-Media-AI/free-skills
3df48f1
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.