Skip to content
Creative analyticsNew

Scaling a creative because it gets clicks?Check the cost per purchase and fatigue.

Basketly groups ads that reuse the same video or image into creatives. Each creative gets a cost per purchase and ROAS from Meta’s report, next to hook rate, hold rate and a fatigue signal.

Example data

Why it matters

Clicks look good. You pay for purchases.

The most clicks and video plays do not mean the most sales. What counts is the cost per purchase and how much a creative brings back for every unit of spend.

You scale the wrong creative

The creative with the highest CTR is not always the one with the cheapest purchase. Without cost per purchase and ROAS on every creative, budget follows clicks instead of sales.

You don’t know why the winner won

Creative number 7 sells, but what in it works: the hook, the creator, the offer? Without a label on each creative, every new batch is a guess.

Fatigue shows up too late

The cost per purchase creeps up week after week, and in a 400-row table nobody spots it until the budget is gone.

Example data

What you get

Everything about a creative on one card

Instead of hundreds of ad rows you see creatives: one card per video or image, with purchases, costs and video data side by side.

Cost per purchase and ROAS for every creative

Spend, purchases and their value from Meta’s report. Cost per purchase and ROAS are counted within one currency only, and a creative without purchases shows “—”, never 0.

One video, several ads, one creative

Ads that reuse the same video or image are counted together, even across campaigns and ad sets. The details list every ad on its own.

Hook rate, hold rate and CTR

Hook rate is 3-second plays divided by impressions, hold rate is ThruPlays divided by 3-second plays, and CTR is link clicks divided by impressions.

Which hook, creator and format wins

Tag creatives by hook, creator and offer; the format is detected from Meta. The breakdown adds up creatives with the same tag, lowest cost per purchase first.

Week by week, with a fatigue signal

“Possible fatigue” shows when, over the last 3 weeks, the creative spent at least 100 a week and its cost per purchase rose by at least 30% twice in a row. “Hook rate drop” means two drops in a row of at least 20%. Both are signals to check, not proof of the cause.

Compare 2 to 4 creatives

The creatives you pick side by side, the same metrics in rows. The best result in each row is marked.

  • Filters: period, ad account, campaign, format, tag
  • Card or table view
  • CSV export
  • Hide paused and inactive ads

Example data

What to test next

Material and copy, each on its own

A creative card tells you what sold. Clusters, Copy and Matrix split that result into the material and the ad copy, and show the combinations nobody has tried yet.

Clusters: every material with every copy

Materials in columns, ad copies in rows. A cell adds up the ads that combine the two, and its colour grades them by the metric you pick, from best to weakest. An empty cell is a combination nobody tested in the selected period.

  • Uploads of the same video or image and its versions for different audiences count as one material
  • The best combinations sit top left, by the metric you choose
  • A minimum spend: cells below it get no grade
  • Up to 24 materials and 24 copies with the highest spend

An empty cell as a paused ad

Click an untested combination and Basketly prepares an ad: the material, Page, button and destination from this material’s ad that spent the most in the period, with the copy from the chosen row as the primary text. The ad goes into that ad’s ad set and is created in Meta as paused. It spends nothing until you switch it on in Ads Manager.

  • Everything Basketly creates in Meta starts its name with [basketly.io], so it is easy to find and tell apart
  • Until the ad starts spending, its cell shows “Draft in Meta” with a link to Ads Manager
  • Created by an organisation owner or admin, up to 10 new ads an hour

Copy: which text works whatever the material

Every primary text with the results of all the ads it ran in, and the number of materials it ran with: the wider, the firmer the result. Copy features are compared by their share of spend against their share of Meta purchases, and AI tags read the hook, offer and tone from the text. Only the ad text goes to the AI model, never customer data.

Matrix: spend and purchases on one chart

Every creative is a dot. The diagonal is the average cost per purchase according to Meta, the vertical line is the median spend. Both axes use a square-root scale, so one big creative does not squeeze the rest into a corner.

A dynamic creative gets an ad set copy

