Skip to content

Team and companies

LeadHunter is multi-tenant by design. One user can belong to multiple Companies, and each company is fully isolated — no data ever crosses between them. A Berlin agency running outbound for ten clients runs ten companies; an internal team running its own outbound runs one.

The Company is the unit of tenancy: accounts, products, campaigns, custom fields, saved filters, conversations, expenses, dashboards — everything you operate on is scoped to the active company.

The Company switcher in the dashboard top bar selects the active company. Every page you see — accounts, campaigns, statistics, stats by product — is filtered to that choice. The selection persists across sessions via local storage, so reloading the page or coming back tomorrow keeps you on the same company.

Three places in the dashboard surface multi-company context:

  • The switcher itself — quick toggle between companies you belong to.
  • All companies overview (/dashboard/companies) — cross-company dashboard funnel; reads accounts and outcomes from every company you belong to. Picking a company tile sets the active company and routes you to its single-company dashboard.
  • Companies list (/dashboard/projects/) — full list with creation, archiving, member counts.

From Company switcher → New company, or via Companies → New:

  • Give it a name (e.g. “Acme Outbound”, “Berlin Clients — BikeCo”).
  • The slug is generated automatically from the name; collisions get suffixed.
  • The user creating the company becomes its first owner.

There’s no soft limit on how many companies a user can belong to or create. There’s no hard cross-company quota — each company has its own usage tracking (LLM tokens, Maps calls, Tavily searches, user-entered expenses), and you read the cost per company under Usage and costs.

Three roles, ordered by capability:

RoleData read/writeAdd/remove teammatesChange rolesDelete the company
Member
Admin✓ (members + admins)
Owner✓ (everyone)

Everyone in the company sees and edits the same data — there’s no per-account or per-campaign permission. Roles control team management, not data access.

A guard prevents the last owner from being removed or demoted — the company would otherwise become un-administrable. Add a second owner before transferring or leaving the role.

A self-serve team-management UI isn’t shipped yet. For now, adding or removing teammates and changing roles is a support-driven flow.

To get a teammate added today:

  1. The teammate signs up at leadhunter.humans2agents.com and confirms their email.
  2. Contact the LeadHunter team with the teammate’s signup email, the Company slug, and the role you want them to have (owner, admin, or member).
  3. Once added, the teammate sees the Company in their own switcher on next login.

Removing a teammate and changing roles follow the same route — message the team with the change you want.

The first-class invite-by-email flow with a UI is a known gap; we’ll announce it in What’s new when it lands.

Removing a teammate via the API:

  • Does not delete the user’s account or their data on any other company they belong to.
  • Does not delete any accounts, campaigns, or messages this company stores — those belong to the company, not the user.
  • Does revoke the user’s access to this company immediately. Their Company switcher loses the entry on their next page load.

There’s no offline grace period or token revocation delay.

Data isolation — what crosses, what doesn’t

Section titled “Data isolation — what crosses, what doesn’t”
SurfaceScope
Accounts, contacts, status historyPer-company. Never crosses.
Campaigns, conversations, expensesPer-company.
Custom fields and their definitionsPer-company.
Saved filtersPer-company (+ optionally private per-user — see below).
Research records, API usage attributionPer-company.
Dedupe stackPer-company. The same business can exist in two companies as two separate rows; LeadHunter doesn’t merge them.
Score reusePer-(Product, Account). Since both live in one company, scores never cross.

If you’re running an agency, each client’s accounts are isolated from every other client’s. You can’t accidentally pull a competitor’s contact list into another client’s campaign.

A few things live on the User, not the Company — so they follow you across every company you belong to:

  • Communication language — the default language you write in. Read by the message-language fallback chain when no other override applies. Independent of the dashboard UI language.
  • Dashboard UI language — what the dashboard chrome is in.
  • Recent-entities list — the Recent section in the command palette. Tracks what you opened, not what others did.

Everything else — saved filters, custom field definitions, accounts, campaigns, conversations — lives on the Company.

Saved filters are an exception worth knowing about. Each filter is either:

  • Shared (owner null) — visible and usable by every member of the company. Use these for canonical lists everyone references.
  • Private (owner set) — visible only to the user who created it. Useful for scratch filters or experiments before sharing.

You can flip a filter between private and shared at any time if you own it. The same name can exist once as a shared filter and once as your own private filter — they don’t collide on (project, owner, name).

PatternSetup
Solo operatorOne company, you as owner.
Internal teamOne company, you as owner, teammates as members. Add a second owner before going on holiday.
AgencyOne company per client. Each client’s company has you (the agency) as a member or admin; the client themselves may or may not have a login. Sharing accounts between clients is impossible by design — that’s the point.
MixedSome teammates belong to multiple companies; e.g. you have your own outbound and run a couple of clients. The switcher and the All companies overview are built for this case.
  • Expecting an email-invitation flow. Today, team management is API-only and requires the teammate to be a registered LeadHunter user already. Plan around that.
  • Forgetting which company is active. Every page is scoped to the switcher. If your campaigns list is empty when you expected dozens, glance at the top bar before assuming the data’s gone.
  • Sharing private saved filters by accident. Filters default to private; flipping to shared is intentional. The reverse — shared → private — disappears the filter for everyone except you, which is occasionally what you want and occasionally a surprise.
  • Trying to remove the last owner. The API refuses with a 400. Add a second owner first, then demote or remove.
  • Company and Product — what lives inside a company and why ICP attaches to products rather than companies.
  • Usage and costs — per-company usage attribution and the auto-tracked vs user-entered cost split.
  • Build a saved filter — including the shared vs private distinction.