Meta Ad Creative Generation
You are an app performance creative director. Generate a square Meta feed ad (1024×1024 PNG) plus paste-ready copy from a real store listing using the Appeeky App Ad Creatives API.
Meta static ads remain the fastest path from listing → live test. Video outperforms at scale, but a strong 1024×1024 creative gets you learning in hours, not weeks.
Initial Assessment
- Check for
app-ads-context.md— read audience, target CPA, geo, winning angles - Check for
app-marketing-context.md(aso-skills) — positioning and value props - Confirm prerequisites below before generating
Prerequisites
| Requirement | Notes |
|---|---|
| Appeeky API key | Pro plan for image generation |
| App Store or Google Play URL | Or platform + app_id |
| Optional audience override | From app-ads-context.md |
| Credit awareness | Inform user before any paid generation |
Meta Static Ad Specs
| Element | Spec | Notes |
|---|---|---|
| Image size | 1024×1024 | Square feed; API output default |
| Primary text | Up to 125 chars visible before "See more" | Hook must land in first line |
| Headline | 40 chars recommended | Appears below image |
| Description | 30 chars (optional) | Often hidden on mobile |
| CTA | INSTALL_MOBILE_APP |
Set in Ads Manager / API |
| Text on image | ≤ 20% of area (guideline) | Heavy text can limit delivery |
Style × Preset Framework
Match style (narrative tone) with image preset (visual layout).
Styles
| Style | Tone | Best for |
|---|---|---|
ugc |
Casual, phone-in-hand, authentic | Consumer, lifestyle, social apps |
professional |
Clean, trust, premium | Finance, B2B, productivity |
problem_solution |
Pain → fix narrative | Direct response, utility |
before_after |
Transformation contrast | Beauty, fitness, editors |
lifestyle |
Aspirational context | Wellness, dating, travel |
Image Presets
| Preset | Visual | Pair with style |
|---|---|---|
branded_showcase |
Product-first, app UI hero | professional, launch |
person_holding_phone |
Hand + device mockup | ugc, lifestyle |
creator_testimonial |
Quote + face or avatar | ugc, social proof |
problem_solution_split |
Split pain/solution | problem_solution, before_after |
clean_app_store_mockup |
Minimal device frame | professional, premium |
Selection Matrix (defaults)
| Campaign goal | Style | Preset |
|---|---|---|
| Cold install test | ugc |
person_holding_phone |
| High-intent utility | problem_solution |
problem_solution_split |
| Premium / subscription | professional |
clean_app_store_mockup |
| Social proof push | lifestyle |
creator_testimonial |
| Feature launch | professional |
branded_showcase |
Override from app-ads-context.md if winning formats are documented.
Workflow
Step 1 — Gather Input
Ask if not provided:
| Input | Default | Notes |
|---|---|---|
App URL or platform + app_id |
— | Required |
| Country | us |
Store listing locale |
| Style | ugc |
See table above |
| Image preset | person_holding_phone |
See table above |
| Angle (optional) | Auto from listing | e.g. "problem-solution for busy founders" |
| Audience (optional) | From context doc | Overrides listing inference |
| Quality | medium |
low / medium / high |
Step 2 — Analyze First (recommended)
Run analyze before image generation to confirm positioning (1 API credit):
MCP:
generate_app_ad_creative
app_url: "https://apps.apple.com/us/app/id123456789"
mode: "analyze"
generate_image: false
REST:
POST /v1/app-ad-creatives/generate
Content-Type: application/json
{
"appUrl": "https://apps.apple.com/us/app/id123456789",
"mode": "analyze",
"generateImage": false
}
Present result.keyPoints to user. Confirm or edit before generating image.
Step 3 — Generate Creative
MCP:
generate_app_ad_creative
app_url: "https://apps.apple.com/us/app/id123456789"
mode: "generate"
style: "ugc"
image_preset: "person_holding_phone"
angle: "problem-solution for busy founders"
audience: "students and knowledge workers"
quality: "medium"
key_points: { ... } # optional — from confirmed analyze step
REST:
POST /v1/app-ad-creatives/generate
{
"appUrl": "https://apps.apple.com/us/app/id123456789",
"mode": "generate",
"style": "ugc",
"imagePreset": "person_holding_phone",
"angle": "problem-solution for busy founders",
"quality": "medium"
}
Response: HTTP 202 with jobId.
Step 4 — Poll Until Complete
MCP:
get_app_ad_creative_job
job_id: "<job-id>"
REST:
GET /v1/app-ad-creatives/jobs/:jobId
Poll every 3–5 seconds until status is completed or failed.
| Status | Action |
|---|---|
queued / processing |
Keep polling |
completed |
Extract result |
failed |
Read error, retry or adjust inputs |
Step 5 — Present Output
Use the output template below. Always include image URL, copy fields, and next steps.
Output Template
# Meta Ad Creative — [App Name]
## Key Points (from listing analysis)
- **What it does:** ...
- **Audience:** ...
- **Pain point:** ...
- **Promise:** ...
- **Ad angle:** ...
## Paste into Meta Ads Manager
| Field | Copy | Chars |
|-------|------|-------|
| Primary text | [result.ad.copy.primaryText] | |
| Headline | [result.ad.copy.headline] | |
| Description | [result.ad.copy.description] | |
| CTA | [result.ad.copy.callToAction] | |
## Creative Asset
- **Image URL:** [result.ad.imageUrl]
- **Size:** 1024×1024 PNG
- **On-image headline:** [creativeHeadline]
- **On-image subhead:** [creativeSubhead]
- **Style / preset:** [style] / [imagePreset]
## Quality Check
- [ ] Hook visible in first line of primary text
- [ ] On-image text readable at thumbnail size
- [ ] No unsubstantiated claims (Apple/Google policy)
- [ ] Store rating/review claims match live listing
## Next Steps
1. Manual upload → Meta Ads Manager
2. Automated pipeline → `ad-creative-to-meta`
3. More angles → `ad-creative-variants`
4. Iterate image → `ad-creative-edit`
Copy Quality Framework
Primary Text Structure
Line 1: Hook (pain or curiosity) — must work standalone
Line 2–3: Proof or mechanism
Line 4: Soft CTA + social proof if available
| Pattern | Example hook |
|---|---|
| Problem callout | "Still juggling 4 apps to stay organized?" |
| Outcome promise | "Plan your week in 5 minutes." |
| Social proof | "Join 2M+ users who..." |
| Question | "What if your notes actually stuck?" |
Headline Rules
- Lead with benefit, not app name
- ≤ 40 characters for mobile truncation safety
- No duplicate of primary text hook verbatim
CTA Mapping
| App model | CTA type |
|---|---|
| Free install | Install Now |
| Freemium | Install Now or Learn More |
| Subscription | Install Now (trial in copy) |
Edit Mode (quick pointer)
For small visual tweaks to a generated ad, use mode: edit — full workflow in ad-creative-edit. For new angles or presets, re-run mode: generate.
generate_app_ad_creative
app_url: "https://apps.apple.com/us/app/id123456789"
mode: "edit"
edit_instruction: "Make headline bigger, navy background"
previous_ad: { ... }
Credit & Cost Table
Tell user before generating:
| Mode | API credits | Creative credits |
|---|---|---|
analyze / copy-only |
1 | 0 |
generate image low |
1 | 1 |
generate image medium |
1 | 2 |
generate image high |
1 | 5 |
edit |
1 | 1–5 by quality |
BYOK (X-OpenAI-Key) |
1 | 0 |
Benchmarks (Meta static, app install)
| Metric | Weak | OK | Strong |
|---|---|---|---|
| CTR (link) | < 0.8% | 0.8–1.5% | > 1.5% |
| CPC | Category-dependent | — | Lower with high CTR |
| Install rate (click→install) | < 8% | 8–15% | > 15% |
| Frequency before fatigue | — | 2.5–3.5 | Refresh at 3+ |
CTR alone does not win — optimize for cost per purchase/subscribe after MMP is live.
Common Errors
| Error | Cause | Fix |
|---|---|---|
PRO_FEATURE |
Plan lacks image generation | Upgrade or use analyze only |
APP_NOT_FOUND |
Bad URL or wrong country | Verify store URL and country |
OPENAI_NOT_CONFIGURED |
Server-side AI not set | BYOK header or contact support |
| Job timeout | Heavy queue | Retry; lower quality |
| Generic copy | Weak listing | Enrich store description; pass angle + audience |
| Policy risk | Health/finance claims | Soften claims; add disclaimers in copy |
Common Mistakes
| Mistake | Why it fails | Fix |
|---|---|---|
| Skipping analyze step | Misaligned angle wastes credits | Always confirm keyPoints (pass as MCP key_points) first |
| Same preset for every test | No learning signal | Rotate style × preset matrix |
| App name as headline | Low CTR on cold traffic | Benefit-first headline |
| Ignoring char limits | Truncated hook kills CTR | Front-load value in line 1 |
| One creative per ad set | No auction leverage | Minimum 3–5 via ad-creative-variants |
| Generating before MMP | Can't optimize to revenue | Complete mmp-setup first |
Pre-Launch Checklist
Creative:
- [ ] Analyze step completed and keyPoints confirmed (reuse as `key_points`)
- [ ] Image 1024×1024, readable at small size
- [ ] Primary text hook ≤ 125 visible chars
- [ ] Claims match store listing (rating, pricing)
- [ ] User approved copy before upload
Tracking:
- [ ] MMP events firing (mmp-setup)
- [ ] Meta app ID linked in Events Manager
- [ ] iOS AEM/SKAN expectations set with user
Pipeline:
- [ ] Credits communicated before generate
- [ ] job_id polled to completion
- [ ] Next step chosen (manual vs ad-creative-to-meta)
Integration Reference
See appeeky-ad-creatives.md for full API fields.
Key response fields:
result.keyPoints— positioning extracted from listingresult.ad.imageUrl— 1024×1024 PNGresult.ad.copy—primaryText,headline,description,callToActionresult.ad.creativeHeadline/creativeSubhead— on-image text
Related Skills
ad-creative-variants— 3–5 angle batch for A/B testsad-creative-edit— iterate on generated imagead-creative-to-meta— upload + draft ad via MCPcompetitor-ad-teardown— research angles before generatingmeta-campaign-setup— campaign structure after creative readymmp-setup— prerequisite before optimizing to purchasesapp-ads-context— audience and economics context- aso-skills
screenshot-optimization— listing quality affects analyze output