📄 Plugin Documentation

WhatsApp Notifications for WooCommerce

Send WhatsApp order notifications & recover abandoned carts automatically using the Meta Cloud API — no third-party service, no per-message fees beyond Meta's own pricing.

🔖 Version 1.0.0
⚙️ Requires WP 6.0+ / WC 7.0+
🐘 Requires PHP 7.4+
✅ HPOS Compatible

Overview

WooNotify connects your WooCommerce store directly to the Meta WhatsApp Cloud API. Every time an order status changes, a WhatsApp notification is sent to the customer's phone using a pre-approved Meta Message Template. The plugin also detects abandoned carts and sends a recovery message 1 hour later — all without any third-party relay service.

How it works at a glance

🛒 Customer places order
📥 Message queued in DB
WP-Cron fires every 2 min
📡 Meta API called
💬 WhatsApp delivered

Key features

Requirements

RequirementMinimumNotes
WordPress6.0Any recent version works
WooCommerce7.0Tested up to 9.0
PHP7.48.0+ recommended
Meta Business AccountFree to create at business.facebook.com
WhatsApp Business AppMust have a verified phone number
System User Access TokenPermanent token — NOT the temporary 24-hour token
Approved Message TemplatesRequired for sending outbound messages
WP-Cron or server cronNeeded for queue processing and abandoned cart checks
💡

Meta Free Tier: Meta provides 1,000 free conversations per month per WhatsApp Business Account. Beyond that, pricing is approximately ₹0.50–₹0.80 per conversation in India. See Meta's pricing page for your region.

Installation

  1. Upload the plugin

    Upload the order-notify-for-woocommerce folder to your /wp-content/plugins/ directory, or install via Plugins → Add New → Upload Plugin in the WordPress admin.

  2. Activate

    Go to Plugins → Installed Plugins and activate WhatsApp Notifications for WooCommerce. The plugin will automatically create two database tables (wp_wanc_log and wp_wanc_abandoned) and schedule WP-Cron events.

  3. Configure Meta API credentials

    Go to WA Notify → Settings → API Setup and enter your Phone Number ID and System User Access Token. See the Meta API Setup section below for step-by-step instructions.

  4. Create and configure message templates

    In Meta Business Manager, create approved Message Templates for each notification type. Then enter the template names under WA Notify → Settings → Templates.

  5. Send a test message

    Enter your phone number in the API Setup tab and click Send Test to verify the connection is working.

⚠️

WooCommerce must be active before activating this plugin. If WooCommerce is deactivated after installation, WooNotify will show an admin notice and stop functioning until WooCommerce is restored.

Meta API Setup

This is the most important step. Follow these instructions carefully to obtain the correct credentials.

Step 1 — Create a Meta Business App

  1. Go to Meta Developers

    Visit developers.facebook.com and click My Apps → Create App.

  2. Choose "Business" type

    Select Business as the app type. This unlocks WhatsApp API access.

  3. Add WhatsApp product

    In your app dashboard, find Add Products and click Set Up next to WhatsApp.

  4. Link your WhatsApp Business Account

    Follow the prompts to connect an existing WhatsApp Business Account or create a new one.

Step 2 — Get your Phone Number ID

🚫

Common mistake: Do not enter your App ID, WABA ID (WhatsApp Business Account ID), or your actual phone number in the Phone Number ID field. These are all different values.

  1. Navigate to WhatsApp → API Setup

    In your Meta App dashboard, go to WhatsApp → API Setup in the left sidebar.

  2. Find Phone Number ID

    Under the "From" section, you will see your phone number listed. Below or beside it is the Phone Number ID — a long numeric string like 1234567890123456. This is what you need.

Step 3 — Create a Permanent System User Token

⚠️

