Skip to content

Log a conversation

LeadHunter is a communication log. You keep talking to accounts on the channels you already use — email, LinkedIn DMs, Instagram, WhatsApp, phone — then paste the messages into LeadHunter so the per-account history, funnel stats, and scoring stay current across the team.

The conversation log isn’t a sending engine. LeadHunter doesn’t connect to your inbox or your phone — that’s intentional. You stay in control of how and where you send; LeadHunter helps you draft, translate, remember, and measure.

Two entry points show the same conversation:

  • Campaign view — open a campaign, click an approved account, hit the Conversation tab. You see every message exchanged in this campaign.
  • Account detail — open the account directly (/dashboard/accounts/{id}). The conversation log aggregates across every campaign that account has been in, so you have one timeline whether the account is now in a different campaign than the one that first contacted them.

Every message carries a channel, which is part of the record so your future self knows whether “hey, did you see my note?” was an email or an Instagram DM. The eight values: email, linkedin, instagram, twitter_x, whatsapp, phone_call, sms, other.

email is the default. Switch the channel on each message — the per-message channel is what the cohort funnel attributes responses to later, not the campaign default.

Each message is logged in one of five modes. The right mode depends on who wrote it and whether translation was involved.

ModeDirectionUse when
AI draftoutboundFirst outbound message in this thread. AI writes a fresh draft.
AI continueoutboundContinuing an existing thread. AI reads the prior history and drafts the next move.
Type & translateoutboundYou wrote the message yourself in your language. LeadHunter shows the translation into the account’s language; you send the translation.
Log sentoutboundYou already sent it elsewhere (in your own email client, on LinkedIn directly, …). Paste the text just to record it.
Inbound pasteinboundThe account replied. Paste their reply; LeadHunter shows the translation into your reading language.

Every message has two text fields. Knowing which is which helps when you go back and read old threads:

  • original_text — the authoritative version. For outbound, what the account actually received (in their language). For inbound, what they actually sent.
  • translated_text — a reader-friendly view of the same content in another language.

The four modes populate them differently:

Modeoriginal_texttranslated_text
AI draft / AI continue / Log sentThe sent message (in the account’s language)(empty)
Type & translateThe translated/sent message (account’s language)Your original draft (your language)
Inbound pasteThe account’s reply (their language)Translation into your reading language

That asymmetry matters: when you re-read a type_translate outbound, the original_text is the version that left your hands, not your scratchpad draft.

Two languages are decided per message — what you read, and what the account reads.

Source (what you write in):

your User.communication_language'en'

Target (what the account reads):

Account.languageCampaign.communication_languageProduct.communication_languageUser.communication_language'en'

A real example: the product is set up in English, the campaign in Spanish, the lead is Catalan-only. The Catalan setting on the account wins — LeadHunter translates outbound into Catalan regardless of what the campaign says. The campaign-level language only kicks in for accounts that don’t have their own Account.language set.

You can also override the language manually on any single draft — useful when an English-speaking contact at a Catalan organization writes back to you in English and you want to keep the rest of the thread in English without changing the account.

Per-language communication_language on the campaign exists so you can run two campaigns of the same product in different markets without duplicating the product. See Campaign → Language.

Logging a message as sent isn’t just record-keeping — it advances the pipeline:

  • Outbound with status='sent' (any of ai_draft, ai_continue, type_translate, log_sent) → CampaignAccount.outreach_status becomes sent if it isn’t already. The dashboard funnel counts this account as initiated.
  • First outbound on a prospect-status account → account status advances to contacted. The status-history entry records source: campaign_outreach and references the campaign id.
  • Inbound pasteoutreach_status becomes responded. The dashboard funnel counts the account as a response, cohort-attributed back to the original initiation date.

All promotions are forward-only. Already-customer accounts don’t regress when you log a follow-up. Already-contacted accounts don’t re-fire the promotion when the second outbound goes out.

Drafts (status='draft') don’t fire any of this — they’re scratch space. Switch to sent to log the message as truly out.

Outbound to a do_not_contact account is blocked at the API. The UI shows a clear error pointing at the account’s status history, so the operator can see when and why it was flagged. There’s no “include DNC anyway” override — the GDPR/CAN-SPAM opt-out is sticky on purpose. If you genuinely need to contact a DNC account (a single follow-up to confirm the opt-out, for example), change the account’s status manually first.

Other relationship guardrails (competitor, personal_network, customer-class soft blocks, etc.) only apply to campaign bulk-add — they don’t apply to logging individual messages on accounts that are already in a campaign. The rationale: if it’s already in the campaign, it cleared the bulk-add filters.

Worked example — outbound, reply, continue

Section titled “Worked example — outbound, reply, continue”
  1. First outbound. Open the conversation, pick channel email, mode AI draft. The AI generates a first-touch message in the account’s language. Edit until it reads right. Click Send (LeadHunter records it; you copy-paste into your actual email client and hit send there).
  2. The account’s status flips prospect → contacted, the campaign-account’s outreach_status flips to sent, the dashboard’s “initiated” counter ticks up.
  3. Two days later, they reply. Copy their email body, click Inbound paste, channel email. The reply is stored as original_text (their language); the translation into your reading language appears as translated_text.
  4. The campaign-account’s outreach_status flips to responded. The dashboard’s “responded” counter ticks up, attributed back to step 1’s initiation date.
  5. Continue the thread. Switch to AI continue. The AI reads the prior two messages — your draft from step 1 and their reply — and proposes a continuation in the account’s language. Edit, send via your email client, log.

The thread on the account detail page now shows three messages in the order they happened, with channel chips, mode chips, language flags, and the auto-promoted status transitions visible in the account’s status history sidebar.

  • Picking the wrong mode for translated outbound. When you draft something in your own language and translate it before sending, that’s Type & translate — not Log sent. The mode matters because type_translate stores both versions; log_sent only stores one and your future self loses the source.
  • Forgetting to switch channel on a non-email exchange. email is the default and most users leave it. If the thread is on LinkedIn or Instagram, switching to the right channel before sending is what makes the cohort funnel correctly attribute “responses on LinkedIn” a quarter from now.
  • Keeping drafts forever. Drafts don’t advance any status. If you draft a message and never send it, the account stays at prospect, the campaign stays at initiated=0, and nothing in the funnel records the work. Either flip the draft to sent once you’ve sent it, or delete the draft.
  • Re-pasting an inbound reply you already pasted. Inbound paste counts toward responses; duplicating the same reply double-counts. The conversation history is your source of truth — check before pasting.