<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Emovur community]]></title><description><![CDATA[Official WhatsApp Business API with shared inbox, broadcasts, chatbots and Flows. Get verified, go live fast and pay Meta rates with no hidden markup.]]></description><link>https://emovurcommunity.hashnode.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/6a43a4fe2af8aa537cae4f1f/364386a8-438b-400d-a301-44f9080befb4.png</url><title>Emovur community</title><link>https://emovurcommunity.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Sun, 15 Nov 2026 18:57:22 GMT</lastBuildDate><atom:link href="https://emovurcommunity.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Your HubSpot WhatsApp Integration Is Live. So Why Are Leads Still Going Cold?]]></title><description><![CDATA[Your HubSpot WhatsApp integration sends messages but leads still go cold. Here is the webhook and routing setup that keeps replies visible and answere]]></description><link>https://emovurcommunity.hashnode.dev/your-hubspot-whatsapp-integration-is-live-so-why-are-leads-still-going-cold</link><guid isPermaLink="true">https://emovurcommunity.hashnode.dev/your-hubspot-whatsapp-integration-is-live-so-why-are-leads-still-going-cold</guid><category><![CDATA[whatsapp]]></category><category><![CDATA[whatsapp-api]]></category><category><![CDATA[HubSpot]]></category><category><![CDATA[hubspot integrations]]></category><category><![CDATA[automation]]></category><category><![CDATA[Node.js]]></category><dc:creator><![CDATA[Emovur]]></dc:creator><pubDate>Thu, 12 Nov 2026 16:52:27 GMT</pubDate><content:encoded><![CDATA[<blockquote>
<p><code>TL;DR: Most HubSpot and WhatsApp setups only handle the outbound half. Replies land somewhere nobody is watching. Sync inbound messages to the contact, route them to the contact’s owner, and send anything that sounds like a question or a doubt to a human.</code></p>
</blockquote>
<p>Your CRM is probably not the reason your leads are dying.</p>
<p>Teams blame lead quality, then the ads, then the sales team. Almost nobody blames the setup in the middle, and that is where the damage happens.</p>
<p>Here is the plot twist. You already connected HubSpot to WhatsApp. Messages are going out. And leads still go cold, because connecting two tools is not the same as building a follow up system. One moves data. The other keeps a person interested.</p>
<h2>The failure nobody tests for</h2>
<p>A lead fills a form. HubSpot logs it. A WhatsApp template fires. Everyone feels good.</p>
<p>Then the lead replies with a question, and nothing happens. The reply sits in a chat window nobody is watching, or it shows up in HubSpot as a line of text with no alert.</p>
<p>The lead did not lose interest. They got a door that only opened one way. We test the send path carefully and treat the reply as an afterthought, but on WhatsApp the reply is the whole point.</p>
<p>So start from a different question. Not “what message should we send?” but “who answers when the lead replies?” If you cannot name a person, a time window and a backup, the integration is not ready.</p>
<h3>Step 1: Catch inbound messages properly</h3>
<p>Your WhatsApp provider will send inbound messages to a webhook. Verify the signature, acknowledge fast, and do the real work after. Here is a minimal Node example using the Cloud API style payload:</p>
<p><code>js import express from "express"; import crypto from "crypto";</code></p>
<p><code>const app = express(); app.use(express.json({ verify: (req, _res, buf) =&gt; { req.rawBody = buf; } }));</code></p>
<p><code>function validSignature(req) { const sig = req.get("x-hub-signature-256") || ""; const expected = "sha256=" + crypto.createHmac("sha256", process.env.APP_SECRET) .update(req.rawBody) .digest("hex"); return ( sig.length === expected.length &amp;&amp; crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected)) ); }</code></p>
<p><code>app.post("/webhooks/whatsapp", async (req, res) =&gt; { if (!validSignature(req)) return res.sendStatus(401); res.sendStatus(200); // reply quickly, process afterwards</code></p>
<p><code>const msg = req.body.entry?.[0]?.changes?.[0]?.value?.messages?.[0]; if (!msg || msg.type !== "text") return;</code></p>
<p><code>const phone = "+" + msg.from; const text = msg.text.body;</code></p>
<p><code>const contact = await findContact(phone); if (!contact) return; // decide how you want to handle unknown numbers</code></p>
<p><code>await logNote(</code><a href="http://contact.id"><code>contact.id</code></a><code>, text); if (needsHuman(text)) await createTask(contact, text); });</code></p>
<p>Two small things save a lot of pain later. Store phone numbers in full international format in HubSpot, and clean duplicate contacts before you go live. A missing country code breaks the thread before it starts.</p>
<h3>Step 2: Sync replies back to the contact</h3>
<p>Many setups log what you sent but not what the lead said. Your rep opens the contact and sees a one sided conversation. Match the inbound number to a contact, then write the reply to the timeline:</p>
<p>j<code>s const HS = "</code><a href="https://api.hubapi.com"><code>https://api.hubapi.com</code></a><code>"; const headers = { Authorization: Bearer ${process.env.HUBSPOT_TOKEN}, "Content-Type": "application/json", };</code></p>
<p><code>async function findContact(phone) { const r = await fetch(${HS}/crm/v3/objects/contacts/search, { method: "POST", headers, body: JSON.stringify({ filterGroups: [{ filters: [{ propertyName: "phone", operator: "EQ", value: phone }] }], properties: ["firstname", "hubspot_owner_id"], }), }); const data = await r.json(); return data.results?.[0]; }</code></p>
<p><code>async function logNote(contactId, text) { await fetch(${HS}/crm/v3/objects/notes, { method: "POST", headers, body: JSON.stringify({ properties: { hs_timestamp: new Date().toISOString(), hs_note_body: WhatsApp reply from lead: ${text}, }, associations: [ { to: { id: contactId }, types: [{ associationCategory: "HUBSPOT_DEFINED", associationTypeId: 202 }], }, ], }), }); }</code></p>
<p>Now every inbound message shows up on the contact timeline, and the story is no longer half missing.</p>
<h3>Step 3: Route by ownership, not luck</h3>
<p>If a lead already spoke to Priya last week, Priya should get the reply. Random assignment makes people repeat themselves, which is a quiet way to lose them. The contact’s owner is already in HubSpot, so use it:</p>
<p><code>js async function createTask(contact, text) { await fetch(${HS}/crm/v3/objects/tasks, { method: "POST", headers, body: JSON.stringify({ properties: { hs_timestamp: new Date().toISOString(), hs_task_subject: "Reply to WhatsApp message", hs_task_body: text, hs_task_status: "NOT_STARTED", hubspot_owner_id: contact.properties.hubspot_owner_id, }, associations: [ { to: { id:</code> <a href="http://contact.id"><code>contact.id</code></a> <code>}, types: [{ associationCategory: "HUBSPOT_DEFINED", associationTypeId: 204 }], }, ], }), }); }</code></p>
<p>The owner now gets a task the moment a lead writes back. Nobody has to assume somebody else is watching the chat.</p>
<h3>Step 4: One rule for where automation ends</h3>
<p>I am pro automation. I am also firmly against automating the moment a lead is deciding. Automation is great for confirmations, reminders and quick answers. It is poor at reading hesitation. Someone who writes “let me think about it” is not asking for another template. They want a person to say something real.</p>
<p>Here is a simple starting rule: a question mark or a doubt goes to a human, and a date, a name or a yes can stay with the system.</p>
<p><code>js function needsHuman(text) { return /?|not sure|let me think|maybe|too expensive|price|cost/i.test(text); }</code></p>
<p>It is crude, and you should tune it with real conversations. But this one rule protects the moments that matter, and it fixes a surprising number of cold lead problems.</p>
<h2>Mistakes that quietly kill leads after integration</h2>
<blockquote>
<p><mark>No owner for inbound replies, so everyone assumes someone else is watching.</mark></p>
<p><mark>A fast automated message followed by a slow human one, which feels worse than a steady pace.</mark></p>
<p><mark>Three templates in a row with no pause, which reads as pressure and not care.</mark></p>
<p><mark>Dirty data: wrong numbers, missing country codes, duplicate contacts. Treating hot leads and browsing leads with the same sequence.</mark></p>
<p><mark>No monthly review, so the setup never improves.</mark></p>
</blockquote>
<h2>What a good setup feels like to the lead</h2>
<p>It does not feel like a system. It feels like a business that pays attention. The lead gets a quick, relevant message, replies, and someone who knows what they asked answers. Nothing repeats and nothing feels random.</p>
<p>That is the real goal. Not more messages, but less friction between a lead’s question and a person’s answer.</p>
<p>If you would rather not build and maintain all of this yourself, a shared inbox that sits on top of the <a href="https://emovur.com/whatsapp-business-api">WhatsApp Business API</a> gives your team one place where every reply is visible. That is what we build at <a href="https://emovur.com/">Emovur.</a></p>
]]></content:encoded></item><item><title><![CDATA[Your WhatsApp API Has a Rate Limit. Here’s How to Queue 10,000 Contacts Around It]]></title><description><![CDATA[A simple wave based plan for sending bulk WhatsApp messages without wasting your daily cap on your coldest contacts TL;DR: Meta caps how many unique people…]]></description><link>https://emovurcommunity.hashnode.dev/your-whatsapp-api-has-a-rate-limit-here-s-how-to-queue-10-000-contacts-around-it</link><guid isPermaLink="true">https://emovurcommunity.hashnode.dev/your-whatsapp-api-has-a-rate-limit-here-s-how-to-queue-10-000-contacts-around-it</guid><dc:creator><![CDATA[Emovur]]></dc:creator><pubDate>Sun, 08 Nov 2026 13:16:07 GMT</pubDate><content:encoded><![CDATA[<p>A simple wave based plan for sending bulk WhatsApp messages without wasting your daily cap on your coldest contacts</p>
<p><code>TL;DR:</code> <code>Meta caps how many unique people you can message per day outside an open chat. Sort your list into four waves by engagement, send the warmest contacts first, keep 20% of the cap free for order updates, and check results before every batch.</code></p>
<p>Every developer knows the feeling. You build the feature, load the data, hit run, and the API replies with a rate limit.</p>
<p>Now picture the same thing with a marketing list. A business uploads 10,000 contacts, expects one big send, and finds out the platform will only let it reach 250 people tomorrow. So what gets sent first? In most cases, whatever row happens to sit at the top of the CSV, which is usually the oldest, coldest contact on the list.</p>
<p>If you treat the limit like a rate limit and the list like a queue, you can fix this in an afternoon.</p>
<h2>The Constraint Nobody Reads Until It Bites</h2>
<p>On the <a href="https://emovur.com/whatsapp-business-api">WhatsApp Business API,</a> Meta caps how many different people you can message in 24 hours outside an open chat. New accounts start at 250 and can grow from there.</p>
<p>Two details matter if you are designing around it.</p>
<p>The limit is per business portfolio, not per number. Every number in the portfolio shares one pool, so adding a second number does not add capacity.</p>
<p>The limit also grows because of how you send, not because time passes. Meta looks at message quality before it lets your cap increase, so waiting around for a bigger limit gets you nothing. Start now with your best contacts and let your sending history build.</p>
<p>The Math: How Long Does a Big List Take? List size At 250 a day At 2,000 a day At 10,000 a day 5,000 contacts 20 days 3 days 1 day 10,000 contacts 40 days 5 days 1 day 20,000 contacts 80 days 10 days 2 days</p>
<p>These numbers assume you spend the whole cap on one campaign. You shouldn’t, and that is the next section.</p>
<h2>Reserve Capacity Like You Would in Any System</h2>
<p>Campaigns are not the only traffic that uses your daily number. Order updates, payment reminders and appointment alerts sent outside an open chat can draw from the same cap.</p>
<p>Think of it as reserved capacity for critical traffic. Keep a buffer of around 20% so your transactional messages always go out. Practically, that means a cap of 250 gives you about 200 campaign messages a day, so a 10,000 contact list takes closer to 50 days than 40.</p>
<h2>Sort the Queue Before You Batch It</h2>
<p>The default order of a CSV is file order, and file order has no idea who is engaged. Sort your contacts into four waves first.</p>
<p>Wave 1: customers who bought or replied in the last 30 to 60 days Wave 2: older customers Wave 3: leads who enquired but never bought Wave 4: old or imported contacts you know the least about</p>
<p>Engaged people reply. Cold contacts ignore or block. A strong first wave protects your quality signals, and that helps every wave after it.</p>
<p>One rule applies to the whole queue: if you can’t say why someone is on your list, leave them out. Start with a permission based broadcast list.</p>
<h2>A Small Planner You Can Adapt</h2>
<p>Here is a simple Python sketch of the idea. It is a generic example for planning your batches, not an Emovur API call. It dedupes numbers, sorts by wave and recency, and cuts the queue into daily batches that respect your buffer.</p>
<p>python import math from datetime import date, timedelta</p>
<p>CAMPAIGN_SHARE = 0.8 # keep about 20% of the cap free</p>
<p>def plan_batches(contacts, daily_limit, start=None): start = start or date.today() usable = int(daily_limit * CAMPAIGN_SHARE)</p>
<pre><code class="language-plaintext"># send each number once only
seen, unique = set(), []
for c in contacts:
    if c["phone"] not in seen:
        seen.add(c["phone"])
        unique.append(c)

