Track ad spend per app without connecting an ads account

You don't need an MMP to know whether an app's ads pay off. Enter spend by hand or let Claude sync it over MCP, then judge it on profit, not installs.

By Torstein · · 5 min read

On this page
  1. What my own tests looked like
  2. Option A: enter spend by date range
  3. Option B: let your AI assistant sync it
  4. Judging it: profit, not installs
  5. What this doesn't do

When you run a few small apps and test ads on them, the hard question isn't "what was my CPI". The ad dashboards tell you that. The hard question is: after the ads, did this app make more money or less? That needs spend and revenue in the same place, per product, and most indie setups never get there.

This post shows two ways to get there without connecting an ad account or adding an attribution SDK.

What my own tests looked like#

I run ads on my own apps in small, time-boxed tests. Two recent ones show why install counts alone mislead:

  • GraceLock, Apple Search Ads. A short test with a small daily budget. Search Match pulled in unrelated apps, church and Bible-reader apps among them, and that is where most of the money went. Tightening the targeting brought the cost per install down sharply. The Apple Ads dashboard showed all of this. It could not say whether those installs ever paid back.
  • MyVisualRoutine, Facebook ads. About $80 sent close to 1,000 visitors to the website and a few hundred taps through to the stores, and new installs stayed flat. Facebook reported plenty of activity. The app's own numbers showed no lift.

In both cases, the useful view was the same one: spend for the period, next to that app's revenue and installs for the same days, with a before and after.

Option A: enter spend by date range#

The simplest version is a spreadsheet row per campaign: product, channel, amount, from, to. In Plask that is the ad spend form on the Sources page:

  • Pick the product and the channel: Apple Search Ads, Meta, Google Ads, TikTok, Reddit, X, Influencer or Other.
  • Enter the amount in the currency you paid in, and the date range.
  • The amount is spread evenly over the days in the range, and converted to USD at each day's reference rate.

Entering spend also drops a campaign marker on that product's charts, so the period is visible on every graph without extra work. Days with no spend entered count as zero, and the app tells you when a month has gaps, so a missing week doesn't quietly inflate your profit.

This is enough for most indie tests: one campaign, one app, a fixed budget.

Option B: let your AI assistant sync it#

If you run several campaigns, or want daily numbers instead of a lump sum, typing gets old. Plask has an MCP server, so an assistant like Claude or Cursor can write the spend for you from whatever you give it: an exported CSV, a screenshot of the ads dashboard, or numbers you paste.

A typical request looks like this:

Here's my Apple Search Ads export for September. Sync the daily spend to GraceLock as apple_search_ads, campaign "US exact".

What happens:

  1. The assistant calls list_products to find the product id.
  2. It calls sync_ad_spend with one row per day: date and amount, plus impressions, clicks and installs where the channel provides them.
  3. The spend shows up in the P&L after the next refresh.

A few rules make this safe to run more than once:

  • It's idempotent. A sync replaces only the exact dates it sends, for that product, channel and campaign. Run the same export twice and nothing changes, so nothing is counted twice.
  • It won't fight your manual entries. If you already entered spend by hand for the same product and channel on any of those days, the sync is refused rather than double counting. The same applies the other way round.
  • It can be undone. Every sync returns a batch id, and undo_batch restores exactly what was there before.
  • It needs permission. MCP is part of Pro, and API keys are read-only by default. Writing spend needs a key created with "Allow write access (ad spend and markers)" in Settings.

Supported channels over MCP are Meta, Apple Search Ads, Google Ads, TikTok and Other. For Apple Search Ads only the spend is stored. Like manual entry, a sync creates a campaign marker spanning the synced dates.

Judging it: profit, not installs#

Once spend sits next to revenue, every marker gets a plain verdict 14 days after it starts. Plask compares the 14 days before with the 14 days after, each side as net revenue minus ad spend, and says one of:

  • Paid off: profit went up by more than the product's normal swing.
  • Hurt: profit went down by more than the normal swing.
  • Too small: the change is inside the normal week-to-week swing, so there's nothing to conclude.
  • Too early: the 14 days after haven't passed yet.

The normal swing is measured from the product's own history over the 8 weeks before the marker, so a noisy app needs a bigger effect before Plask calls it.

"Too small" is the honest answer for most small indie tests, and it is worth hearing. It tells you a $50 test can't prove anything for an app at your volume, before you spend another $50 finding out the same way.

What this doesn't do#

This isn't attribution. Plask doesn't know which install came from which ad, and it won't give you per-keyword or per-creative ROAS. It tells you whether the product made more money, after the spend, than it did before. For a solo maker with several apps, that is usually the decision that matters: keep spending on this app, or move the money and the hour somewhere else.

If you need install-level attribution, you need an attribution SDK or a subscription platform's ad integration. If you need to know whether the ads paid off, spend next to revenue is enough.