Listing → Meta Ad Pipeline
SkillMediaTurn an Appeeky-generated ad creative into a draft Meta ad without doing the setup by hand. Once added, your AI can take a finished creative and build it out in Meta for you, from uploading the image to creating the ad set and the ad itself.
Available today. Use it from your connected AI after setup.
No other account needed.
After adding it, ask your AI to create a Facebook or Meta ad from one of your Appeeky creatives. Have the creative ready so it can upload the image and build the draft ad step by step.
Then ask your AI: use the Listing → Meta Ad Pipeline skill
What your AI can do with it
- Upload an Appeeky ad image to Meta
- Create a Meta ad creative from that image
- Set up the ad set for the campaign
- Create the ad itself as a draft in Meta
- Take a creative from generation to a draft Meta ad in one request
What this skill tells your AI
The instructions your AI receives, as published by appeeky/ua-skills in skills/ad-creative-to-meta/SKILL.md and read by ahel’s review.
End-to-end pipeline: App Store listing → Appeeky creative → Meta draft ad (PAUSED). User reviews tracking and creative before activation.
Automate the tedious steps. Never auto-activate without explicit user approval and verified MMP events.
Prerequisites Checklist
| Requirement | Verify via |
|---|---|
| Appeeky MCP connected | API key configured |
| Meta OAuth connected | meta_ads_credentials_status → connected |
| Default ad account | meta_ads_list_ad_accounts → meta_ads_set_default_ad_account |
| Facebook Page linked | meta_ads_list_pages |
| App in Events Manager | App ID + store URL |
| MMP live | mmp-setup — Purchase/Subscribe events last 7 days |
| Context doc | app-ads-context.md — CPA target, geo, budget |
meta_ads_credentials_status
If not connected:
meta_ads_oauth_start
Pipeline Overview
Preferred path — one-shot PAUSED app-install draft:
1. generate_app_ad_creative → imageUrl + copy
2. meta_ads_upload_ad_image_from_url → image_hash
3. meta_ads_list_advertisable_applications + meta_ads_list_pages
4. meta_ads_create_app_install_draft → campaign + ad set + creative + ad
5. User review → manual activate
Manual path (when you need a shared ad set for multiple variants):
1. generate_app_ad_creative → imageUrl + copy
2. meta_ads_upload_ad_image_from_url → image_hash
3. meta_ads_create_campaign → campaign_id (if new)
4. meta_ads_create_adset → adset_id (destination_type: APP)
5. meta_ads_create_creative → creative_id (format: app_install, name required)
6. meta_ads_create_ad → ad_id
7. User review → manual activate
All entities created PAUSED. Writes cost 2 Appeeky API credits each.
Step 1 — Generate Creative
Single creative or batch from prior skills:
generate_app_ad_creative
app_url: "https://apps.apple.com/us/app/id123456789"
mode: "generate"
style: "ugc"
image_preset: "person_holding_phone"
quality: "medium"
Poll:
get_app_ad_creative_job
job_id: "<job-id>"
Save:
result.ad.imageUrlresult.ad.copy.primaryTextresult.ad.copy.headlineresult.ad.copy.descriptionresult.ad.copy.callToAction
For batches (ad-creative-variants), repeat upload + ad creation per variant.
Step 2 — Upload Image to Meta
meta_ads_upload_ad_image_from_url
ad_account_id: "act_1234567890"
image_url: "https://cdn.appeeky.com/..."
Returns image_hash (or imageHash) — use in creative step.
| Error | Fix |
|---|---|
| Invalid URL | Ensure Appeeky CDN URL is public |
| Account mismatch | Verify ad_account_id |
| Token expired | Re-run OAuth |
Preferred path by monetization
MCP default for meta_ads_create_app_install_draft is APP_INSTALLS. That is wrong for subscription/IAP apps — Meta will optimize for cheap installs, not paying users.
| App type | Path |
|---|---|
| Subscription / IAP | Manual campaign → ad set with OFFSITE_CONVERSIONS + custom_event_type (below). Do not use the one-shot default. |
| Games / ad-supported | One-shot draft is fine. Pass optimization_goal: "APP_INSTALLS" explicitly. |
The one-shot tool does not accept custom_event_type on promoted_object. Use the manual ad set when optimizing to Purchase or Subscribe.
Use the manual campaign → ad set → creative → ad steps when attaching multiple variants to one shared ad set.
Step 3 — Create Campaign (if new)
Skip if adding ads to existing test campaign — use known campaign_id.
meta_ads_create_campaign
ad_account_id: "act_1234567890"
name: "FocusApp - App Installs - US"
objective: "OUTCOME_APP_PROMOTION"
status: "PAUSED"
is_adset_budget_sharing_enabled: false
Campaign Settings Reference
| Setting | Recommended | Notes |
|---|---|---|
| Objective | OUTCOME_APP_PROMOTION | App installs + events |
| Buying type | Auction (default) | |
| CBO | Off for first test | Ad set budget per test |
| Status | PAUSED | Always |
List existing:
meta_ads_list_campaigns
ad_account_id: "act_1234567890"
Step 4 — Create Ad Set
meta_ads_create_adset
ad_account_id: "act_1234567890"
campaign_id: "<campaign-id>"
name: "US - iOS - Creative Test"
daily_budget_minor: 5000
billing_event: "IMPRESSIONS"
optimization_goal: "OFFSITE_CONVERSIONS"
destination_type: "APP"
promoted_object: {
"application_id": "<meta-app-id>",
"object_store_url": "https://apps.apple.com/us/app/id123456789",
"custom_event_type": "PURCHASE"
}
targeting: { "geo_locations": { "countries": ["US"] } }
status: "PAUSED"
Use SUBSCRIBE if that is the primary MMP event. Meta rejects OFFSITE_CONVERSIONS without custom_event_type.
Ad Set Settings Reference
| Setting | Test value | Scale value |
|---|---|---|
| Daily budget | $30–50 (3000–5000 minor) | +20%/day on winners |
| Optimization | OFFSITE_CONVERSIONS + custom_event_type Purchase or Subscribe | Not APP_INSTALLS or Link Clicks |
| Destination | APP (destination_type) | Never leave default WEBSITE |
| Geo | US first | Expand after 7d stable CPA |
| Placements | Advantage+ ON | |
| Age | 18–65+ or app-specific | |
| Audience | Broad | LAL after 100+ converters |
iOS 14+ Notes
- AEM + SKAN: expect delayed reporting
- Trust MMP over Meta dashboard for iOS CPA
- Do not pause winners at 24h on iOS alone
Android Notes
- Google Play URL in
object_store_url - Same structure; often faster conversion feedback
Step 5 — Create Ad Creative
meta_ads_create_creative
ad_account_id: "act_1234567890"
format: "app_install"
name: "FocusApp - VarA - Problem"
page_id: "<facebook-page-id>"
link_url: "https://apps.apple.com/us/app/id123456789"
message: "<primaryText from Appeeky>"
headline: "<headline from Appeeky>"
description: "<description from Appeeky>"
image_hash: "<from step 2>"
call_to_action_type: "INSTALL_MOBILE_APP"
name is required. Default format is "link" — set "app_install" for store-install ads.
Creative Field Mapping
| Appeeky field | Meta field |
|---|---|
copy.primaryText | message |
copy.headline | headline |
copy.description | description (optional) |
copy.callToAction | call_to_action_type |
imageUrl → hash | image_hash |
Step 6 — Create Ad
meta_ads_create_ad
ad_account_id: "act_1234567890"
adset_id: "<adset-id>"
creative_id: "<creative-id>"
name: "FocusApp - VarA - Problem - 20250629"
status: "PAUSED"
Repeat steps 2, 5, 6 for each variant in a batch (shared campaign + ad set).
Step 7 — User Review
Present summary. Do not activate until checklist complete.
meta_ads_list_ads
ad_account_id: "act_1234567890"
Output Template
# Meta Ad Draft Created — [App Name]
**Status:** All entities PAUSED — awaiting your approval
| Entity | Name | ID | Status |
|--------|------|-----|--------|
| Campaign | FocusApp - App Installs - US | [id] | PAUSED |
| Ad Set | US - iOS - Creative Test | [id] | PAUSED |
| Creative | VarA - Problem | [id] | — |
| Ad | FocusApp - VarA - Problem | [id] | PAUSED |
## Copy Used
| Field | Value |
|-------|-------|
| Primary text | ... |
| Headline | ... |
| Description | ... |
| CTA | INSTALL_MOBILE_APP |
## Creative
- **Image preview:** [imageUrl]
- **Image hash:** [hash]
## Budget & Targeting
- **Daily budget:** $50
- **Geo:** US
- **Optimization:** Purchase
- **Placements:** Advantage+
## Before Activating
- [ ] MMP Purchase/Subscribe events in last 7 days (mmp-setup)
- [ ] Meta Events Manager shows app events
- [ ] User reviewed creative + copy
- [ ] iOS SKAN delay expectations set
- [ ] Target CPA documented in app-ads-context.md
## Activate (user confirms)
meta_ads_update_ad ad_id: "" status: "ACTIVE"
meta_ads_update_adset adset_id: "" status: "ACTIVE"
meta_ads_update_campaign campaign_id: "" status: "ACTIVE"
## 48h Follow-up
→ meta-campaign-audit
Batch Pipeline (5 variants)
| Step | Action |
|---|---|
| 1 | One generate batch (or 5 prior jobs) |
| 2 | 5× upload_ad_image_from_url |
| 3 | 1× campaign, 1× ad set |
| 4 | 5× creative + 5× ad |
Total write credits: ~(2 × 12) = ~24 API credits for full batch setup.
Error Reference
| Error | Cause | Fix |
|---|---|---|
| OAuth not connected | Missing Meta token | meta_ads_oauth_start |
| No Page | Page not linked to account | Connect Page in Business Settings |
| Invalid app link | Wrong store URL format | Use full App Store / Play URL |
application_id invalid | App not in Events Manager | Add app in Meta Events Manager |
| Policy rejection | Claims in copy | Soften primary text; review guidelines |
| Budget too low | Below Meta minimum | Raise daily_budget_minor |
| Creative rejected | Image text % / content | Edit via ad-creative-edit |
REST API Equivalents
Base: https://api.appeeky.com/v1/connect/meta-ads/
MCP tools hit the un-nested paths and pass ad_account_id. Nested aliases also exist.
| MCP tool | REST |
|---|---|
meta_ads_create_campaign | POST /campaigns or POST /ad-accounts/:adAccountId/campaigns |
meta_ads_create_adset | POST /adsets |
meta_ads_create_creative | POST /creatives |
meta_ads_upload_ad_image_from_url | POST /adimages/from-url |
meta_ads_create_app_install_draft | POST /app-install-drafts |
See appeeky-meta-ads.md.
Common Mistakes
| Mistake | Risk | Fix |
|---|---|---|
| Auto-activating | Spend without tracking | Always PAUSED first |
| Optimizing for installs only | Low-quality users | Optimize Purchase/Subscribe |
| Separate ad sets per variant (day 1) | Bad comparison | One ad set for test |
Wrong object_store_url | Broken deep link | Match platform to ad set |
| Skipping image re-upload after edit | Stale creative | Re-upload on every edit |
| No ad naming convention | Audit chaos | Use VarA/B/C pattern |
Pre-Flight Checklist
Appeeky:
- [ ] Creative job completed
- [ ] imageUrl + copy extracted
Meta auth:
- [ ] credentials_status connected
- [ ] Default ad account set
- [ ] Page ID confirmed
Tracking:
- [ ] mmp-setup complete
- [ ] promoted_object application_id correct
Pipeline:
- [ ] All entities PAUSED
- [ ] User has summary + preview
- [ ] 48h audit scheduled
Related Skills
meta-ad-creative— step 1 generationad-creative-variants— batch before pipelinead-creative-edit— fix creative before uploadmeta-campaign-setup— manual setup referencemmp-setup— prerequisite before activationmeta-campaign-audit— 48h performance reviewmeta-budget-optimizer— post-launch budget rules
Signals
- GitHub stars
- 55
- Forks
- 5
- Last commit
- Aug 2026
Advanced
- Catalog kind
- skill
- Gateway key
ad-creative-to-meta- Source
- github.com/appeeky/ua-skills