Retail and e-commerce · Paid media

Unified paid media

Google, Meta, TikTok and marketplace ads in one table, with ROAS measured against the sales the store and the ERP recorded, not against what each platform claims it sold.

UsageWidely used
EffortMedium
ForRetailers and e-commerce businesses that invest in more than one media platform and need to know how much of it came back as real sales.
Source

Platform insights, marketplace ads and store or ERP orders

Rule

Conversion by type, unmeasured value as null, spend linked to product and store

Outcome

Spend, contacts, real ROAS and TACOS by channel and product

Activation

Media dashboard, AI agent and budget alerts

What it solves

  • Media return is measured against invoiced sales from the store or the ERP, not against the sum of what each platform attributes to itself.
  • Map directions, estimated store visits and WhatsApp conversations stop being counted as leads or sales.
  • Spend shows up by product, store and state, so you can see budget spent where the chain does not sell.

Business questions it answers

Ask your agent these questions once the case is live.

How much did we spend on media this month and what was the ROAS on the store's real sales?
How many real contacts did Google bring, without counting direction requests and estimated visits?
How much of the spend landed outside the states where we have stores or deliver?
Which product gets the most media, and which returns the most sales per real spent?
Is Mercado Livre advertising paying for itself, looking at the channel's total revenue?
Are the conversations Meta reports actually reaching the store's WhatsApp?

What you need

  • Media platforms and marketplace ads connected to Nekt, all accounts
  • Online store orders or ERP sales connected, with status and date
  • The campaign naming convention (product, store, channel) and the list of expected accounts

What you get

  • A table by platform, account, campaign and day with spend, contacts and labeled platform value
  • Real ROAS and TACOS by channel, product and month, against invoiced sales
  • Breakdowns by state, age range and search term to review where the budget goes
  • An AI agent that tells real contacts, estimated conversions and sales apart

Where to activate

Media dashboard

Spend, contacts, real ROAS and TACOS by channel, product, store and state, with the conversion type next to each number.

AI agent via MCP

Answers about media return with real ROAS as the default and warns when a metric is not tracked.

Weekly alerts

Spend outside the chain's states, campaigns without a mapped product, accounts without data and gaps between Meta conversations and real contacts.

Ready to build?

Each platform on its own is simple. The work is linking spend to product and store through the naming convention and agreeing with the team on which revenue goes into ROAS. The detailed view has the business rules, the pitfalls and the acceptance test. Or send everything straight to your agent with the Nekt MCP.

The problem

Each platform measures return its own way. In Google, the conversions column of a physical store is dominated by direction requests and estimated visits. In Meta, without a purchase pixel, the conversion is a started conversation and the value comes back empty. Marketplace ads attribute to themselves part of the sales the channel already reports. Whoever adds it all up delivers a ROAS that does not exist, and whoever only looks at the ad manager does not know how much invoiced revenue the media brought.

How it is usually done, and the rule

Each row is a mistake that already happened in practice.

The common wayThe rule
01
Adding Google's and Meta's conversion value and calling it media revenue.
Real ROAS uses the store's sales

Real ROAS = net revenue of valid orders from the online store or the ERP (without tax, without shipping charged and without canceled orders) / spend, in the same scope and period. TACOS = spend / total revenue of the scope, organic included. Platform ROAS (conversion value / spend) only compares campaigns and creatives within the same platform and is never added across platforms, because each one credits the same sale to itself.

02
Using metrics_conversions of a physical store account as the lead total.
Physical store conversions are split by type

In Google, read conversions from the conversion actions by campaign table (conversion_action_category). GET_DIRECTIONS (asked for map directions) and STORE_VISIT (visit estimated by Google itself) are top of funnel and never become leads. PHONE_CALL_LEAD, CONTACT and SUBMIT_LEAD_FORM are the closest to a contact; PURCHASE is a website purchase. Keep the category in a column and compute cost per contact only with contact categories.

03
Treating a started conversation as a sale or computing Meta ROAS with a zero value.
Without a purchase pixel, Meta's conversion is a conversation

