Guide · Apple Ads · ASO
Which Apple Ads keywords actually make money?
Most indie ASO stacks answer one question well: where do I rank?That's useful. It's also incomplete. If you run Apple Search Ads, the question that pays the rent is different.
For each keyword, after organic rank, ad spend, and subscription revenue are joined over the same window: should I bid,pause, or double down?
This guide is the playbook behind that question. It's written for indie iOS developers on a Mac who don't want a $100+/mo enterprise suite just to stop lighting money on fire.
What you'll walk away with
- A simple three-signal model: rank × ads × revenue
- Four verdicts you can apply manually this week (even in a spreadsheet)
- How cannibalization actually shows up in Apple Ads
- A practical weekly review ritual
- Where native tools (and Veldo) fit if you want the join automated
The trap: optimizing keywords in three different tabs
A normal indie workflow looks like this:
| Tab | What you see | What you decide |
|---|---|---|
| App Store Connect / rank tracker | Organic position | “We're #8, nice” |
| Apple Ads | CPA, taps, spend | “This KW is expensive” |
| RevenueCat / ASC proceeds | MRR, trials | “Revenue is… fine?” |
None of those tools is wrong. The failure mode is unjoined time windows and unjoined grain.
- Rank is daily and storefront-specific.
- Ads are campaign/ad-group/keyword and often looked at on 7- or 30-day CPA.
- Revenue is delayed (trials, refunds, tax) and rarely attributed back to the search term that started the story.
So people do the rational-but-broken thing:
- Scale keywords with cheap CPAs that never subscribe.
- Keep exact-match ads on terms where they already sit at #1–#3 organically.
- Cut keywords that look “expensive” but produce the only high-LTV users in the set.
ASO without revenue is a ranking hobby. Ads without organic context is a CPA hobby. Indie budgets need both in one row.
The three-signal model
For every keyword (exact match first), collect one row:
| Field | Source | Notes |
|---|---|---|
| Keyword | Your list | Prefer exact; broad later |
| Storefront | US, DE, JP… | Don't blend blindly |
| Organic rank (today + 7/30d trend) | Rank tracker / ASA discovery | 200+ = not visible |
| Search popularity | Apple Ads API | Apple's own signal |
| Difficulty proxy | Strength of top 10 | Optional but useful |
| Spend 30d | Apple Ads | Exact keyword or exact ad group |
| Installs 30d (paid) | Apple Ads | |
| Attributed revenue 30d | RevenueCat / your attribution | Even imperfect is better than none |
| Organic installs estimate | Optional | Hard; don't block on perfection |
You don't need perfect multi-touch attribution to get leverage. You needdirectional truth on a 30-day window, reviewed weekly.
The only equation that matters (conceptually)
Keyword health ≈ f(visibility, demand, paid efficiency, paid→revenue)- Visibility → organic rank trajectory
- Demand → popularity + impression share / tap volume
- Paid efficiency → spend vs installs
- Paid→revenue → spend vs attributed trials/subs
Rank alone can't tell you to pause. CPA alone can't tell you you're cannibalizing. Revenue alone can't tell you the keyword is even discoverable.
Four verdicts (use these labels)
Steal the language. Put it on a column. Act weekly.
1. Double down
Pattern
- Attributed revenue ≥ spend (or clearly on a path you accept)
- Organic rank stable or improving
- Demand real (popularity / volume not dead)
Action
- Raise test budget in controlled steps
- Protect the keyword in metadata (title/subtitle/keyword field; use a character counter)
- Consider a custom product page aligned to that intent (CPP + keywords)
2. Bid opportunity
Pattern
- Popularity high / clear demand
- Organic rank weak or missing
- Little or no exact campaign live
Action
- Launch exact match with a tight bid cap
- 7–14 day test, not a forever campaign
- Write metadata that matches the query intent before you scale
3. Cannibalizing
Pattern
- Organic rank already near the top (roughly top 3–5 for competitive terms; top 10 for long-tail; use judgment)
- Exact ad still spending meaningfully
- Total installs barely move when you pause a short test (or ROAS is mediocre because you're paying for users who'd tap organic)
Action
- Pause exact match for 7–14 days
- Watch total installs and trials, not only paid
- If total holds, keep it off or move budget to discovery/conquest terms
- If total drops hard, the ad was incremental; restore with a lower bid
Cannibalization is not a moral failure. It's a budget allocation problem. Paying Apple for a tap you would have won organically is optional.
4. Money pit
Pattern
- Spend continues
- Attributed revenue ~0 over a fair window (mind trial length)
- Rank not improving enough to justify “brand building” stories
Action
- Cut or slash bid
- Reallocate to Double down / Bid opportunity
- Only keep if you have a deliberate non-revenue goal (e.g., category defense) written down; vibes don't count
Sample ledger (illustrative)
| Keyword | Rank | Δ | Spend 30d | Revenue 30d | Verdict |
|---|---|---|---|---|---|
| habit tracker | #8 | ↑6 | $92 | $241 | Double down |
| meditation timer | #2 | 0 | $184 | $118 | Cannibalizing |
| sleep sounds | 200+ | 0 | $263 | $0 | Money pit |
| breathing exercises | #38 | 0 | $0 | $0 | Bid opportunity |
This is the table Veldo is built around: same join, on your Mac, with a verdict instead of a hunch. You can start in Numbers today; automation is optional until the habit sticks.
Organic ASO and Apple Ads are one system
Metadata feeds both
Your title, subtitle, and 100-character keyword field influence:
- Organic ranking eligibility
- Which searches your product page is relevant for
- How Search Match and discovery features behave in ads
If ads teach you that breathing exercises converts and organics never show you for it, that's a metadata + creatives job, not only a bid job.
Custom product pages change the end of the funnel
With keyword assignment to CPPs, a converting paid/organic query can land on screenshots that match intent. That's conversion rate work sitting next to keyword work, so treat them as one loop. (See ourCPP keywords note.)
Brand vs non-brand
- Brand terms: usually protect with low bids; watch cannibalization vs pure defense.
- Category generics: where verdicts pay for themselves.
- Competitor conquesting: often ugly CPA; only keep if revenue (or strategic share) clears a bar you defined in advance.
A weekly 45-minute ritual (indie-sized)
Every Monday (or after weekend spend settles):
- Export or open last 30 days of keyword spend (exact).
- Refresh organic ranks for the same list + storefronts you care about.
- Pull attributed revenue if you have it (RevenueCat cohorts are fine).
- Tag each keyword with one verdict.
- Execute at most three changes:
- 1 pause test (cannibalization or money pit)
- 1 bid increase (double down)
- 1 new exact test (bid opportunity)
- Write one line in a log: what you changed and what you expect in 14 days.
Indies lose less to bad strategy than to unreviewed automation. Cap the changes so you can learn.
Attribution reality check (don't wait for perfect)
You will not get agency-grade multi-touch on day one. Good enough looks like:
- RevenueCat + Apple Ads campaign names that encode keyword or ad group
- Conservative windows that respect your trial length (7-day trial ⇒ don't judge revenue on day 3)
- Separate “probation” for brand new keywords vs mature ones
If revenue join is impossible this month, still run verdicts onrank + spend + paid installs, and promote revenue join as soon as you can. Half a join beats three dashboards.
Tooling: spreadsheet vs suite vs native Mac
| Approach | Pros | Cons |
|---|---|---|
| Spreadsheet | Free, flexible | Breaks, no daily ranks, no alerts |
| Enterprise ASO (Sensor Tower, AppTweak, …) | Deep data | Price, overkill, web-only for most indies |
| Appfigures-class analytics | Great reporting | Keyword tracking often capped/metered; see Appfigures alternative |
| Native Mac rank tools (e.g. Astro) | Fast local UX | Often stop at rank/popularity; see Veldo vs Astro |
| Veldo | Rank + Ads spend + revenue join, local data, verdicts, unlimited keywords, CLI/MCP | Mac-only, waitlist/launching |
If you only need ranks, a focused tracker is enough. If you run Apple Ads and subscriptions, the join is the product.
For a wider map: Best ASO tools for indie developers (2026). For why native matters:ASO tools for Mac.
How Veldo encodes this playbook
Veldo is a native Mac app that:
- Tracks organic ranks across 60+ storefronts
- Pulls Apple Ads spend, installs, and Apple's popularity
- Optionally joins RevenueCat revenue per keyword
- Emits a first-match verdict with the evidence under it
- Notifies when a verdict flips (watchdog)
- Keeps acquisition data on your Mac (SQLite + Keychain)
- Exposes read-only CLI/MCP so agents can answer “what am I wasting money on?” without mutating campaigns
Pricing on purpose: $8.99/mo or $99/yr. Pay for the tool, not a percentage of ad spend.
FAQ
Do Apple Ads help organic rankings?
Apple has said relevance and user behavior matter for search. Paid traffic can indirectly help if users install and engage, but buying a keyword is not a guaranteed organic boost. Treat ads as acquisition first; treat any organic lift as a bonus you measure, not a promise you bank on.
Should I pause exact match if I rank #1?
Often worth a timed test. If total installs and trials hold, you were renting your own demand. If they fall, the ad was incremental; bring it back at a saner bid.
How long before I call something a money pit?
At least one full trial + conversion cycle, and enough spend that noise isn't the story. For many subscription apps, 14–30 days of honest data beats gut feel. Brand-new apps may need longer for statistics, but still set a max burn.
Do I need RevenueCat?
No for rank/spend/install verdicts. Yes (or equivalent) if you want revenue-aware double-down vs vanity installs. Veldo works without it; revenue columns stay empty until connected.
Exact vs broad match?
Run verdicts on exact first. Broad is a discovery hose; it will muddy keyword-level truth. Promote winners from search terms reports into exact tests.
How is this different from CPA optimization in Apple Ads Manager?
CPA optimization ignores organic rank and often ignores subscription revenue quality. A low-CPA keyword that never pays, or a mid-CPA keyword you already own organically, both look “fine” in Ads alone.
Next steps
- Build the four-column ledger for your top 25 keywords this week.
- Run one cannibalization pause test and one bid-opportunity exact.
- Pack your metadata with a keyword field counter.
- If you want the join automated on your Mac, join the Veldo waitlist.
- Prefer agents in your editor? See Veldo MCP.
Every keyword needs a next move. Rank is a signal. Revenue is the scoreboard.