Skip to content

Track campaign costs and CAC

A campaign isn’t just outcomes — it also costs something. LeadHunter lets you log every expense against a campaign (agency, hours, software, content, events) so the numbers you read aren’t “we got 12 clients” but “we got 12 clients for €4,200, that’s €350 each.”

Note (May 2026): ad spend (Adwords / Meta Ads / LinkedIn Ads / other ads) moved to the channel surface — see Track inbound accounts and Acquisition channels. The thinking: ads bring accounts to you (inbound), so the spend lives on the channel that brings them in. Campaigns retained the outbound-effort expenses below. Historical ad-spend rows were migrated automatically — you’ll find them under the matching channel.

Each expense entry is one line item against one campaign:

KindWhen to use
AgencyExternal agency or consulting fees.
LaborInternal hours — copywriting, design, ops, video editing.
SoftwareSaaS / tooling subscription that supports this campaign.
ContentVideo / photo / copywriting production.
EventTrade show, conference, meetup costs.
OtherAnything that doesn’t fit.

Each entry carries: amount + currency, date incurred, vendor (who got paid), and an optional description + external reference (invoice number, ad campaign id, …).

From the campaign’s Settings & costs tab

Section titled “From the campaign’s Settings & costs tab”

Open the campaign, click its Settings & costs tab and go to Costs & expenses. Click Add expense — an inline form appears with all the fields. Pick a kind from the dropdown (each option shows its icon and a short hint), type the amount, set the currency and date, optionally fill the vendor and description, and click Save expense.

The form pre-fills the currency from the campaign’s existing expenses, so once you’ve logged your first EUR entry you don’t re-type EUR on every subsequent add.

Don’t want to open the campaign first? On Campaigns, every row has a Log expense button. Click it and a modal opens pre-filled for that specific campaign — pick a kind, type the amount, save, done. Useful when you just paid an agency invoice and want to register it across three campaigns in 30 seconds.

The Cost column on the campaigns list shows each campaign’s running total in its primary currency, so you can see at a glance which campaigns are accumulating spend.

Every row in the Costs & expenses table has an edit pencil and a delete trash icon. Click the pencil — the row collapses into the same form, populated with the current values. Save the changes (or cancel) and the row updates in place. Delete asks for a confirmation and removes the entry; cost summary refreshes immediately.

Every campaign gains a cost summary with four cards at the top of the Costs & expenses panel:

  • Total — broken down per currency. A campaign that mixes EUR and USD shows both rather than pretending they’re comparable.
  • Cost per outreached account — total spend divided by the number of accounts you’ve reached out to. The cheapest gauge of efficiency.
  • Cost per replied account — total spend divided by accounts that have replied. Tighter than just “outreached.”
  • Cost per “closed” — total spend divided by the campaign’s close count, which depends on its purpose. The label adapts: a sales campaign reads “Cost per closed-won customer”, a press campaign reads “Cost per press reply”, a recruiting campaign reads “Cost per candidate engaged”, a renewal campaign reads “Cost per renewal”. For sales / customer-expansion / win-back / renewal purposes the count is accounts that became clients (customer status); for the other seven purposes the count is first inbound replies (a journalist taking the pitch is a press hit, an investor replying is an investor reply, etc.).

For an all-time view across campaigns and products, go to Insights → Breakdown (Insights in the sidebar, then the Breakdown tab). The Cost column on both the per-product and per-campaign tables shows total spend plus the most meaningful CAC available for that row — cost per closed if there are won clients, else per replied, else per initiated. Cost numerator and outcome denominator both use the last 30 days, so the ratio is comparable across rows.

Cost-of-acquisition (CAC) is only computed when all expenses on a campaign share one currency. Mixing EUR and USD without an FX layer would give misleading averages, so LeadHunter surfaces a per-currency total and explains the missing CAC instead. Either normalise to one currency or compute the conversion externally.

The Cost column on the list and on Insights → Breakdown shows a small + next to the primary-currency total when mixed currencies are present, so you know at a glance the headline number isn’t the full picture.

You’re running a Spring Bikes campaign with €2,400 in agency fees, plus 12 hours of internal time at €60/hr.

  1. Open the campaign’s Settings & costs tab → Costs & expenses → Add expense.
  2. Kind: Agency. Amount: 2400. Currency: EUR. Date: the month-end you paid. Vendor: the agency’s name. Description: “April outreach research and copy”.
  3. Click Save expense. The summary cards update immediately.
  4. Click Add expense again. Kind: Labor. Amount: 720. Description: “12h × €60 — campaign management”.
  5. Save.

Total is now €3,120. If your campaign has reached 240 accounts and 18 replied, you’ll see:

  • Cost per outreached account: €13.00.
  • Cost per replied account: €173.33.

Two weeks later, three of those replies convert to clients. Insights → Breakdown shows €1,040 per client for this campaign in the last 30 days — and rolled up to the product across all its campaigns.

LeadHunter automatically tracks the per-call cost of every LLM, Google Maps, and Tavily call attributed to a campaign (scoring included). That number shows as API costs in the same Costs & expenses panel — it’s auto-derived, you don’t enter it — so the panel gives the full cost of running the campaign. CAC is computed from the expenses you log. See Usage and costs.

  • Account — the rows you’re paying to reach.
  • Run your first campaign — get a campaign going so there’s something to attribute costs to.
  • Track inbound accounts — for accounts that came in through Ads, the channel attribution + costs work together to show ROI per channel.