When the account has no pixel or conversions API with a purchase event, each campaign's result is onsite_conversion.messaging_conversation_started_7d (conversation started on WhatsApp, Messenger or Direct). A conversation is the start of contact, not a sale. The conversion value of those campaigns is null, and so is platform ROAS.

04
Filling with zero what the platform does not measure and adding reach across days.
Null means not measured, and each metric says what it is

A metric the platform does not provide stays null, never zero, and the agent answers that it is not tracked. Next to each platform number, keep a type label: a platform conversion is not an order, conversion value is not confirmed revenue, daily reach does not add up across days or ads. The same applies to coverage: a day with no rows in an active account is missing data until proven otherwise.

05
Adding Product Ads revenue to Mercado Livre revenue.
Marketplace ads are a subset of channel sales

In Mercado Livre Product Ads, total_amount is the revenue attributed to the sponsored listing (direct and indirect) and is already inside the marketplace's revenue. The cost (cost) goes into the channel's spend; attributed revenue is only used for ACOS (spend / attributed revenue). To know whether ads pay off, use the channel's TACOS: ad spend / total marketplace revenue.

06
Allocating all spend by each product's share of sales.
Spend reaches the product through the campaign name

Link each campaign to a product, store or site through a documented naming convention (for example, the first segment before the separator is the product code) and an alias table maintained by marketing (short code to product name). When the name does not carry the store, use the account as the default. Brand or whole-store campaigns stay as Store, with no invented allocation. Whatever does not match goes to Unmapped with its value and never disappears.

07
Looking only at the campaign total, without knowing where the budget was shown.
Budget checks against the store map

Build spend by state with Google's location report (user_location_performance and geo_target_constant, dropping the State of prefix) and Meta's region breakdown (adsinsights_by_region), with names normalized so both match. An empty region becomes Not specified, because it is part of the key. Compare with the states where the chain has stores or delivers and show spend outside them.

08
Crossing Google age and gender as if they came together.
Google age and gender are not crossed

Google delivers age range and gender in separate reports (age_range_performance and gender_performance). Meta delivers both together per row (adsinsights_by_age_and_gender). In the common schema, a Google row has one of the two dimensions filled and the other marked N/A. Sum by age ignoring age N/A, and by gender ignoring gender N/A. Never show age x gender for Google.

09
Adding the old export to the new connector, or ignoring accounts that were not connected.
All accounts, one source per period

Keep a table of expected accounts per platform. Live connectors sometimes cover only part of the accounts, and history before the connection may come from a frozen export of the previous tool. Each account and each period comes from one source only, with a declared cutoff date, and no account appears in both.

10
Leaving affiliates at zero cost or changing the percentage over history.
Affiliate commission is spend per order

Affiliates and partners paid per sale (a fixed amount per order or a percentage of revenue) have no ad manager. Their cost is computed on the channel's order rows and enters spend the same way as platform cost. Amounts, percentages and channel reclassification dates live in a parameter table with start and end dates, not as literals in the code.

What each source delivers in retail

How to treat each conversion before comparing it with sales.

Google · GET_DIRECTIONS, STORE_VISITEstimated top of funnel, never a leadconversion_action_category
Google · PHONE_CALL_LEAD, CONTACT, SUBMIT_LEAD_FORMContactconversion_action_category
Google · PURCHASEWebsite purchase, platform valuemetrics_conversions_value
Meta without a purchase pixelConversation started, null valueonsite_conversion.messaging_conversation_started_7d
Meta with pixel or conversions APIPurchase, platform valueoffsite_conversion.fb_pixel_purchase
Mercado Livre Product AdsAttributed revenue, subset of the channelcost, total_amount
CRM · WhatsApp sourceReal contact, minimum countSOURCE_ID
Online store or ERP · valid orderReal revenue for ROASnet, without tax and shipping
Affiliate or per-sale partnerSpend computed per order

Definitions

