<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Wabbiyo</title>
    <description>The latest articles on DEV Community by Wabbiyo (@wabbiyo).</description>
    <link>https://dev.to/wabbiyo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4173376%2Fd099d5db-c9c0-4a52-8003-26b20b6c4799.png</url>
      <title>DEV Community: Wabbiyo</title>
      <link>https://dev.to/wabbiyo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/wabbiyo"/>
    <language>en</language>
    <item>
      <title>6 Bugs in WhatsApp Appointment Reminder Systems (and How to Fix Them)</title>
      <dc:creator>Wabbiyo</dc:creator>
      <pubDate>Fri, 30 Oct 2026 11:28:41 +0000</pubDate>
      <link>https://dev.to/wabbiyo/6-bugs-in-whatsapp-appointment-reminder-systems-and-how-to-fix-them-3ljb</link>
      <guid>https://dev.to/wabbiyo/6-bugs-in-whatsapp-appointment-reminder-systems-and-how-to-fix-them-3ljb</guid>
      <description>&lt;p&gt;Appointment reminders look like a cron job and a message. In production, these six bugs show up first.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Reminder after a cancellation&lt;br&gt;
The patient cancelled, but the T-24h job still fires. Fix: unschedule pending jobs on every cancel or reschedule.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wrong time zone&lt;br&gt;
The appointment was stored in local time and the server runs UTC, so the reminder arrives at the wrong hour. Store timestamps with the time zone and convert once.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Duplicate reminders&lt;br&gt;
The booking was edited twice and three jobs exist. Fix: one job per appointment per stage, keyed on appointment_id + stage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sent at 2 AM&lt;br&gt;
A booking made late at night for an early slot triggers a T-2h reminder in the middle of the night. Add quiet hours and skip or shift those reminders.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reply not linked to the booking&lt;br&gt;
The patient taps “Reschedule”, but the webhook can’t tell which appointment it’s for. Put the appointment ID in the button payload.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Diagnosis in the message&lt;br&gt;
“Reminder: your knee MRI follow-up…” is health information on a lock screen. Keep reminders generic: date, time, clinic, reference number.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Bonus for physiotherapy clinics: send the home exercise plan as a link after each session. It’s helpful for patients and a good reason for them to keep the chat open.&lt;/p&gt;

&lt;p&gt;Wabbiyo handles reminders, reply buttons and rescheduling on the official WhatsApp API for WordPress sites. See the &lt;a href="https://wabbiyo.com/industries/physiotherapy-clinics/" rel="noopener noreferrer"&gt;physiotherapy clinic setup&lt;/a&gt;, or &lt;a href="https://wabbiyo.com/" rel="noopener noreferrer"&gt;wabbiyo.com.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>api</category>
      <category>automation</category>
      <category>whatsapp</category>
    </item>
    <item>
      <title>6 Mistakes That Make Your WhatsApp Campaign Reports Wrong</title>
      <dc:creator>Wabbiyo</dc:creator>
      <pubDate>Thu, 29 Oct 2026 05:35:06 +0000</pubDate>
      <link>https://dev.to/wabbiyo/6-mistakes-that-make-your-whatsapp-campaign-reports-wrong-2n49</link>
      <guid>https://dev.to/wabbiyo/6-mistakes-that-make-your-whatsapp-campaign-reports-wrong-2n49</guid>
      <description>&lt;p&gt;If your WhatsApp campaign numbers look too good, or don’t match your sales, check for these six reporting mistakes.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Counting sends as success&lt;br&gt;
