Agency ad accounts for media buying: balance and fees
How teams work through agency ad accounts for Meta and TikTok: top-ups, fee rates by date, matching the agency balance to spend, bans and replacements.
CRMGuidesFinance9 min read

How to count profit and ROI per media buyer and per offer, why tracker and ad cabinet numbers disagree, and a worked example with example figures.

A media buyer’s profit is the revenue booked on their campaigns minus what they spent to get it, and ROI is that profit divided by the spend. Revenue lives in the tracker or the advertiser’s statistics, spend lives in the ad cabinet, and neither system holds both. So the number only exists after you join the two on the same buyer, offer, day and time zone. Where cabinet and tracker disagree, trust the tracker for revenue and the cabinet for spend, then explain the gap instead of averaging it.
Four numbers, defined once for the whole team:
Pick one definition of ROI and keep it. Dividing by ad spend only and dividing by all costs give different percentages for the same campaign, and a team that mixes them argues about nothing. Likewise decide whether revenue counts approved conversions only, or also pending ones. Pending revenue makes yesterday look better than it will end.
Currency and time matter too. If spend is in one currency and payouts in another, convert both with one rate, written down. If the cabinet and the tracker use different time zones, a day in one is not a day in the other.
The same rows can be cut two ways, and you want both.
Per buyer answers who earns and who loses. It needs a stable key that links a campaign to a person. The usual keys are a label in the campaign name, a tag in the tracker, or the owner of the ad account. Pick one, enforce it, and check weekly that no campaign is unlabelled. A campaign without a buyer is the main reason the sum of buyers does not match the team.
Per offer answers what is worth running. Here the key is the offer and the GEO, and the revenue side is straightforward because the payout is known: paid conversions times the payout in force on that date. Spend per offer comes from the campaigns that ran it, so the same campaign-to-offer link matters.
Shared accounts are the hard case. If two buyers use one ad account, the cabinet cannot split the spend. You need either a rule (split by campaign label) or separate accounts. Spend that matches no campaign should sit in its own visible bucket, not disappear: otherwise some buyers’ profit is overstated on money nobody booked.
Cut by buyer first, then open a buyer into offers, then into campaigns. If one buyer is in the red, the offer level tells you whether it is the buyer or the offer.
Expect a gap between what the ad network reports and what the tracker records. The usual causes are well known:
For a sense of scale, one tracking guide suggests a gap of up to 10 percent is acceptable, 10 to 15 percent deserves a close look, and above 15 percent means auditing the setup. That is one vendor’s rule of thumb, not a standard, but it is a useful trigger.
The practical rule: use the cabinet for spend, because the money was charged there, and the tracker or the advertiser’s statistics for revenue, because that is where payable conversions are. Do not rank a buyer by the cabinet’s conversion count.
All figures below are an example, not real results. Two buyers ran one week on the same offer. Spend comes from the cabinets, revenue from the tracker.
| Spend | Revenue | Profit | ROI | |
|---|---|---|---|---|
| Buyer A | 4,000 | 5,200 | 1,200 | 30.0% |
| Buyer B | 3,000 | 2,700 | -300 | -10.0% |
| Team | 7,000 | 7,900 | 900 | 12.9% |
Buyer A looks strong and Buyer B looks weak. Now add a cost that is real but sits outside the cabinet: suppose an agency fee of 10 percent of spend, which is 400 for A and 300 for B.
| Profit before fee | Fee | Profit after fee | ROI on spend | |
|---|---|---|---|---|
| Buyer A | 1,200 | 400 | 800 | 20.0% |
| Buyer B | -300 | 300 | -600 | -20.0% |
| Team | 900 | 700 | 200 | 2.9% |
The team’s 12.9 percent ROI became 2.9 percent, and nothing about the traffic changed. This is the reason to decide what belongs in spend before the first report.
Two more checks on this example. First, if 500 of the spend matched no campaign and was left out, the team’s profit would read 500 higher than it really is, by omission, so unmatched spend must stay visible. Second, if Buyer B’s last two days are still waiting for the advertiser to confirm revenue, the loss may shrink. Mark the days that are not final and compare buyers on final days only.
DarkCore CRM puts the two sides in one place. Reports join tracker numbers (clicks, installs and deposits from Keitaro or DarkCore PWA) with spend from Meta and TikTok ad accounts, plus deposits the advertiser reports, and count profit and ROI on every row. Drag Buyer to the top of the grouping and the same report compares the team, with the buyers in the red easy to spot; open a row to see offers, GEOs and campaigns below it. Write a formula once and it becomes a column, a card and a condition for auto-rules, and a saved report can be shared as a read-only link.
For the key between campaign and person, the CRM maps the labels buyers use in Keitaro to CRM users, and a sub parameter carries the Meta campaign so spend finds its clicks. Meta spend is read every morning for the last 28 days and TikTok spend every hour. Spend that matches no campaign waits in Spend control by network until someone binds it, so profit is not counted on half the money. The finance P&L takes spend from the same synced numbers, so reports and P&L agree, and roles decide whether a buyer sees only their own profit or the team’s. The site shows no prices, and a demo is booked through Telegram.
Add up revenue from the buyer’s campaigns in the tracker or the advertiser’s statistics, subtract their spend from the ad cabinet and any costs you assign to them, and divide the result by spend to get ROI. Use the same period, time zone and currency for both sides.
Because the two systems measure different things: the cabinet knows spend and its own attributed conversions, while the tracker knows the clicks it recorded and the payouts. Time zones, attribution windows, modeled conversions and delayed revenue confirmation all widen the gap. Compare spend from the cabinet with revenue from the tracker, and investigate when the difference passes about 10 to 15 percent.
For judging a campaign, spend and direct costs such as agency fees are enough. For judging the business, add salaries, tools and accounts in a P&L. Keep the two views separate and say which one a number belongs to.
How teams work through agency ad accounts for Meta and TikTok: top-ups, fee rates by date, matching the agency balance to spend, bans and replacements.
CRMGuidesFinance9 min read

How to manage offer caps per GEO and per buyer: what to count (installs, registrations, FTD, budget), which period, and what to do when a cap fills.
CRMGuides8 min read

What a CRM for media buying and affiliate teams must do, how spreadsheets, Notion, in-house builds and specialised tools compare, and how to choose.
CRMGuidesComparisons8 min read