Do NOT use the temporary access token shown on the API Setup page. It expires after 24 hours. You need a permanent System User token.

  1. Go to Meta Business Settings

    Visit business.facebook.com/settings and navigate to Users → System Users.

  2. Create a System User

    Click Add, give it a name (e.g., "WooCommerce Notifier"), and set role to Admin.

  3. Assign assets

    Click Add Assets → select your WhatsApp Business Account → grant Full Control.

  4. Generate a token

    Click Generate New Token → select your app → check whatsapp_business_messaging and whatsapp_business_management permissions → set expiration to Never → Generate.

  5. Copy and save the token immediately

    This token is shown only once. Copy it and paste it into the plugin's Permanent System User Token field.

Step 4 — Create Message Templates

Before you can send notifications, you must create approved Message Templates in Meta. WhatsApp does not allow businesses to send free-form text messages to customers who haven't contacted them first.

  1. Go to WhatsApp Manager

    In Meta Business Manager → WhatsApp Manager → Message Templates.

  2. Create a template

    Click Create Template. Choose category Utility or Marketing, give it a name (lowercase letters, numbers, underscores only — e.g., order_confirmed), and select a language.

  3. Write the body with variables

    Use positional variables like {{1}}, {{2}} for dynamic content. For example:

    Hi {{1}}! Your order #{{2}} has been confirmed.
    Total: {{3}}
    Thank you for shopping with {{4}}!
  4. Submit for review

    Templates are usually approved within a few minutes to a few hours.

App must be Live: Your Meta app must be set to Live mode (not Development mode) to send messages to any phone number. In Development mode, only phone numbers explicitly added as test numbers can receive messages.

Settings — API Setup Tab

Meta Cloud API Credentials

FieldDescription
Phone Number ID The numeric ID of your WhatsApp Business phone number. Found in Meta Developer Console → WhatsApp → API Setup. Not your actual phone number.
Permanent System User Token A long-lived access token created via Meta Business Settings → System Users. Do not use the temporary 24-hour token shown on the API Setup page.
Template Language Code The language code of your Meta Message Templates (e.g., en_US, en_IN, hi). Must exactly match the language you selected when creating the template in Meta. Default: en_US.
⚠️

Language code mismatch is the most common error. If your template was created with language "English" it might be en, en_US, or en_GB — these are different. Check the exact code in Meta's WhatsApp Manager → Message Templates column.

Test & Admin Notifications