sent only means Meta accepted the message. Use delivered as your base.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No campaign ID on orders&lt;br&gt;
If you can’t tell which message led to an order, you can’t measure revenue per campaign. Store the campaign ID per message, then attribute orders by phone number and time window.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ignoring failed statuses&lt;br&gt;
Failures hide real problems: numbers not on WhatsApp, per-user marketing limits, paused templates. Group failures by error code after every campaign.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No opt-out tracking&lt;br&gt;
“STOP” replies and blocks are the early warning before your number’s quality rating drops. Track them per campaign.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Changing the attribution window&lt;br&gt;
7 days one month, 30 days the next, and the trend line becomes meaningless. Pick one and keep it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Counting bot chats as sales&lt;br&gt;
A chatbot conversation isn’t a conversion. Only count orders, bookings or payments.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Wabbiyo’s WhatsApp analytics for WordPress tracks delivered/read/reply rates and attributes WooCommerce revenue per campaign, flow and cart reminder: &lt;a href="https://wabbiyo.com/analytics/" rel="noopener noreferrer"&gt;Click here to know more.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>api</category>
      <category>webdev</category>
      <category>whatsapp</category>
    </item>
    <item>
      <title>Thinking of Self-Hosting Your WhatsApp Integration? 6 Checks First</title>
      <dc:creator>Wabbiyo</dc:creator>
      <pubDate>Wed, 28 Oct 2026 10:40:16 +0000</pubDate>
      <link>https://dev.to/wabbiyo/thinking-of-self-hosting-your-whatsapp-integration-6-checks-first-a3l</link>
      <guid>https://dev.to/wabbiyo/thinking-of-self-hosting-your-whatsapp-integration-6-checks-first-a3l</guid>
      <description>&lt;p&gt;Self-hosting your WhatsApp Business API integration (for example, as a WordPress plugin) removes a SaaS layer, but your site now has to handle webhooks reliably. Check these six things first.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;HTTPS on your site&lt;br&gt;
Meta only delivers webhooks to HTTPS URLs with a valid certificate.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cron / queue actually running&lt;br&gt;
Broadcasts and scheduled reminders depend on background jobs. On low-traffic sites, WP-Cron may not fire on time, so set up a real server cron that hits wp-cron.php, or use Action Scheduler with a system cron.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Hosting accepts webhooks&lt;br&gt;
Some security plugins, firewalls or “under construction” modes block inbound POST requests. Whitelist the webhook route and test it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Backups include the chats&lt;br&gt;
Check that your backup plugin includes custom tables, not just posts and media.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Plugin kept updated&lt;br&gt;
Meta updates the Graph API versions. Keep the plugin current so you aren’t on a deprecated version.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;PHP 8.1+&lt;br&gt;
Modern plugins need it. Check under Tools → Site Health.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If all six are fine, self-hosting is usually smooth. If not, a SaaS platform may be easier.&lt;/p&gt;

&lt;p&gt;We build Wabbiyo, a self-hosted WhatsApp plugin for WordPress. Comparison with SaaS options: &lt;a href="https://wabbiyo.com/wabbiyo-vs-interakt" rel="noopener noreferrer"&gt;Click here to know more&lt;/a&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>selfhosted</category>
      <category>webdev</category>
      <category>whatsapp</category>
    </item>
    <item>
      <title>6 Hidden Costs in Your WhatsApp Business API Bill</title>
      <dc:creator>Wabbiyo</dc:creator>
      <pubDate>Tue, 27 Oct 2026 11:49:56 +0000</pubDate>
      <link>https://dev.to/wabbiyo/6-hidden-costs-in-your-whatsapp-business-api-bill-102</link>
      <guid>https://dev.to/wabbiyo/6-hidden-costs-in-your-whatsapp-business-api-bill-102</guid>
      <description>&lt;p&gt;If your WhatsApp API bill is higher than expected, one of these is usually why.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Per-message markup&lt;br&gt;
Some platforms add a margin to every template message on top of Meta’s rate. At thousands of messages a month it adds up. Ask for the exact Meta rate and the platform rate separately.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Per-agent seat fees&lt;br&gt;
The team grows from 3 to 8 agents and the bill doubles, without sending a single extra message.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Promotions billed as marketing&lt;br&gt;
“Your order shipped! Use SAVE10 on your next order” isn’t a utility message anymore. Meta can recategorise it and charge the marketing rate. Keep utility templates clean.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Failed sends retried blindly&lt;br&gt;
Retrying failed messages to numbers that aren’t on WhatsApp wastes effort, and resending templates that already delivered costs again. Check the status webhook before retrying.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Unsegmented broadcasts&lt;br&gt;
Sending every promo to every contact means paying for messages to people who never buy, and more blocks, which hurt your number’s quality. Segment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Paid chatbot or automation add-ons&lt;br&gt;
The chatbot or flow builder you assumed was included is a separate monthly charge.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Quick win: reply fast. Replies inside the 24-hour customer service window are free, and utility templates sent while that window is open are free too.&lt;/p&gt;

