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, influencer, 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.

The influencer kind is designed to be used as one channel per influencer: create a channel with the creator’s handle as the label (e.g. Influencer — @radiofan), log what you pay them as channel expenses, and stamp accounts that come in through their promotion with the influencer acquisition channel pointing at that channel. The existing rollups then answer the question that matters: what did this collab cost, what value did it bring in, and what’s the ratio.

Three features close the loop end-to-end:

  • Link the channel to the person. When creating or editing a channel, the “This channel is…” picker points it at the influencer’s own account row. Their account page then shows a Channels owned by this account card — the collab’s spend, attributed value, ROI, and link clicks right next to the conversation that landed the deal.

  • Tracked links. The channel page’s Tracked links panel creates short links you hand to the influencer to post to their audience. Every human click rolls up on the link, the channel, and the funnel — link-preview bots never count. Copy the short URL with one click.

  • Per-account attribution. On any account, the “Specific channel” picker records exactly which influencer brought them in. New inbound accounts attach automatically when the project has exactly one live channel of that kind, and their acquired date is stamped so the 30-day channel counts pick them up immediately.

  • Promo codes. Give the channel a code (e.g. LAIA20) and have your checkout or signup flow push conversions to the upsert API with that code — the account attributes to the channel automatically, even when no tracked link was clicked. Codes are case-insensitive (letters, digits, hyphens, underscores — max 64) and unique per company; an unknown code never fails the push (the response tells you it didn’t match).

If the influencer themselves is in your accounts list (say you found and pitched them through an outreach campaign with the Influencer goal), you get the whole story in one tool — the conversation that landed the collab on their account page, and the collab’s performance on the channel page.

You don’t need a scraper to spot which existing customers could promote you: add a custom field like followers_estimate (number), fill it manually or from an audience-audit tool you already use, and build a saved filterstatus is customer AND cf.followers_estimate exists — to get a living “advocates to activate” list. Works today with zero new machinery.

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.