Ad Creative Edit (Iterate)
Iterate on a previous Appeeky-generated ad using mode: edit. Use edits for incremental improvements on a winning or near-winning concept. Use fresh mode: generate for new angles, presets, or formats.
Editing is cheaper than guessing. Winners get A′/B′ variations; losers get retired, not endlessly patched.
When to Edit vs Re-Generate
| Situation | Use edit | Use generate |
|---|---|---|
| Bigger headline / font size | ✅ | |
| Background color / contrast | ✅ | |
| Minor layout tweak | ✅ | |
| Localize on-image text | ✅ | |
| New hook / new angle | ✅ | |
| Different preset (UGC → split) | ✅ | |
| Structural format change | ✅ | |
| Failed concept (low CTR + low CPA) | ✅ new variant |
Prerequisites
| Input | Source |
|---|---|
previous_ad object |
get_app_ad_creative_job → result.ad |
Same app_url |
Original generation |
Specific edit_instruction |
User request — must be concrete |
Optional key_points |
Preserved from analyze step |
previous_ad Fields (API result object, camelCase)
{
"style": "ugc",
"imagePreset": "person_holding_phone",
"creativeHeadline": "Plan your week in 5 min",
"creativeSubhead": "The focus app that sticks",
"imageUrl": "https://..."
}
If user has no job ID, reconstruct from Ads Manager export or screenshot description — quality drops without imageUrl.
Edit Instruction Framework
Good instructions are specific, visual, and bounded.
Instruction Template
Change [element] to [target state].
Keep [what must not change].
Examples
| Quality | Instruction |
|---|---|
| ✅ Good | "Make the on-image headline 30% larger, bold white text on navy background. Keep phone mockup position unchanged." |
| ✅ Good | "Switch background from gradient to solid charcoal. Increase contrast on subhead." |
| ✅ Good | "Translate on-image text to German. Keep layout identical." |
| ❌ Bad | "Make it better" |
| ❌ Bad | "More professional" (too vague) |
| ❌ Bad | "Copy competitor X" (use teardown + generate) |
Workflow
Step 1 — Load Previous Creative
get_app_ad_creative_job
job_id: "<original-job-id>"
Extract result.ad for previous_ad. Show user current image + copy before editing.
Step 2 — Clarify Instruction
If user request is vague, offer 2–3 concrete options:
Option A: Dark background + larger headline
Option B: Minimal white background, smaller subhead
Option C: Re-generate with professional preset (new job)
Step 3 — Call Edit API
MCP:
generate_app_ad_creative
app_url: "https://apps.apple.com/us/app/id123456789"
mode: "edit"
edit_instruction: "Make headline bigger, navy background, more contrast on CTA text"
previous_ad: {
"style": "ugc",
"imagePreset": "person_holding_phone",
"creativeHeadline": "Plan your week in 5 min",
"creativeSubhead": "The focus app that sticks",
"imageUrl": "https://..."
}
quality: "medium"
REST:
POST /v1/app-ad-creatives/generate
{
"appUrl": "https://apps.apple.com/us/app/id123456789",
"mode": "edit",
"editInstruction": "Make headline bigger, navy background, more contrast",
"previousAd": { ... },
"quality": "medium"
}
Step 4 — Poll Job
get_app_ad_creative_job
job_id: "<new-job-id>"
Poll every 3–5 seconds until completed or failed.
Step 5 — Present Before / After
Use output template. Ask user to pick version for Meta upload.
Edit Patterns That Work
| Request | Typical result | Notes |
|---|---|---|
| Bigger headline | Larger type, same layout | Specify % or "dominant" |
| Navy / dark background | Higher contrast | Good for feed thumb-stopping |
| More minimal | Reduced clutter | May remove decorative elements |
| Brighter / warmer | Lifestyle feel | Pairs with lifestyle style |
| Localize text | Translated on-image copy | Specify language code |
| Show different screenshot | Partial change | May need MCP extra_screenshot_urls (REST extraScreenshotUrls) + generate |
| Add rating stars | Social proof overlay | Only if accurate per listing |
Edit Patterns That Fail
| Request | Why | Alternative |
|---|---|---|
| "Make it viral" | Not a visual parameter | New angle via generate |
| Change aspect ratio | API outputs 1024×1024 | Crop in design tool |
| Add video motion | Static API | tiktok-creative-strategy |
| Copy exact competitor layout | IP/policy risk | Teardown-inspired generate |
| Fix fundamentally weak hook | Copy problem | New angle in generate |
Winner Iteration Playbook (A′ / B′)
After meta-campaign-audit identifies a winner:
| Iteration | edit_instruction focus | Goal |
|---|---|---|
| A′ hook | Change on-image headline text only | Isolate hook |
| A′ visual | Background / contrast tweak | CTR lift |
| A′ proof | Add rating or user count | CVR lift |
| A′ localize | Translate for EU geo test | Geo expansion |
Rule: One change per edit job. Multi-variable edits obscure what worked.
# Winner A′ — hook tweak only
generate_app_ad_creative
app_url: "https://apps.apple.com/us/app/id123456789"
mode: "edit"
edit_instruction: "Change headline to 'Stop juggling 4 apps.' Keep all visual styling identical."
previous_ad: { ...winner A... }
Copy-Only Refresh
If image is fine but Meta copy underperforms:
generate_app_ad_creative
app_url: "https://apps.apple.com/us/app/id123456789"
mode: "analyze"
generate_image: false
angle: "new hook: outcome-first for busy parents"
Then manually update Ads Manager text — or re-generate image if on-image text must match.
Credit Costs
| Quality | Creative credits |
|---|---|
low |
1 |
medium |
2 |
high |
5 |
Same as generate. Inform user before each edit round.
Typical iteration session: 2–3 edits × medium = 4–6 creative credits.
Output Template
# Ad Creative Edit — [App Name]
## Edit Request
"[user instruction]"
## Before
- **Image:** [previous imageUrl]
- **Headline:** [previous creativeHeadline]
- **Subhead:** [previous creativeSubhead]
- **Primary text:** [previous copy.primaryText]
## After
- **Image:** [new imageUrl]
- **Headline:** [new creativeHeadline]
- **Subhead:** [new creativeSubhead]
- **Primary text:** [new copy.primaryText]
## Copy Changes (if any)
| Field | Before | After |
|-------|--------|-------|
| Primary text | | |
| Headline | | |
## Recommendation
- [ ] Ship to Meta (replace ad or new ad in same set)
- [ ] Edit again (specify next change)
- [ ] Re-generate fresh angle
## Meta Action
- Replace creative: upload new image → new ad OR swap in ad-creative-to-meta pipeline
- Keep loser paused — do not delete (learning history)
Meta Upload After Edit
Edited image must be re-uploaded to Meta:
meta_ads_upload_ad_image_from_url
ad_account_id: "act_xxx"
image_url: "<new imageUrl from edit result>"
Then create new ad with new imageHash — see ad-creative-to-meta. Pausing old ad preserves audit trail.
Benchmarks (edit impact)
| Metric | Expectation |
|---|---|
| CTR lift from contrast edit | +10–25% if original was low contrast |
| CTR lift from hook-only edit | +15–40% if new hook stronger |
| CPA change | Follows CTR × CVR — measure 48h |
| Diminishing returns | After 3 edits, re-generate new angle |
Common Mistakes
| Mistake | Fix |
|---|---|
| Editing losers instead of killing | Pause at 2× CPA; edit winners only |
| Stacking 5 edits on one ad | One variable per edit |
No imageUrl in previous_ad |
Always save job results |
| Editing without audit data | Let data pick the winner first |
| Same primary text, new image only | Align on-image and feed copy |
Pre-Edit Checklist
- [ ] Original job_id and previous_ad saved
- [ ] User instruction is specific and bounded
- [ ] Credit cost communicated
- [ ] Confirmed edit vs re-generate decision
- [ ] Poll completed before presenting
- [ ] Meta re-upload planned if going live
Related Skills
meta-ad-creative— fresh generation from listingad-creative-variants— initial batch before editsad-creative-to-meta— publish edited creativemeta-campaign-audit— identify which ad deserves A′competitor-ad-teardown— inspiration for new angles (not edits)screenshot-optimization(aso-skills) — if edit needs new screenshot source