&lt;p&gt;Wabbiyo is a self-hosted WordPress plugin where you pay Meta directly with no markup and no per-message fees from us. Plans include agents, flows and broadcasts by tier: &lt;a href="https://wabbiyo.com/pricing/" rel="noopener noreferrer"&gt;Click here to know more.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>saas</category>
      <category>whatsapp</category>
      <category>startup</category>
    </item>
    <item>
      <title>6 Mistakes in WhatsApp Chatbot Flows (and How to Fix Them)</title>
      <dc:creator>Wabbiyo</dc:creator>
      <pubDate>Mon, 26 Oct 2026 10:00:36 +0000</pubDate>
      <link>https://dev.to/wabbiyo/6-mistakes-in-whatsapp-chatbot-flows-and-how-to-fix-them-2il9</link>
      <guid>https://dev.to/wabbiyo/6-mistakes-in-whatsapp-chatbot-flows-and-how-to-fix-them-2il9</guid>
      <description>&lt;p&gt;Building WhatsApp flows is easy. Building ones customers actually finish is harder. These six mistakes cause most drop-offs.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Too many steps&lt;br&gt;
Eight questions before anyone helps you feels like a phone menu. Keep qualification to three to five steps.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No way out to a human&lt;br&gt;
If “agent” doesn’t break the flow at every step, customers get stuck and leave. Check for escape keywords before processing the step.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Free text where buttons fit&lt;br&gt;
“Type your city” gets “chn”, “Madras” and “chennai 600017”. Use list messages for fixed choices and keep free text for genuinely open answers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Answers not saved&lt;br&gt;
The flow collects need, city and budget, then the agent asks again. Save every answer to the contact and show it in the inbox.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No timeout handling&lt;br&gt;
The customer leaves mid-flow, comes back two days later, types “hi” and lands on step 4. Reset or resume deliberately after a timeout, and remember the 24-hour window for follow-ups.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Flow never updated&lt;br&gt;
Products, prices and FAQs change, and the flow doesn’t. Review drop-off points monthly and fix the step where most people leave.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you’d rather build flows visually inside WordPress, Wabbiyo’s flow builder covers buttons, lists, conditions, tags, webhooks and handoff: &lt;a href="https://wabbiyo.com/flow-builder/" rel="noopener noreferrer"&gt;Click here to know more&lt;/a&gt;&lt;/p&gt;

</description>
      <category>chatbot</category>
      <category>nocode</category>
      <category>webdev</category>
      <category>whatsapp</category>
    </item>
    <item>
      <title>6 Reasons Your WhatsApp Template Was Rejected (and the Fix for Each)</title>
      <dc:creator>Wabbiyo</dc:creator>
      <pubDate>Sat, 24 Oct 2026 08:29:13 +0000</pubDate>
      <link>https://dev.to/wabbiyo/6-reasons-your-whatsapp-template-was-rejected-and-the-fix-for-each-1825</link>
      <guid>https://dev.to/wabbiyo/6-reasons-your-whatsapp-template-was-rejected-and-the-fix-for-each-1825</guid>
      <description>&lt;p&gt;Your WhatsApp template came back REJECTED and the reason is one line. Here are the usual causes and fixes.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Variable at the start or end&lt;br&gt;
{{1}}, your order is ready → Hi {{1}}, your order is ready.&lt;br&gt;
Your code: {{1}} as the entire body → add context around it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Too many variables&lt;br&gt;
{{1}} {{2}} {{3}} {{4}} at {{5}} could say anything. Write real sentences and use only the variables you need.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Missing sample values&lt;br&gt;
Every {{n}} needs an example in the example.body_text array, in the right order and count.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wrong category&lt;br&gt;
“Your order shipped! Use code SAVE10 next time” is not utility. Split it into two templates: a pure utility shipping update, and a separate marketing offer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Misleading or vague text&lt;br&gt;
Hi {{1}}, you have a surprise waiting gets rejected. Say what it is and who it’s from.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Duplicate content&lt;br&gt;
Submitting the same body under a new name, or an existing template with tiny changes, can be rejected. Edit the existing template instead.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Debugging tip: subscribe to the message_template_status_update webhook and log the rejection reason for each template. Patterns show up quickly.&lt;/p&gt;

