Skip to content

Acquisition channels

A channel in LeadHunter is one inbound source of new accounts: Google Ads, Meta Ads, LinkedIn Ads, organic search, organic social, referrals, events, partners. Channels live next to Campaigns but answer a different question.

  • Campaigns are outbound. You pick the targets, score them against an ICP, and reach out. Campaign costs are the labor + agency + content you spent reaching that specific cohort.
  • Channels are inbound. Leads come to you through them. The cost is the monthly ad spend (Adwords, Meta) or event budget — entered as time-bucketed line items, not per-account.

Both surfaces feed the same outreach workflow once an account is in the system. The split is purely about where the spend lives and how the ROI math works.

FieldWhat it does
KindOne of adwords, meta_ads, linkedin_ads, organic_search, organic_social, referral, event, partner, cold_inbound, other. Same enum as the acquisition_channel field on individual accounts.
LabelOptional sub-label so one project can have multiple channels of the same kind — e.g. an Adwords “Search EU” channel and an Adwords “Display retargeting” channel. Blank label = the default channel for that kind.
Statusactive / paused / ended. Paused channels stop collecting new spend but keep their history.
Started / ended onOptional date range — when the channel went live, when it stopped.
External referenceFree-text link to the platform — your Google Ads customer ID, the Meta ad account, an event slug.

Channels are scoped per company (the same way Campaigns and Products are). Each company in LeadHunter has its own set of channels.

Channel spend is logged as time-bucketed line items. The typical entry is one row per month: “Adwords May 2026 = €1,200”. For one-off costs (a conference sponsorship, a single-day burst), set the period’s start and end to the same date.

Each line item carries:

  • Amount + currency (ISO 4217 — EUR / USD / GBP / …). No FX conversion happens; the rollup groups by currency.
  • Period start / end (closed range, both required).
  • Vendor — “Google Ads”, “Meta”, “EventCo”.
  • External reference — invoice number, ad-platform campaign ID.
  • Description + metadata — anything you want in the audit log.

You can hand-enter spend monthly, or import a CSV of historical line items. There’s no ad-platform sync yet — see the roadmap below.

Every channel exposes three rollup blocks on its detail page:

Total spend per currency, primary currency (the one with the largest total), and cost-per-acquired / cost-per-responded / cost-per-closed-account ratios when expenses share one currency. Mixed currencies skip the CAC math and explain why — adding an FX layer is on the roadmap.

If you’ve set lifetime values on Products, Campaigns, or individual Accounts (see Account value), the channel sums the captured value from every customer it acquired:

  • Total value by currency.
  • Customers with value vs customers total — the difference is “how many customer accounts are missing an LTV entry that an operator should fill in”.
  • By source — how the captured value was set: manual (operator), auto_campaign (snapshotted from a campaign override), auto_product (snapshotted from the product default).
  • Average account value in the primary currency.

Value ÷ spend, expressed as a multiplier (e.g. 25.00 = €25 in customer value per €1 of channel spend). Only computed when both sides share a single currency and those currencies match; otherwise the reason explains why (mixed currencies, no expenses, no customers with value).

Two paths:

  1. Manually: edit an Account and pick the channel from the dropdown.
  2. Auto-attach: setting acquisition_channel on an Account (via the dropdown, CSV import, or API) auto-creates the project’s default channel of that kind if one doesn’t already exist, and points the Account at it. This means the legacy “acquisition channel” string on every account stays in lockstep with the structured channel for cost rollups, with no extra work from the operator.

Outbound and “other” acquisition kinds don’t create channel rows — outbound is owned by the Campaign surface, and “other” is too ambiguous to auto-route.

Inbound accounts always start as contacted

Section titled “Inbound accounts always start as contacted”

When you create an account on an inbound channel (anything except outbound and other), LeadHunter automatically promotes its status from prospect to contacted — the account has already reached out, so the default “untouched prospect” status would be wrong.

The promotion records source: inbound_acquisition in the status history, so the audit trail is clear about why the account opened in contacted state. You don’t need to change anything else.

The stats dashboard now shows three columns: by product, by campaign, and by channel. Each channel row carries today / 7d / 30d acquisition counts plus its cost / value / ROI scoped to the last 30 days.

This is where the channel ROI story becomes operational: a glance tells you which channels are pulling their weight this month and which are bleeding cash.

An inbound account can also be added to a campaign — the channel records where it came from, the campaign records how you’re engaging it. A pure-inbound account that you don’t follow up on outbound only has a channel; an outbound prospect only has a campaign; an inbound lead you outbound-nurture has both.

Costs don’t double-count: ad spend lives on channels, outreach labor lives on campaigns. The two roll up separately and tell complementary stories.

Today’s channel surface is the foundation. The roadmap:

  • Webhook ingestion — public endpoints per channel that accept form submissions / ad-platform lead notifications / IG DM bridges, so accounts get created automatically when a form is filled in or an ad delivers a lead. UTM parameters and referrer data land in the account metadata.
  • Ad-platform sync — daily OAuth pulls from Google Ads, Meta Marketing API, LinkedIn Campaign Manager to populate spend automatically instead of monthly hand-entry.
  • Per-click attribution — when the ad platform delivers CPA data, individual accounts can carry their own acquisition cost (rather than just sharing the monthly bucket).
  • Email gateway — a per-channel forwarding address so inbound emails create accounts and threaded conversation messages automatically.
  • Multi-touch attribution — split a customer’s value across the channels that touched them, weighted by first-touch / last-touch / linear / time-decay.

See What’s new for what just shipped, and the roadmap section in the value-tracking guide for the LTV side.