Sources
This is where the web usually learns the bitter truth: ROI is not magic. The tracker honestly counts what you earned — it sees revenue from postbacks. But how much you spent on traffic, it knows only as far as you told it. Didn't set a click cost — spend is zero — ROI is infinite and useless. The Sources screen is exactly where you open the tracker's eyes: this is what a click cost, this is what a week burned. Only then do profit and ROI light up in Reports.
A source is one utm_source value: facebook, google, tiktok, push… The screen shows clicks, leads and revenue for each — and lets you assign spend. That's it. No philosophy.
What's on screen (the controls)
Top toolbar, left to right:
- Date range — presets Today / 7 days / Month or a manual from–to. No range, no stats — see the gotcha below.
- + Filter — the same filter as in Reports: narrow the set by geo, campaign, stream, etc.
- Currency — the currency to display money in and to store spend in (USD by default).
- Manual import — the full spend-import form with complete targeting (below).
- Export — download the table.
- ↻ and Auto — refresh manually or turn on auto-refresh (Off / 30s / 60s).
- User (team) — in team mode, pick whose spend you're editing.
- Scope — the My / Team switch.
Grid columns
One row per utm_source, plus a TOTAL summary row at the bottom:
| Column | What it shows |
|---|---|
| utm_source | the source value (row key) |
| Clicks | total clicks |
| Unique | unique clicks |
| Leads | conversions |
| CR | conversion rate, % |
| EPC | earnings per click |
| Revenue | earned via postbacks |
| Cost / CPC | click cost — edited inline in the row |
| Spend | total spent on this source |
| ROI | return: green up, red down |
Money and ROI colours always come from the server (roic, sign of profit) — green is profit, red is loss, amber is breakeven. We don't recolour them on a whim.
How to do it
Task 1. Set a click cost for one source (inline)
The most common case: one source, one price per click.
- Set the Date range. The window you're pricing. The range is required.
- Find the row for the target utm_source.
- Click the Cost / CPC cell. It turns editable.
- Type the per-click price (e.g.
0.12) and confirm. - Done: a "Cost saved" toast appears. The value is sent as
cpc— this price is applied to every click of that source in the chosen range.
cpc.click_price on the clicks (both live and archived), and the Spend/ROI columns recompute on the next data load. Refresh the table (↻) to see the new numbers. In Reports, profit follows after the same recompute.Task 2. Bulk spend over the filtered set (bulk bar)
When you need to price a whole batch of sources at once — the entire current filter.
- Set the Date range.
- Set + Filter so the table holds exactly the rows you want.
- At the bottom, the bulk cost bar — three modes, pick one:
- CPC — per-click price (
cpc), applied to every click in the set. - Total spend — a total sum (
cost); the server divides it by the matched click count to derive the per-click price. - Reset — zero the cost (
zero).
- CPC — per-click price (
- Enter the amount (nothing for "Reset") and apply. Spend lands on the whole filtered set for the chosen range.
Task 3. Full manual spend import (the "Manual import" modal)
The entire classic spend-import form, folded right in here. Use it when targeting is finer than "one utm_source": push spend onto a specific campaign + geo + creative combination for specific dates.
- Click Manual import. The modal opens with all targeting fields.
- Pick the amount mode — exactly one:
- CPC — per-click price;
- Total spend — a total sum (the server divides it by matched clicks);
- Reset — zero the cost.
- Choose the currency.
- Set from and to — the dates are required (see the gotcha).
- Narrow the set however you need — every field is optional, combine freely:
- Campaign (stream) — searchable by name;
- Geo;
- any UTM tags: utm_source · utm_campaign · utm_content · utm_term · utm_medium;
- domain · subid · customer;
- the unique only / valid only toggles.
- Apply. The spend rewrites
click_priceon every matching click in the range.
ok:1, even if not a single click fell under the filter. That's why the toast simply says "Cost saved" and doesn't lie to you about a match count. Want to confirm what actually landed? Refresh the table and read Spend and clicks with your own eyes.Auto-import lives elsewhere
If you'd rather not type spend by hand, there are ad-network connectors: they pull spend from your ad account (Facebook, TikTok, Bigo, MGID and about a dozen (11 in all)) and set the click cost on a schedule. They're just configured not here, but under Integrations → Ad networks. Same logic (same spend, same click_price), only the numbers come from the network's API instead of your fingers. The manual form above is for the "network not supported" or "need a surgical fix" cases.
→ Connector setup: Integrations.
Gotchas (the short list)
- The date range is required. No range, no stats and nowhere to put spend. The screen will ask you to pick a "from–to".
- cost ≠ cpc.
cpcis the price of one click.cost(Total spend) is a sum the server divides by the matched clicks itself. Send one.zero(Reset) clears it. - The row updates after a re-fetch. Spend rewrites
click_priceon live and archived clicks; the effect shows in Reports, but in the row itself only after you refresh the table. - {ok, bad} are rules, not clicks. A submit is always
ok:1. The "Cost saved" toast promises nothing about the match count — verify against the table.