&lt;p&gt;If you want pre-written templates and status tracking inside WordPress, Wabbiyo includes a template library on the official Cloud API: Click here to know more&lt;a href="https://wabbiyo.com/templates/" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>webdev</category>
      <category>whatsapp</category>
      <category>beginners</category>
    </item>
    <item>
      <title>6 Ways Click-to-WhatsApp Ad Tracking Breaks (and How to Fix Each)</title>
      <dc:creator>Wabbiyo</dc:creator>
      <pubDate>Fri, 23 Oct 2026 12:03:49 +0000</pubDate>
      <link>https://dev.to/wabbiyo/6-ways-click-to-whatsapp-ad-tracking-breaks-and-how-to-fix-each-22nn</link>
      <guid>https://dev.to/wabbiyo/6-ways-click-to-whatsapp-ad-tracking-breaks-and-how-to-fix-each-22nn</guid>
      <description>&lt;p&gt;You’re capturing the referral object from WhatsApp Click-to-WhatsApp ads, but revenue-per-ad numbers still look wrong. These are the usual reasons.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Referral not saved&lt;br&gt;
It only arrives with the first message from an ad click. If your webhook handler skips it, or only processes text, the source is lost for good. Save it before anything else.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Phone format mismatch&lt;br&gt;
WhatsApp sends 919876543210. WooCommerce stores +91 98765 43210 or 09876543210. Normalise both sides to digits with the country code before matching.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Repeat buyer, old ad&lt;br&gt;
A customer clicked ad A in March and ad B today. Overwriting the source loses history, and never overwriting credits the wrong ad. Store every touch with a timestamp and pick by your attribution rule.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Order placed from another number&lt;br&gt;
The chat came from one number, and the order used a family member’s. Add a fallback match on email, or ask for the order number in chat.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No ad ID in reports&lt;br&gt;
Reports show “Click-to-WhatsApp” as the source but not which ad. Store source_id and map it to campaign and ad names.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Counting chats, not sales&lt;br&gt;
The dashboard still ranks ads by conversations. Make revenue per ad the default view.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Wabbiyo’s WhatsApp Ads module, a WordPress plugin on the official Cloud API, handles referral capture, matching and revenue reports for WooCommerce: &lt;a href="https://wabbiyo.com/whatsapp-ads/" rel="noopener noreferrer"&gt;Click here to know more.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>analytics</category>
      <category>webdev</category>
      <category>whatsapp</category>
    </item>
    <item>
      <title>6 Ways a WhatsApp AI Chatbot Goes Wrong (and How to Prevent Each)</title>
      <dc:creator>Wabbiyo</dc:creator>
      <pubDate>Thu, 22 Oct 2026 10:51:40 +0000</pubDate>
      <link>https://dev.to/wabbiyo/6-ways-a-whatsapp-ai-chatbot-goes-wrong-and-how-to-prevent-each-1n4m</link>
      <guid>https://dev.to/wabbiyo/6-ways-a-whatsapp-ai-chatbot-goes-wrong-and-how-to-prevent-each-1n4m</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5hoy9y7rpahxsxxbx65h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5hoy9y7rpahxsxxbx65h.png" alt=" " width="800" height="336"&gt;&lt;/a&gt;&lt;br&gt;
