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 — capture from your phone with nothing to install.
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.
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", "MNGL – 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 and does not interrogate you in chat. 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 · STPI ] [ 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.
A note that matches exactly one person is attached to them silently — no confirmation, and no duplicate contact.
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).
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.
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, then review the fields before saving.
Importing contacts
Add contacts from a LinkedIn ZIP, vCard, or CSV, and manage connected Google or Outlook accounts in one place.