A dynamic creative’s texts are set in its ad set, so the new text goes into a paused copy of the ad set, with the same settings and without its ads, holding one ad: the same assets, headlines and destination.

Hide paused and inactive

One switch keeps only the ads that are active right now in every list, total, cluster and comparison. Your browser remembers it.

Example data

How it works

From connecting Meta to your first creatives

No tagging in Ads Manager and no changes to your campaigns. All it takes is an ad account Meta reports purchases for.

  1. 1

    Connect your Meta ad account

    Log in with Meta and pick an ad account. For the analysis Basketly only reads ad data (the ads_read permission). It writes to Meta only when you create a new combination in Clusters yourself.

  2. 2

    Send purchases to Meta

    Meta credits ads with the purchases it knows about: from the Pixel and from the Conversions API. Basketly sends paid shop orders from the server, so purchases do not depend on the browser alone.

  3. 3

    Creatives add up on their own

    We pull spend, purchases, impressions and video data from Meta every hour, going 90 days back on the first sync. Ads with the same video or image merge into one creative.

How we count

The same rules as the campaign report, so the numbers match across pages.

The ranking, matrix, clusters and comparison cover Meta ads (Facebook and Instagram); Google Ads, Microsoft Ads, TikTok, Pinterest and ChatGPT Ads get their own tabs in Creatives with a list of ads. Purchases and ROAS come from the platforms’ reports, meaning their attribution: they show which creatives a platform credited with sales, but they do not prove that the creative caused the result.

  • The main metric is cost per purchase as Meta reports it
  • One purchase type per row (purchases across channels, otherwise from the Pixel and the Conversions API), never a sum of several
  • ROAS only within one ad account currency
  • A cost is shown only when there is something to divide by
  • Video data is for videos only: images and photo carousels get CTR and costs
Creative analytics

Frequently asked questions

Can’t find your question? Write to us

We pull spend, impressions, link clicks, video data, and purchases with their value from the Meta Marketing API with the ads_read permission, for the ad accounts you connect.

In part. When another channel has ad-level figures, Creatives get its tab: Google Ads ads (with a separate table of assets: headlines, descriptions, images, YouTube videos), Microsoft Ads, TikTok (with video covers), Pinterest and ChatGPT Ads (chat card title and text, no image), with spend, CTR, conversions and ROAS as the platform reports them plus Basketly orders. The ranking with fatigue, the matrix, clusters and comparison work for Meta only. Conversions of different channels are never added up.

Over the last 3 weeks the creative spent at least 100 a week in the account currency, and its cost per purchase rose by at least 30% twice in a row. It is a signal to take a look. The cost may also have risen because of seasonality, a different audience or a budget change.

Meta counts the purchases it attributes to its ads, with its own attribution. The shop counts every order, including search and newsletter ones. That is why creative purchases are never added to shop revenue; the whole picture is MER in the campaign report.

It is the purchase value according to Meta divided by the spend on the creative, in the ad account’s currency. When a creative spends in several currencies, neither cost nor ROAS is shown.

We never change existing campaigns, ad sets or ads. The analysis only reads data from Meta, and tags are stored on our side. The one write to Meta is a new ad from Clusters: an organisation owner or admin creates it with one click, always paused, with [basketly.io] at the start of its name. This needs a Meta login with the ad management permission and access to the ad’s Page.

Clusters add up the ads in the selected period and filters. An empty cell means no ad combined that material with that copy in this period. The combination may have run before, outside the selected period.

A new creative and ad in the ad set of this material’s ad that spent the most in the period: the same material, Page, button and destination, with the chosen copy as the primary text. The ad is paused, so it spends nothing until you switch it on in Ads Manager, and Meta reviews it before it runs. For a dynamic creative a paused ad set copy is created as well. The limit is 10 new ads an hour.

Only the ad’s primary text. Customer and order data never leave Basketly. The model picks the hook, offer and tone from a fixed list of values, and tags are read in the background.

Get started in under 5 minutes

Connect your shop and Meta and see how many purchases really arrive.

  • Free up to 100 orders a month
  • No developer needed
  • Purchase balance and self-check