Adding an LLM to a WhatsApp support line takes an afternoon. Making it safe to leave running takes longer. These are the six failures to design for.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;It invents a discount&lt;br&gt;
A customer asks “any offers?” and the model makes one up. Fix: answer only from retrieved content, and add a hard rule that prices and offers come from your product data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It guesses order status&lt;br&gt;
“Your order will arrive tomorrow” with no lookup behind it. Fix: route order questions to a database lookup by phone number. Never let the model answer them from context.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There’s no way to reach a human&lt;br&gt;
The customer types “agent” three times and gets three AI answers. Fix: check for handoff keywords before calling the model at all.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It answers off-topic questions&lt;br&gt;
Someone asks it to write an essay or solve homework. Besides wasting tokens, Meta’s WhatsApp Business terms (since January 2026) don’t allow general-purpose AI assistants. Fix: scope the system prompt to your business and refuse anything else politely.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Outdated product information&lt;br&gt;
The bot quotes last month’s price. Fix: re-index content when products or pages change, not on a weekly schedule.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wrong language&lt;br&gt;
The customer writes in Hindi or Tamil and gets an English reply. Fix: tell the model to reply in the customer’s language, and test it with real mixed-language messages (“size M available hai?”).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Bonus: log everything&lt;br&gt;
Store the question, retrieved sources, answer and handoff reason for every message. You’ll find content gaps within a week.&lt;/p&gt;

&lt;p&gt;Wabbiyo’s WhatsApp AI chatbot, a WordPress plugin on the official Cloud API, handles retrieval from your site, order lookups and human handoff: &lt;a href="https://wabbiyo.com/ai-chatbot/" rel="noopener noreferrer"&gt;Click here to know more &lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>chatbot</category>
      <category>webdev</category>
      <category>whatsapp</category>
    </item>
    <item>
      <title>6 Bugs You’ll Hit Building a Shared WhatsApp Inbox</title>
      <dc:creator>Wabbiyo</dc:creator>
      <pubDate>Wed, 21 Oct 2026 11:47:03 +0000</pubDate>
      <link>https://dev.to/wabbiyo/6-bugs-youll-hit-building-a-shared-whatsapp-inbox-4pfj</link>
      <guid>https://dev.to/wabbiyo/6-bugs-youll-hit-building-a-shared-whatsapp-inbox-4pfj</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftz8en8nr2aje0q37ux5u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftz8en8nr2aje0q37ux5u.png" alt=" " width="800" height="336"&gt;&lt;/a&gt;&lt;br&gt;
If you’re building a team inbox on the WhatsApp Cloud API, these are the bugs that show up in the first week of real use.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Two agents reply at once&lt;br&gt;
Both opened the chat and both typed a reply. Add ownership: assign on first open (or by a routing rule), and block or warn when a non-owner sends.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Replying after the 24-hour window&lt;br&gt;
The API rejects free-form messages sent more than 24 hours after the customer’s last message. Track the last inbound timestamp and switch the composer to template-only when the window closes. Don’t let agents type a reply that will fail.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Chats stuck with an absent agent&lt;br&gt;
An agent goes on leave with 30 open chats. Add a “reassign all” action, and auto-reassign chats that go unanswered for a set time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Duplicate contacts&lt;br&gt;
“919876543210”, “+91 98765 43210” and “09876543210” become three contacts. Key contacts on the wa_id from the webhook, not on whatever the user typed in a form.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Internal notes sent to the customer&lt;br&gt;
If notes and replies share a table and a send function, one wrong flag sends “this customer is difficult” to the customer. Make notes a separate type that the send path can never pick up.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Media URLs expire&lt;br&gt;
The media URL from the API is short-lived. If you store the URL instead of the file, images and documents break later. Download and store the file when the webhook arrives.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Wabbiyo’s team inbox, a WordPress plugin on the official Cloud API, handles ownership, the service window, reassignment and media storage: &lt;a href="https://wabbiyo.com/team-inbox/" rel="noopener noreferrer"&gt;Click here&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>api</category>
      <category>php</category>
      <category>whatsapp</category>
    </item>
    <item>
      <title>Why Your WhatsApp Broadcast Didn’t Deliver: 6 Causes and How to Debug Them</title>
      <dc:creator>Wabbiyo</dc:creator>
      <pubDate>Sat, 17 Oct 2026 10:38:32 +0000</pubDate>
      <link>https://dev.to/wabbiyo/why-your-whatsapp-broadcast-didnt-deliver-6-causes-and-how-to-debug-them-4p8b</link>
      <guid>https://dev.to/wabbiyo/why-your-whatsapp-broadcast-didnt-deliver-6-causes-and-how-to-debug-them-4p8b</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9j5na173ugx8bwcskp9k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9j5na173ugx8bwcskp9k.png" alt=" " width="800" height="336"&gt;&lt;/a&gt;&lt;br&gt;