# warmest first: wave, then most recent engagement
queue = sorted(unique, key=lambda c: (c["wave"], c["days_since_engaged"]))

batches = []
for day, i in enumerate(range(0, len(queue), usable)):
    batches.append({
        "send_date": start + timedelta(days=day),
        "contacts": queue[i:i + usable],
    })
return batches
</code></pre>
<p><code>how many days will this take?</code></p>
<p><code>math.ceil(len(contacts) / (daily_limit * CAMPAIGN_SHARE))</code></p>
<p>Write each batch out as one CSV per day, and you have your sending plan.</p>
<p>Running a Daily Batch in Emovur</p>
<p>This is where the plan meets the tool. In <a href="https://emovur.com/whatsapp-business-api/broadcast-bulk-messages">Emovur’s WhatsApp broadcast tool</a>, one daily batch looks like this:</p>
<p>Prepare the batch. One CSV per day, or one segment per wave. Create a broadcast. Pick your approved message template. Add recipients. Upload the CSV or select the segment. Use Enter Numbers for a quick test. Set up the message. Add text, media, dynamic variables or a dynamic URL, and map each variable to a column. Handle duplicates. If a number appears twice, choose to send once only. Set retries and schedule. Send at the same time each day. Check results before the next batch. Look at delivery and replies. If people are blocking or ignoring you, fix the message before the next wave.</p>
<p>That last step is your feedback loop. Treat each wave like a deploy: ship it, watch the metrics, then decide whether the next one goes out.</p>
<h2>Bugs That Quietly Break Bulk Campaigns</h2>
<p>Sending in file order. Your oldest contacts go first. Sort by engagement before you batch.</p>
<p>Spending the full cap on a campaign. Nothing is left for order updates. Keep the buffer.</p>
<p>Hitting Wave 1 again every day. The same people get tired and blocks rise. Track who got which batch.</p>
<p>Duplicate numbers in one CSV. One person gets two messages. Choose send once only.</p>
<p>Changing everything between batches. You can’t tell what worked. Change one variable at a time, like you would in any experiment.</p>
<h2>Edge Cases Worth Planning For</h2>
<p>What if an offer expires before the last wave? Match the offer to the waves you can reach in time. Send a time limited offer to the first waves only, and give later waves a different message that still makes sense.</p>
<p>How do you know a wave worked? Check delivery, replies and blocks the next morning. If replies are low or blocks are rising, pause and fix the message before you send more.</p>
<p>Should cold contacts be included at all? Only if they agreed to hear from you. If they did, put them in the last wave and test with a small batch first. If they did not, leave them out and collect fresh permission instead.</p>
<h2>Ship the Plan, Not Just the List</h2>
<p>Having 10,000 contacts does not mean you can message 10,000 people tomorrow. The limit sets how many you can reach each day, and your plan decides who those people are. Send in waves, start with the contacts most likely to reply, keep a buffer for order updates, and check each wave before the next one goes out.</p>
<p><a href="https://emovur.com/whatsapp-business-api/broadcast-bulk-messages">Emovur’s broadcast tool</a> handles the work around it. You can upload a CSV, pick a segment or enter numbers, map your template variables, send once to repeated numbers, and schedule each wave for the same time every day.</p>
<p>Before you plan your first wave, see what running it will cost. Check Emovur’s pricing and see how it fits the size of your list.</p>
]]></content:encoded></item><item><title><![CDATA[Can Multiple Agents Use One WhatsApp Number? Here’s How Teams Do It Without Chaos]]></title><description><![CDATA[Manage multiple WhatsApp agents without duplicate replies. Use a shared inbox tool like Emovur to assign chats, label them and track who replies.]]></description><link>https://emovurcommunity.hashnode.dev/multiple-agents-use-one-whatsapp-number</link><guid isPermaLink="true">https://emovurcommunity.hashnode.dev/multiple-agents-use-one-whatsapp-number</guid><category><![CDATA[whatsapp-api]]></category><category><![CDATA[whatsapp]]></category><category><![CDATA[whatsapp business api]]></category><category><![CDATA[shared inbox]]></category><category><![CDATA[business]]></category><category><![CDATA[Entrepreneurship]]></category><category><![CDATA[Business growth ]]></category><dc:creator><![CDATA[Emovur]]></dc:creator><pubDate>Sat, 31 Oct 2026 10:47:10 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6a43a4fe2af8aa537cae4f1f/d8ff0460-226b-46d8-b74a-e8eb56eeb7cd.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>What happens when your whole sales team shares one WhatsApp number, and the simple setup that keeps everyone out of each other’s way.</p>
<p>It’s Monday morning. A new lead sends a message to your business WhatsApp. Two people on your team spot it at almost the same moment. One of them types out a quote and hits send. Ten minutes later, the other one replies with a different quote.</p>
<p>You only find out when the customer writes back, a little puzzled: “Your colleague told me something else.”</p>
<p>If you manage the team, this is the worst part. You can’t check who replied, what they actually said, or how long the lead was left waiting. All you have is everyone’s memory and a few screenshots. And honestly, asking your agents to “be more careful” was never going to fix it.</p>
<p>What fixes it is moving every one of those chats into a single shared inbox, where each conversation has an owner and every reply is visible. Here is how that works with <a href="https://emovur.com/whatsapp-business-api"><u>Emovur’s inbox on the WhatsApp Business API,</u></a> and how you can set it up for your own team.</p>
<h2><strong>Why duplicate replies keep happening</strong></h2>
<p>Nobody sets out to double reply to a customer. It happens through small gaps that repeat every single day.</p>
<p>Picture a lead messaging the shared number while three people have it open. All three read it, and each one assumes it’s theirs. Two of them reply. Nobody could see that a teammate was already typing.</p>
<p>Or a chat gets left for “later.” Another agent picks it up, or the customer receives a slow reply right on top of a quick one, because nothing showed that the chat was already taken.</p>
<p>Then there are the days when someone is on leave or stuck in a meeting. Their leads sit unanswered, and when a colleague finally steps in, they have no idea what was said before. The manager hears about it only when the customer complains.</p>
<p>And the quietest problem of all: when an agent leaves the company, the chat history leaves with their phone. Nothing is stored anywhere the team can open.</p>
<p>Look closely and the pattern is always the same. Nobody knows who owns the chat, and nobody can see what has already been said.</p>
<h2><strong>So, where can all your WhatsApp chats live together?</strong></h2>
<p>In a shared team inbox built on the WhatsApp Business API. Emovur’s Inbox brings every conversation from your business number onto one screen, so your whole team replies from the same place. As a manager, you get full visibility without ever having to check anyone’s phone.</p>
<p>If you want the bigger picture of how a team inbox supports sales in general, Emovur has a separate piece on that.</p>
]]></content:encoded></item></channel></rss>