FieldDescription
Your Phone Number The phone number to send test messages to. Also used for admin order notifications if enabled. Format: 9876543210 or +919876543210.
Admin Notification When enabled, sends a copy of each customer notification to the admin phone number as well.
Test Template Name The Meta template name to use when clicking "Send Test". If blank, the plugin uses the first configured trigger template. Use hello_world (Meta's built-in) for a quick connectivity test.
Test Variables Optional comma-separated values to fill the template's {{1}}, {{2}}... variables during test. Leave empty for templates with no variables (like hello_world).

Validate Connection button

Clicking Validate Connection calls the Meta Graph API to verify your Phone Number ID and token are correct. On success, it shows the business account name. On failure, it shows the exact Meta error message.

Settings — Notifications Tab

Enable or disable each notification trigger independently. Each trigger has its own toggle switch.

🎉 Payment Confirmed

Fires when the order status changes to Processing — i.e., payment was received. This is typically the first message a customer receives.

📦 Order Shipped

Fires when the order status changes to Shipped (custom status added by this plugin). Include {{tracking_number}} in your template.

🚚 Out for Delivery

Fires when status changes to Out for Delivery (custom status added by this plugin). Reassures customers the package is nearby.

Order Completed

Fires when status changes to Completed. Good moment to thank the customer and invite a review.

🚫 Order Cancelled

Fires when status changes to Cancelled. Informs the customer and can prompt them to contact support.

💸 Order Refunded

Fires when status changes to Refunded. Confirms the refund has been processed.

🛒 Abandoned Cart

Fires 1 hour after a customer adds items to cart and starts checkout but does not complete the order. Includes a recovery link.

ℹ️

Notifications only send to customers who opted in. The plugin adds a "Send me WhatsApp updates" checkbox to the WooCommerce checkout form. Only customers who check it will receive notifications. This is required for GDPR and TRAI compliance.

Settings — Templates Tab

Each trigger has its own template card where you configure how the message is sent.

FieldDescription
Meta Template Name The exact name of your approved Meta Message Template (e.g., order_confirmed). Must be lowercase with underscores. If empty, the plugin falls back to free-form text (unreliable — requires customer to have messaged you first).
Template Parameter Mapping A comma-separated list of variable names that maps to your template's positional variables ({{1}}, {{2}}...). The order must match. Example: {{customer_name}},{{order_id}},{{order_total}}{{1}} = customer name, {{2}} = order ID, {{3}} = total.
Free-form Preview A text preview of the message rendered with variables. This is only for your reference — the actual message sent uses the Meta template. It is not sent directly as text.

Available Variables (Preview Only)

These variables can be used in the free-form preview field and as values in the Parameter Mapping field:

{{customer_name}} {{order_id}} {{order_total}} {{order_status}} {{billing_phone}} {{tracking_number}} {{site_name}} {{cart_link}} {{discount_code}}
💡

Abandoned Cart extra variables: The abandoned cart trigger also resolves {{cart_link}} to a unique recovery URL (e.g., https://yourstore.com/cart/?wanc_recover=TOKEN) and {{order_total}} to the cart total.

Settings — Checkout Tab

FieldDescription
Opt-in Label The label text shown next to the WhatsApp opt-in checkbox on the WooCommerce checkout form. Default: "Send me WhatsApp updates about my order".
Opt-in Default Whether the checkbox should be pre-checked when a customer loads the checkout page. Disabled by default — pre-checking is against GDPR and TRAI regulations. Only enable if your legal team has confirmed it is permitted in your jurisdiction.
🚫

Compliance note: Pre-checking the WhatsApp opt-in box is illegal under GDPR (EU), TRAI regulations (India), and PECR (UK). The plugin defaults to unchecked. Only enable "Pre-checked" if explicitly permitted by applicable law in your territory.

Order Triggers — How They Work

The plugin listens to WooCommerce's order status change hooks. When an order moves to a status that has a trigger configured and enabled, and the customer opted in, the plugin:

  1. Reads the trigger's template name and parameter mapping from settings
  2. Resolves variable values from the live order (customer name, order total, etc.)
  3. Builds a JSON payload with the template name and resolved parameters
  4. Inserts a row into the message queue table (wp_wanc_log) with status queued
  5. WP-Cron picks it up within 2 minutes and calls the Meta API
ℹ️

Messages are never sent synchronously during the order save/update. They are always queued first. This prevents checkout slowdowns and allows retries if the Meta API is temporarily unavailable.

Meta Message Templates

Why templates are required

WhatsApp's Cloud API distinguishes between two types of messages:

TypeWhen it worksUse case
Free-form text (type: text) Only within 24 hours of the customer messaging your business number first (the "customer service window") Replying to customer inquiries
Message Templates (type: template) Anytime — even if the customer has never messaged you Order confirmations, shipping updates, abandoned cart — all business-initiated messages

Since WooCommerce order notifications are always business-initiated (the store sends first), they must use approved Message Templates. Free-form messages will appear as sent in the log but will not be delivered.

Template naming rules

Template variables (positional)

Meta templates use positional variables: {{1}}, {{2}}, {{3}}, etc. The plugin's Parameter Mapping field maps plugin variables to these positions.

Example

Meta template body:

Hi {{1}}! Your order #{{2}} worth {{3}} has been shipped.
Tracking: {{4}}
— {{5}}

Plugin parameter mapping:

{{customer_name}},{{order_id}},{{order_total}},{{tracking_number}},{{site_name}}

Result sent via API:

{{1}} = "John"
{{2}} = "1042"
{{3}} = "₹1,499.00"
{{4}} = "BD123456IN"
{{5}} = "My Store"
⚠️

Parameter count must match exactly. If your template has 3 variables ({{1}}, {{2}}, {{3}}), your mapping must have exactly 3 comma-separated values. More or fewer will cause a #132000 error from Meta.

Template Variables Reference

All variables available to use in the Parameter Mapping field and free-form preview templates:

VariableResolves ToAvailable In
{{customer_name}} Customer's billing first name (falls back to last name, then "Customer") All order triggers, Abandoned Cart
{{order_id}} WooCommerce order number (e.g., 1042) All order triggers
{{order_total}} Formatted order total with currency (e.g., ₹1,499.00). For abandoned cart: formatted cart total. All order triggers, Abandoned Cart
{{order_status}} Human-readable order status label (e.g., "Processing", "Completed") All order triggers
{{billing_phone}} Customer's billing phone number as entered at checkout All order triggers
{{tracking_number}} Tracking number entered in the order edit screen's "WhatsApp Tracking Number" field. Returns N/A if not set. All order triggers
{{site_name}} WordPress site name from Settings → General → Site Title All order triggers, Abandoned Cart
{{cart_link}} Unique cart recovery URL (e.g., https://yourstore.com/cart/?wanc_recover=abc123). Clicking it restores the customer's cart and redirects to the cart page. Abandoned Cart only
{{discount_code}} Reserved for future use. Currently resolves to empty string.

Abandoned Cart Recovery

The abandoned cart feature automatically detects when a customer starts filling out the checkout form but leaves without completing their purchase — and sends them a WhatsApp message 1 hour later with a link to recover their cart.

How it works

  1. Customer fills checkout form

    On the checkout page, the plugin injects a small JavaScript snippet. When the customer types their phone number AND checks the WhatsApp opt-in checkbox, the script waits 2 seconds (to avoid firing on every keystroke), then sends the phone and cart contents to a background AJAX endpoint.

  2. Cart session saved

    The AJAX handler saves the session to the wp_wanc_abandoned table with status active, along with a unique recovery token, the phone number, and the cart contents (product IDs, quantities, variations).

  3. Customer places order — session marked recovered

    If the customer completes checkout, the plugin immediately marks the cart session as recovered. No notification is sent.

  4. Cron checks every 30 minutes

    WP-Cron runs the abandoned cart check every 30 minutes. It looks for sessions that are still active and were created more than 1 hour ago.

  5. Recovery message sent

    For each qualifying cart, the plugin queues an abandoned cart notification using your configured Meta template. The session status is updated to notified.

  6. Customer clicks recovery link

    If the customer clicks {{cart_link}} in the WhatsApp message, WooCommerce restores their cart items and redirects them to the cart page. The session status is updated to recovered.

Requirements for abandoned cart to work

Recommended template for abandoned cart

Create a Meta template with these variables and use the following parameter mapping:

Meta Template Body:
Hi {{1}}! You left something in your cart 🛒

Your cart total: {{2}}

Complete your order here:
{{3}}

— {{4}}

Parameter Mapping:

{{customer_name}},{{order_total}},{{cart_link}},{{site_name}}
💡

On localhost / XAMPP: Since WP-Cron only fires when someone visits your site, you won't get automatic abandoned cart checks on a local dev environment. Use the ⚡ Process Queue Now button in Message Log to manually trigger queue processing, or set up a real server cron job.

Tracking Numbers

The plugin adds a "WhatsApp Tracking Number" field to the WooCommerce order edit screen, displayed below the shipping address section.

How to use it

  1. Go to WooCommerce → Orders and open an order
  2. Scroll down to the Shipping section — you'll see the "WhatsApp Tracking Number" input
  3. Enter a tracking number or full tracking URL (e.g., BD123456IN or https://track.dhl.com/BD123456IN)
  4. Click Save Order

The value is automatically available as {{tracking_number}} in all notification templates. If no tracking number is set, it resolves to N/A.

ℹ️

Best practice: Enter the tracking number first, then change the order status to "Shipped". This ensures the tracking number is included in the Shipped notification.

Custom Order Statuses

WooCommerce does not include "Shipped" or "Out for Delivery" statuses by default. This plugin registers both:

StatusSlugPlaced AfterCounts as Paid
📦 Shipped wc-shipped Processing Yes
🚚 Out for Delivery wc-out-for-delivery Shipped Yes

These statuses appear in the WooCommerce order status dropdown in the correct position in the fulfilment workflow:

Pending
🔄Processing
📦Shipped
🚚Out for Delivery
Completed

Message Log

The Message Log (WA Notify → Message Log) shows every message the plugin has queued, sent, or failed. It is the primary tool for monitoring and troubleshooting.

Message statuses

StatusMeaning
Queued The message is waiting to be sent by the next WP-Cron run. This is normal — messages are processed within 2 minutes.
Sent The Meta API accepted the message. Meta's infrastructure will deliver it to WhatsApp.
Failed The Meta API returned an error after 3 retry attempts. The error message is shown in the log row.

Log actions

ActionDescription
Retry Immediately re-sends a failed message. Can be clicked multiple times regardless of prior retry count. Use this after fixing the root cause (e.g., wrong template name, expired token).
Delete Removes the log row. Does not affect the order or any WooCommerce data.
Export CSV Downloads all log entries as a CSV file for external analysis or record-keeping.
⚡ Process Queue Now Manually triggers the queue processor immediately without waiting for WP-Cron. Useful on local development environments or when testing.

WP-Cron status banner

The top of the Message Log shows the current cron schedule. If WP-Cron events are not scheduled (which can happen after some caching plugins clear scheduled events), the banner shows a warning. The plugin automatically reschedules the cron on every WordPress page load via a self-healing mechanism.

Testing

Testing the API connection

  1. Go to WA Notify → Settings → API Setup
  2. Enter your phone number in Your Phone Number
  3. In Test Template Name, enter hello_world (Meta's built-in template — no variables, always approved)
  4. Click 📱 Send Test
  5. You should receive a WhatsApp message within seconds

Testing a template with variables

  1. Set Test Template Name to your template (e.g., order_confirmed)
  2. In Test Variables, enter comma-separated sample values matching your template's variable count.
    Example for a 3-variable template: John, 1042, ₹1499
  3. Click 📱 Send Test

Testing order notifications end-to-end

  1. Place a test order in WooCommerce and check the WhatsApp opt-in checkbox
  2. Set order status to Processing — this fires the Payment Confirmed trigger
  3. Check WA Notify → Message Log — the message should appear as Queued
  4. Click ⚡ Process Queue Now to send immediately (instead of waiting for cron)
  5. The status should change to Sent and you should receive the WhatsApp message

Testing abandoned cart

  1. Open an incognito/private browser window
  2. Add a product to cart and proceed to checkout
  3. Enter your phone number and check the WhatsApp opt-in checkbox
  4. Wait 2 seconds (the tracker script fires after a 2-second debounce)
  5. Navigate away from the checkout page without placing an order
  6. Check wp_wanc_abandoned in your database — a row with status = 'active' should appear
  7. After the 1-hour threshold, click ⚡ Process Queue Now to trigger the abandoned cart check manually (or wait for cron)
⚠️

Opt-in is mandatory for testing. The abandoned cart tracker only fires when both the phone field has a value AND the opt-in checkbox is checked. If you skip the checkbox, nothing will be saved.

WP-Cron

WP-Cron is WordPress's built-in task scheduler. This plugin schedules two recurring events:

EventIntervalWhat it does
wanc_process_queue Every 2 minutes Sends up to 50 queued messages per run. Failed messages are retried up to 3 times. A 100ms delay is added between API calls to respect Meta's rate limits.
wanc_abandoned_cart_check Every 30 minutes Checks for cart sessions older than 1 hour with status active and queues recovery messages.

How WP-Cron works

WP-Cron is pseudo-cron — it runs when someone visits a page on your website, not on a real time schedule. On high-traffic sites, timing is accurate. On low-traffic sites or local development environments, cron events may be delayed or may never run.

Self-healing cron

The plugin includes a self-healing mechanism. On every WordPress page load, it checks if both cron events are scheduled and reschedules them if they are missing (which can happen when caching plugins clear scheduled events or after WordPress updates).

Setting up a real server cron (recommended for production)

For reliable timing on production sites, disable WP-Cron and use a real server cron job instead:

1. Add to wp-config.php
define( 'DISABLE_WP_CRON', true );
2. Add to your server's crontab (runs every minute)
* * * * * php /path/to/wordpress/wp-cron.php > /dev/null 2>&1
# or via WP-CLI:
* * * * * cd /path/to/wordpress && wp cron event run --due-now > /dev/null 2>&1

Testing on localhost (XAMPP/WAMP)

On a local development machine, no external traffic visits your site so WP-Cron never fires automatically. Use the ⚡ Process Queue Now button in the Message Log to trigger queue processing manually whenever you want to test.

Database Schema

The plugin creates two custom tables during activation using dbDelta() (WordPress's safe table creation utility).

wp_wanc_log

Message log — stores every queued, sent, and failed message.

ColumnTypeNotes
idBIGINT PKAuto-increment
order_idBIGINT0 for abandoned cart messages
phoneVARCHAR(20)E.164 format e.g. +919876543210
trigger_eventVARCHAR(60)e.g. processing, shipped, abandoned
message_bodyTEXTJSON for template messages; plain text for free-form
statusVARCHAR(20)queued / sent / failed
meta_msg_idVARCHAR(100)Meta's WAMID on success
error_messageTEXTMeta error on failure
retry_countTINYINTAuto-retries: 0–3
created_atDATETIMEWhen queued
sent_atDATETIMEWhen successfully sent

wp_wanc_abandoned

Abandoned cart sessions — tracks incomplete checkouts for recovery.

ColumnTypeNotes
idBIGINT PKAuto-increment
session_idVARCHAR(100)WooCommerce session customer ID. Unique key.
phoneVARCHAR(20)E.164 phone number
cart_contentsLONGTEXTJSON: array of {product_id, variation_id, quantity}
cart_totalDECIMAL(10,2)Cart total at time of capture
recovery_tokenVARCHAR(64)Unique token for recovery URL
statusVARCHAR(20)active / notified / recovered
notified_atDATETIMEWhen recovery message was sent
recovered_atDATETIMEWhen customer clicked recovery link or placed order
created_atDATETIMEWhen cart was first captured

message_body format

When a Meta Message Template is configured, message_body is stored as a JSON object:

{
  "_wanc_tpl": 1,
  "name": "order_confirmed",
  "params": ["John", "1042", "₹1,499.00", "Processing", "N/A", "My Store"],
  "preview": "Hi John! Your order #1042 has been confirmed. Total: ₹1,499.00"
}

The _wanc_tpl flag tells the queue processor to use send_template() instead of send_text(). The preview field is displayed in the Message Log for human readability.

Cleanup on uninstall

When the plugin is deleted (not just deactivated) via Plugins → Delete, the uninstall.php script automatically:

Privacy & Data

Data sent to Meta

When a notification is sent, the following data is transmitted to Meta's servers at graph.facebook.com:

No payment information (card numbers, bank details) is ever sent.

Data stored locally

The following data is stored in your WordPress database:

Consent

The plugin adds an opt-in checkbox to the WooCommerce checkout form. Notifications are only sent to customers who explicitly check this box. The checkbox is unchecked by default, complying with GDPR, TRAI, and similar regulations.

⚠️

Access token security: Your Meta System User access token is stored in the WordPress database. Ensure your database is not publicly accessible and your WordPress installation is properly secured. Consider using a dedicated System User with only the whatsapp_business_messaging permission scope.

Troubleshooting

Error: "Object with ID does not exist"

🔴

Cause: You have entered the wrong ID in the Phone Number ID field. You may have entered your App ID, WABA ID, or another numeric ID instead of the Phone Number ID.

Fix: In Meta Developer Console → WhatsApp → API Setup, look specifically for Phone Number ID — not any other ID on that page.

Error: "#132000 Number of parameters does not match"

🔴

Cause: The number of values in your Parameter Mapping does not match the number of {{1}}, {{2}}... variables in your Meta template.

Fix: Count the variables in your Meta template body. Set exactly that many comma-separated values in the Parameter Mapping field. For a template with no variables (like hello_world), the mapping must be empty.

Error: "Template name does not exist in the translation"

🔴

Cause: Either the template name is misspelled, or the Template Language Code does not match the language the template was created in.

Fix: Go to Meta Business Manager → WhatsApp Manager → Message Templates and find your template. Note the exact name and language code shown. Update both the Meta Template Name and Template Language Code in the plugin settings to match exactly.

Messages stay in "Queued" status

⚠️

Cause: WP-Cron is not running. This is common on local development environments (XAMPP, WAMP, etc.) where no external traffic visits the site.

Fix: Click ⚡ Process Queue Now in the Message Log. For ongoing use, set up a real server cron job as described in the WP-Cron section.

API connected but WhatsApp message not received

⚠️

Cause: No Meta Message Template is configured. The plugin fell back to sending a free-form text message, which requires the customer to have messaged the business number within the last 24 hours.

Fix: Create an approved Meta Message Template and enter its name in the Templates tab. Approved templates are delivered immediately with no conversation window requirement.

Test button always sends hello_world instead of my template

⚠️

Cause: The Test Template Name field in the API Setup tab is empty or was not saved.

Fix: Enter your template name in the Test Template Name field and click 💾 Save Settings first. Then send the test.

Abandoned cart notification not sending

⚠️

Check these in order:

  • Is the Abandoned Cart trigger enabled in Notifications tab?
  • Is a Meta Template Name entered for the Abandoned Cart card in Templates tab?
  • Did you check the WhatsApp opt-in checkbox on checkout? (Required)
  • Did you type your phone number before checking the opt-in?
  • Is WP-Cron running? Check the cron status banner in Message Log.
  • Check the wp_wanc_abandoned table — is a row present with status = 'active'?

Custom order statuses (Shipped / Out for Delivery) not visible in WooCommerce

⚠️

Fix: Deactivate and reactivate the plugin. The statuses are registered on every page load, so if they are missing, try clearing any caching plugin's cache and visiting the WooCommerce Orders page again.

Frequently Asked Questions

Does this plugin require a subscription or monthly fee?

No. The plugin itself is free. You pay only Meta's standard WhatsApp Cloud API rates — 1,000 conversations per month are free, and beyond that pricing varies by country and conversation type.

What is the difference between a "conversation" and a "message"?

Meta charges per 24-hour conversation window, not per individual message. If you send 5 messages to the same customer within 24 hours, it counts as 1 conversation.

Can I send images or attachments in notifications?

Not in the current version. The plugin supports text-only Message Templates. Meta also supports header images in templates — this may be added in a future version.

Does the customer need to have WhatsApp installed?

Yes. Messages are sent via WhatsApp. If the customer's phone doesn't have WhatsApp, the message won't be delivered.

Is the plugin compatible with WooCommerce HPOS?

Yes. The plugin declares HPOS compatibility and uses WooCommerce's order object API ($order->get_meta(), $order->update_meta_data()) instead of direct post meta functions.

What happens to the customer's data if I uninstall the plugin?

When you delete (not just deactivate) the plugin via WordPress admin, the uninstall script drops both database tables and removes all plugin options. All customer phone numbers and cart data stored by the plugin are permanently deleted.

Can I use multiple WhatsApp phone numbers?

The current version supports one WhatsApp Business phone number per WordPress installation. Multi-number support may be added in a future version.

How do I get a long-lived access token?

Use a System User token from Meta Business Settings → System Users. System User tokens don't expire (unless you set an expiration date or revoke them). This is different from the user access token or the temporary token shown in the Meta Developer Console.

What Meta API version does the plugin use?

The plugin uses Meta Graph API v25.0 via the endpoint https://graph.facebook.com/v25.0/.

Why does the plugin queue messages instead of sending immediately?

Sending via WP-Cron queue has several advantages: it doesn't slow down the checkout/order-save process, it allows automatic retries if Meta's API is temporarily unavailable, and it provides a full audit log of all messages.

WhatsApp Notifications for WooCommerce v1.0.0 — Built by kamleshyadav — kamleshyadav.com