You sent a WhatsApp broadcast to 5,000 contacts through the Cloud API. The API returned success for every request, yet delivery reports say far fewer were delivered. Here are the usual causes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The number isn’t on WhatsApp&lt;/strong&gt;&lt;br&gt;
The API accepts the request, then the status webhook returns a failure. Flag these numbers so you don’t keep paying to retry them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Meta’s per-user marketing limit&lt;/strong&gt;&lt;br&gt;
Meta limits how many marketing messages a person receives from businesses within a period. If a user has hit that limit, your message fails with a specific error code. That isn’t a bug in your code. Look at the error code in the webhook payload, not just the “failed” status.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Messaging limit tier reached&lt;/strong&gt;&lt;br&gt;
Each business number can only start conversations with a limited number of unique users per 24 hours. Large audiences on a new number will hit this. Spread the campaign across days.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Template paused for low quality&lt;/strong&gt;&lt;br&gt;
If recipients block or report a template, Meta can pause it. Every send then fails until you fix or replace it. Watch template status webhooks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. The contact never opted in&lt;/strong&gt;&lt;br&gt;
This isn’t an API error, but it is the root cause of points 2 and 4 over time. Don’t put contacts without consent records into marketing sends.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Bad phone formatting&lt;/strong&gt;&lt;br&gt;
“+91 98765-43210”, “098765 43210” and “9876543210” are the same person. Normalise to digits with the country code before sending, or you’ll see failures and duplicates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Debug checklist&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Store the message ID returned for every send.&lt;br&gt;
Log every status webhook with its error code.&lt;br&gt;
Group failures by error code after each campaign.&lt;/p&gt;

&lt;p&gt;Wabbiyo, a WordPress plugin on the official Cloud API, handles queueing, delivery tracking and opt-outs for broadcasts if you’d rather not build this yourself: &lt;a href="https://wabbiyo.com/broadcasts/" rel="noopener noreferrer"&gt;Click here to know more&lt;/a&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>webdev</category>
      <category>whatsapp</category>
      <category>php</category>
    </item>
    <item>
      <title>WooCommerce Order Updates on WhatsApp: 6 Bugs I’d Watch For</title>
      <dc:creator>Wabbiyo</dc:creator>
      <pubDate>Fri, 16 Oct 2026 12:19:46 +0000</pubDate>
      <link>https://dev.to/wabbiyo/woocommerce-order-updates-on-whatsapp-6-bugs-id-watch-for-h64</link>
      <guid>https://dev.to/wabbiyo/woocommerce-order-updates-on-whatsapp-6-bugs-id-watch-for-h64</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2yo4bcta8enz0mztm7fg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2yo4bcta8enz0mztm7fg.png" alt=" " width="800" height="336"&gt;&lt;/a&gt;&lt;br&gt;
Sending a WhatsApp message when a WooCommerce order changes status sounds like a 10-line job. In production, these six problems show up first.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Sending inside the request&lt;br&gt;
If you call the WhatsApp API directly inside woocommerce_order_status_changed, a slow API response slows down checkout or the admin order screen. Push the work to Action Scheduler with as_enqueue_async_action() instead.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The same message twice&lt;br&gt;
Admins move an order from processing to on-hold and back. Your hook fires each time. Save a meta flag such as _wa_sent_processing and check it before sending.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Bad phone numbers&lt;br&gt;
Customers type “098765 43210”, “+91-98765-43210” or a number without the country code. Normalise using the billing country, strip everything except digits, and drop the leading zero.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No consent&lt;br&gt;
Sending without opt-in risks your number’s quality rating. Add a checkbox at checkout, save it to order meta, and check it before every send.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Template category drift&lt;br&gt;
“Your order shipped! Use code SAVE10 on your next order” looks harmless, but Meta will treat it as marketing. Keep order templates purely transactional so they stay in the cheaper utility category.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Silent failures&lt;br&gt;
The API returns a message ID even if delivery later fails. Subscribe to the status webhook, write the result to the order notes, and fall back to the WooCommerce email when it fails.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;php&lt;br&gt;
add_action( 'woocommerce_order_status_changed', function( $id, $from, $to, $order ) {&lt;br&gt;
    $tpl = $map[ $to ] ?? null;&lt;br&gt;
    if ( $tpl &amp;amp;&amp;amp; has_opt_in( $order ) &amp;amp;&amp;amp; ! $order-&amp;gt;get_meta( "&lt;em&gt;wa_sent&lt;/em&gt;$to" ) ) {&lt;br&gt;
        as_enqueue_async_action( 'send_wa_order_update', [ $id, $tpl ] );&lt;br&gt;
    }&lt;br&gt;
}, 10, 4 );&lt;/p&gt;

