Messaging capture (WhatsApp & Telegram)
Forward a contact card, a note, or a photo to Dhaga's WhatsApp or Telegram bot, reply DONE, and Dhaga saves the person into your graph — then ask it a question, answer its own, or put it right, all in the same chat.
Dhaga can capture people straight from a chat you already have open. Forward
a contact card, a note, or a photo to the Dhaga bot on WhatsApp or
Telegram, reply DONE, and Dhaga creates and tags the contact, keeps
every forwarded message as a receipt, and replies with a summary. It's the
fastest way to capture from your phone without any app install — hand someone's
card straight into your graph while you're still standing at the booth.
- Forwardcard, note, or photo to the bot
- Batchmessages gather in one session
- Reply DONEor walk away — it auto-saves
- Savedcontact + notes + facts, receipted
This feature needs no cloud tier, so it works the same on a self-hosted enterprise deployment. Setting up the bot (the webhook, the API keys) is a one-time admin job covered in Self-hosting; this page is about using it once a channel is connected.
On the hosted instance, connecting a chat is part of Pro and Power. Chats you've already linked keep capturing whatever your plan does afterwards, and you can disconnect one at any time — the gate is on adding a channel, never on the messages you're already sending or on your ability to stop them.
Connecting your chat
There's one bot per deployment, so Dhaga has to know which account a chat belongs to before it saves anything.
-
Open Settings → Messaging (
/app/settings). -
Generate a link token — a short, single-use code that expires in a few minutes.
-
Scan the QR with your phone, one per channel:
- Telegram opens the bot with a Start button — tap it and you're linked. The code travels in the link, so there's nothing to type.
- WhatsApp opens a chat with the code already in the message box — just hit send.
On a phone you can tap the code instead of scanning it. Prefer to do it by hand? Copy the token and send it to the bot as an ordinary message — that still works exactly as before.
From then on, anything you forward from that chat lands in your graph. A chat that isn't linked yet gets a friendly nudge back explaining how to link it.
A single-owner deployment
On a self-hosted enterprise deployment with a single owner, an unlinked chat falls back to that owner automatically once an administrator names them, so you can start forwarding before wiring up per-user linking.
What you can forward
- Contact card — a shared vCard is imported from its own fields (name, numbers, org), never re-read as text, so nothing is lost in translation. A card for someone a note already mentioned fills that person in instead of duplicating them, and a card for someone already in your graph adds what they're missing — a number they don't have yet, an address, a birthday, a title where you'd left it blank. A job filled in this way is added to their Experience list, so you can edit or correct it like any other. It never replaces what you've already filled in: a forwarded card is a snapshot from someone else's phone, and yours stays the one that counts.
- Text — a message you type or forward becomes a note, and Dhaga auto-extracts facts from it, each with a receipt back to the message.
- Photo — a business card or badge is scanned into a contact; a photo that isn't a card (a whiteboard, a poster, a conference schedule, a society noticeboard) is read as text and kept as a note. Send a caption with it and the caption becomes a note on that person. The photo itself is kept too, alongside the text read off it, so you can always check the reading against the original — unless you've turned photo storage off in Settings, which governs forwarded photos exactly as it governs a card scan. Each photo is filed against the note that was read off that photo, so deleting that note takes its photo with it — and deleting anything else in the batch leaves the photo alone.
- Location — kept as a note on the current contact.
Anything else — a voice note (see below), a video, a document, a sticker, an empty message — gets a reply telling you so. Nothing is ever dropped in silence: if an item can't be saved, either the bot answers straight away or the batch summary lists what it skipped and why.
How a batch works
A batch is read as a whole, not message by message. Nothing is decided until you close it, and then every message is considered together:
- Text that names someone is filed on that person — matched to whoever is already in your graph, or created if nobody matches. A note about Bob never lands on Alice just because Alice's card arrived earlier. Send a detail rather than a note — a phone number, an email, "he's at Acme now" — and it is written onto them, added beside what they already have rather than over it.
- Text that names nobody ("wants intros to fintech founders") is read in the context of the messages around it, so a follow-on remark stays with whoever you were just talking about.
- A contact card or photo contributes that person's details; typed remarks beside it become notes on them.
- Forward several people in one batch and you get several contacts, split correctly — arriving in the same batch does not merge them.
Telling the bot what to do is not a note. A message like "create a new contact" or "save this under Acme" is read as a directive about the messages around it, so it isn't stored in anyone's timeline and no follow-ups are invented from it. Because the whole batch is read together, "Create a new contact" sent straight after a block of details creates the person those details describe — it is not a stray instruction floating on its own. Anything carrying real information stays a note, even when it reads like a command to yourself — "call Priya on Tuesday" is a note, and still becomes a follow-up. The test is who is being told to act: you telling Dhaga is an instruction, you telling yourself is a follow-up.
And an instruction is never dropped in silence. One that corrects a name — "that's spelt Anaya, not Ananya" — is carried out on what the batch just saved. Anything Dhaga won't do off a single sentence — mint a second contact, draw a relationship, rewrite the words of a note — isn't executed as a separate step, and the closing summary quotes the instruction back to you so you can finish it in the app instead of assuming it happened. Your own notes in particular are never rewritten: they are your words.
A capture that names no person still gets a usable name. A noticeboard or an office directory has an organisation on it but nobody in particular, so the contact is named after the organisation rather than saved blank — a nameless contact can't be found by search later. If there's no organisation either, it's saved as "Unnamed contact" for you to rename.
Where the source says whose number or address each one is — "Society office – 9999900102", "Northgas – 9999900103 (Ravi)", "admin@…" — those labels are kept on the contact's phone and email entries instead of arriving as an anonymous list.
When Dhaga isn't sure who you mean
If a forwarded note could be about more than one person in your graph — two Rohans, say — Dhaga does not guess. It raises the note in your Inbox, where you pick who it belongs to:
This note could be about more than one "Rohan". Which one did you mean?
[ Rohan Mehta · Lakeside ] [ Rohan Iyer · Northwind Retail ] [ New person ]The note travels inside that confirmation, so nothing is written to anybody until you choose — and nothing can be lost if you never do. Each ambiguous note gets its own entry, so a batch that raises five of them gets five, and the batch summary tells you how many are waiting.
Anything the note asks you to do doesn't wait for your answer. If it reads "need to check with Rohan about next steps tomorrow", the reminder goes on your calendar straight away as a general task — no contact attached to it yet, but a real dated task you'll be reminded about. Otherwise a note you never got round to answering would take its deadline down with it. The confirmation remembers which tasks came out of the note, so answering it can put them on the person you picked — but the date was never at risk either way. You end up with one reminder, not two: the placeholder made at capture time is retired in favour of the fuller one that comes out of the note once it has a person, and the calendar entry that went with it is cleared too.
A note that matches exactly one person is attached to them silently — no confirmation, and no duplicate contact. A name is matched against your contacts' nicknames as well as their names, and where the strict search finds nobody Dhaga looks again for the name as a whole word anywhere inside a contact's — so "Rohan" now reaches "Prof Rohan Mehta". What it will not do is shorten a name to its bare form: "Rohan sir", "Rohan mama" and "Rohan" are routinely three different people, and folding them together is the worse mistake. So you'll still be asked about the genuinely ambiguous ones — what changed is that the card now offers you the right person instead of nobody at all.
Answering it in the chat
The inbox card is where the question really lives, but you don't have to leave WhatsApp or Telegram to settle it. When a batch parks one, the bot asks it back at you with the candidates numbered:
🤔 Who is "Rohan" in that last note?
1. Rohan Mehta · Lakeside
2. Rohan Iyer · Northwind Retail
Reply with the number or the name and I'll file it — or leave it and answer in your inbox.Reply 2, or reply Rohan Iyer, and the note is filed exactly as if
you'd tapped that same choice on the card in the app.
- Ignoring it costs you nothing. The card is standing the whole time and nothing is written until you answer it in one place or the other.
- One question at a time. A batch that parks five raises five cards, but the bot asks about only the first of them, and asks the next once you've answered that one.
- A question with nobody to offer isn't asked here. Where no contact matches at all, the only answer is "add a new person", and that isn't something a numbered reply can do — so that card waits for you in the app.
- Anything that isn't an answer is just an ordinary message. Send a fresh note instead of a number and the question steps aside and your note is captured — it can never block the chat or swallow something you meant as content. A name matching two of the candidates isn't an answer either; that ambiguity is the whole reason you were asked.
- It stays answerable for about six hours, so a question asked over breakfast can be answered at lunch. After that a stray "1" is a note again, and the question is still waiting in your inbox.
Closing a batch
You never have to remember to finish — a batch is saved three ways, and nothing is ever lost:
- Reply
DONE(orfinish,end,/done) to save immediately. - Start a new forward and any earlier open batch is saved first.
- Walk away — an idle batch auto-saves after 24 hours of quiet (on a self-hosted enterprise deployment an administrator can tune that window).
You can send DONE the instant you finish recording a voice note, without
waiting for it to upload. WhatsApp and Telegram only deliver a voice note or a
photo once your phone has finished sending it, so DONE can reach Dhaga first —
it waits about 20 seconds for anything still on its way, and saves it in the
same batch. Only if nothing arrives does it answer that there's nothing to save.
A batch also stops accepting forwards once it holds 10 unsaved items — another
tunable on a self-hosted deployment. The bot says so rather than swallowing the
message, and asks you to close it while you still remember who each one was about.
The message it refused is not kept — reply DONE to save the ten, then send
that one again. Every forward past the limit is refused the same way, so if you
sent five you have five to re-send.
What the bot tells you
Closing a batch sends every message in it to Dhaga together, not one at a time. That matters: a forward like "Create a new contact" only means anything beside the message before it, and reading messages in isolation is how a note about one person used to end up filed on another — or on a blank contact.
The reply then says, per person, exactly what happened:
✅ Created Priya Raman and added 1 note to them.
✅ Added 2 notes to Arjun Mehta.
✅ Added a phone number to Grace Hopper.
🏢 Filed that on Joget. 1 reminder is on them too.
📅 Kept 1 reminder for you. It's under General on your plan.
⏳ 1 note needs your input — open Dhaga to say who it's about.Created versus added is the distinction worth reading: the first means the person is new to your graph, the second means it landed on somebody already in it. The line names what was saved — notes, a phone number, a job title — so you can tell at a glance that the thing you sent is the thing that landed. When a message matched someone but there was nothing new on it to save, the reply says exactly that rather than reporting an update; and if a message can't be placed at all, the bot says which one. Nothing is ever dropped quietly, and nothing is ever dropped at all: a message the planner could not place goes to your Inbox with its own words attached, waiting for you to say who it was about.
Ask a question, or put me right
Not everything you type at the bot is something to save, so Dhaga reads each typed message first and decides what it is:
- A question — "who do I know at Acme?" — is answered from your graph in the chat, with the same reasoning and receipts you'd get from Ask Dhaga in the app, and is not filed as a note. Because it isn't captured, nothing is holding it: if the answer fails, the bot says so and asks you to send it again rather than leaving you to wonder. It costs credits like any other Ask Dhaga question. See Search & ask.
- A correction — "no, that was Anaya, not Ananya" — is applied to what this chat has just saved.
- Everything else goes into the batch exactly as before.
Working out which is which costs you nothing extra, and every way it can fail — no answer, a slow provider, an instance with no AI configured — falls back to capturing your message, because an unanswered question can be asked again and a dropped note cannot.
A correction only ever reaches what this chat saved in the last half hour, and only the people that batch actually named. It can:
- Fix a spelling — the contact is renamed in place, and nobody new is created.
- Undo a duplicate — where Dhaga has just created someone you already had, the new row is merged into your existing one, which keeps its history.
- Move it to the right person — every note that batch wrote goes across. The contact it was wrongly filed on stays in your contacts; remove it in the app if it shouldn't be there.
Names are resolved in code, against your own contacts, never on the model's say-so. Anything short of exactly one confident match writes nothing and tells you why — "I found two people called Anaya" — because refusing costs you one more message, while guessing files a note on the wrong person, which afterwards looks exactly like a note you filed there yourself.
Messages that aren't about a person
Plenty of what you forward names nobody, and it is kept all the same:
- A reminder to yourself — "remind me to send the revised quote on Friday". The reminder lands straight on your plan under General and no question is raised, because there is nobody to ask about. This is what most voice notes turn out to be.
- Something about a company — "Joget wants the revised quote by Tuesday". If the name matches a company you already have, the note is filed on that company and its reminders go with it. A name that matches nothing is never turned into a new company on a guess — a misheard word in a voice note and a firm you have never added look identical — so the bot asks instead, and the card lets you pick or create one.
- Anything genuinely unclear goes to your Inbox carrying the message's own text, waiting rather than being guessed at.
The capture log
Settings → Messaging → Capture log is the full record: every batch you have ever forwarded, newest first. Each row says how many messages the batch holds, and how many of them are still unresolved — carrying no verdict because the batch never finished accounting for them. Expand a batch to see its messages in the order they arrived and what each one became — the contact it created, the person or company it was filed on, the reminder it became, the question it raised, or the reason it could not be read — with a link straight to that contact, company or Inbox entry.
A forwarded voice note shows what it was heard to say, so if one ended up somewhere odd you can read the transcript the batch actually worked from rather than guessing at it.
A batch that failed stays there too, with the reason, because a failure never discards what you sent. To have another go at one, reply DONE in the chat again — the messages are still in the batch, so it is re-driven from where it stopped. The Messaging settings card flags any batches that never finished, so you don't have to go looking; when everything has been saved it says nothing at all.
Use it when the reply in chat went past too quickly, or when you want to check where a particular forward actually ended up.
Voice notes depend on the deployment
Forward a voice note and, where server-side transcription is configured, it is transcribed and folded into the batch like any other note — the transcript is what extraction reads, and it costs one AI credit per clip. Clips longer than five minutes are refused rather than transcribed; send those in parts.
Where transcription is not configured, the bot replies "Voice notes aren't supported yet — coming soon! For now please type it, send a photo, or forward a contact." It is never quietly swallowed either way. (This is separate from Dhaga Voice, the dictation in web quick-add.)
More channels later
WhatsApp and Telegram ship today, but the messaging layer is provider-agnostic: it mirrors Dhaga's LLM and search gateways, so a new channel is a self-contained plug-in with no changes to the capture flow above. On a self-hosted enterprise deployment, see Self-hosting for the per-channel setup.
Next, see how forwarded notes turn into searchable facts in Notes & facts, or bring in an existing address book from Importing contacts.
Capturing people
Add a person to your graph from pasted text, a card photo, voice, an upload, or by typing them in — pick the method from one list, review the fields, and write your first note about them on the same form.
Importing contacts
Add contacts from a LinkedIn ZIP, vCard, or CSV — search and filter the file down before any of it is saved — and manage connected Google or Outlook accounts in one place.