Spend
sum of cost in reais by platform, account, campaign and day, including marketplace ads and per-order affiliate commission in their own rows
Real revenue
net sales of valid orders from the online store or the ERP, without tax, without shipping charged and without canceled orders, by order date, channel and day
Real ROAS
sum of real revenue / sum of spend in the same scope and period, recomputed for each slice
TACOS
spend / total revenue of the scope (paid and organic) x 100
ACOS
ad spend / revenue attributed by the ads platform x 100, within the platform's own attribution window
Platform ROAS
conversion value / spend within one platform; null when the platform does not measure value
Cost per contact
spend of contact campaigns / (conversations started + calls + contacts + forms) in the period
Spend outside the area
spend in states with no store and no delivery / total platform spend in the period

Pitfalls that already happened

Google with a fake CPL

In a store chain, most Google conversions were direction requests and estimated visits. Counted as leads, they put Google's CPL far below Meta's cost per conversation.

Split conversions by category and compare only contact with contact.

Meta and WhatsApp told different stories

The conversations reported by Meta reached more than three times the contacts that actually came into WhatsApp from the ad. Months later, Meta almost stopped reporting while real contacts went up.

Measure real contacts by the CRM source or by the ad's pre-filled message and compare with Meta every month.

Meta with no return

The account had no purchase pixel, the null conversion value became zero and the dashboard showed zero ROAS for Meta.

Keep it null and answer that Meta's return is not tracked on the platform; use real ROAS.

Marketing undercounted for the year

The connectors covered only part of one platform's accounts and had no history for another. Website spend was 15% to 36% below reality, and ROAS looked great.

Register expected accounts and complete the past with the previous tool's export, with a date cutoff.

Marketplace sales inflated by ads

Product Ads attributed revenue was added to Mercado Livre revenue and the channel grew on the dashboard without selling more.

Treat ads revenue as a subset and use only its cost in spend.

New campaign without a product

Campaigns named outside the convention fell into the generic category and a new product's spend disappeared from the ranking for weeks.

Alert when Unmapped or the generic category grows above normal.

Acceptance test

The case is done when every item passes.

Agent package

Paste into Claude, ChatGPT or any client with the Nekt MCP connected.

Full Markdown
Unified paid media (retail)
- Grain: platform x account x campaign x day. Spend in reais, already converted from each platform.
- Real ROAS = net revenue of valid store or ERP orders (without tax, shipping and canceled orders) / spend. It is the default ROAS in every answer.
- Platform ROAS = conversion value / spend, only to compare within the same platform. Never add conversion value across platforms.
- TACOS = spend / total revenue of the scope. ACOS = spend / revenue attributed by ads.
- Google: split conversions by conversion_action_category. GET_DIRECTIONS and STORE_VISIT are not leads. Contact = PHONE_CALL_LEAD, CONTACT, SUBMIT_LEAD_FORM.
- Meta without a purchase pixel: conversion = conversation started; value and platform ROAS are null. Say "not tracked", never zero.
- Mercado Livre Product Ads: attributed revenue is already inside the channel's revenue. Do not add it.
- Spend by product and store comes from the campaign naming convention and the alias table. Unmapped is shown, never dropped.
- Google does not cross age with gender. Reach does not add up across days or ads.
- Real WhatsApp contacts come from the CRM source and are a floor, not the total.
- Before answering zero, check account and day coverage.
Client exceptions:
- <client>: Meta account without a purchase pixel; result = conversation started.
- <client>: product code = first segment of the campaign name before "|"; aliases in table <alias table>.
- <client>: affiliate <partner> costs <amount> per order since <date>.
- <client>: stores and delivery only in <states>.

Variations

Search terms

Terms with spend and no conversions become negative keyword candidates. Google omits low-volume terms, so the sum of terms stays below campaign cost.

Organic in the same model

Instagram, TikTok, Facebook and Search Console go into their own columns, with reach and engagement labeled, never mixed with spend.

Creatives with images

Image URLs from Meta's CDN expire and do not open in the browser. Store the converted image or the landing page's og:image for the creative ranking.