&lt;p&gt;If you’d rather not build and maintain this, Wabbiyo is a WordPress plugin that does it on the official WhatsApp Cloud API, with a free plan: &lt;a href="https://wabbiyo.com/woocommerce/" rel="noopener noreferrer"&gt;Click here to learn more&lt;/a&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>automation</category>
      <category>php</category>
      <category>woocommerce</category>
    </item>
    <item>
      <title>6 Edge Cases That Break Abandoned Cart Reminders (and How to Handle Them)</title>
      <dc:creator>Wabbiyo</dc:creator>
      <pubDate>Thu, 15 Oct 2026 11:21:52 +0000</pubDate>
      <link>https://dev.to/wabbiyo/6-edge-cases-that-break-abandoned-cart-reminders-and-how-to-handle-them-g9o</link>
      <guid>https://dev.to/wabbiyo/6-edge-cases-that-break-abandoned-cart-reminders-and-how-to-handle-them-g9o</guid>
      <description>&lt;p&gt;Sending a reminder when a cart is abandoned sounds simple. In production, these six cases cause most of the complaints.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;They already ordered (race condition)&lt;br&gt;
The customer pays a few seconds before the reminder job runs.&lt;br&gt;
Fix: cancel scheduled jobs on order creation and re-check for an order inside the job before sending.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;They ordered on another device&lt;br&gt;
Cart on mobile, order on laptop. Your cart ID never gets linked to the order.&lt;br&gt;
Fix: before sending, look for a recent order matching the phone number or email, not just the cart ID.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The cart changed after capture&lt;br&gt;
They added two more items after you saved the first snapshot.&lt;br&gt;
Fix: update the snapshot on every checkout update and reset the timer each time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;An item went out of stock&lt;br&gt;
Reminding someone to buy something they can’t buy is worse than no reminder.&lt;br&gt;
Fix: check stock in the job; skip the message or remove that item from it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The message lands at 2 AM&lt;br&gt;
Timers don’t know the customer’s time of day.&lt;br&gt;
Fix: add quiet hours and push messages into the next allowed window.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The customer replied STOP&lt;br&gt;
Consent can be withdrawn at any time.&lt;br&gt;
Fix: store consent per contact, handle opt-out replies, and check consent right before every send.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Bonus: duplicate carts. One shopper can create several carts in a session. Deduplicate by phone so they get one sequence, not three.&lt;/p&gt;

&lt;p&gt;If you’re building this yourself, the architecture (Action Scheduler + WhatsApp Cloud API) is here: &lt;a href="https://wabbiyo.hashnode.dev/how-to-build-whatsapp-abandoned-cart-reminders-in-woocommerce-action-scheduler-cloud-api" rel="noopener noreferrer"&gt;read on Hashnode&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you’d rather see the full recovery strategy (timing, copy, coupons): &lt;a href="https://wabbiyo.com/whatsapp-cart-recovery-for-woocommerce-recover-more-abandoned-sales-with-wabbiyo/" rel="noopener noreferrer"&gt;WhatsApp cart recovery for WooCommerce&lt;/a&gt;&lt;/p&gt;

</description>
      <category>woocommerce</category>
      <category>php</category>
      <category>webdev</category>
      <category>ecommerce</category>
    </item>
  </channel>
</rss>
