{"id":315379,"date":"2026-05-20T13:34:58","date_gmt":"2026-05-20T13:34:58","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/codeatoz-cloud-messaging-for-woocommerce\/"},"modified":"2026-10-05T09:51:47","modified_gmt":"2026-10-05T09:51:47","slug":"codeatoz-cloud-messaging-for-woocommerce","status":"publish","type":"plugin","link":"https:\/\/so.wordpress.org\/plugins\/codeatoz-cloud-messaging-for-woocommerce\/","author":23453096,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.5.1","stable_tag":"1.5.1","tested":"7.1.3","requires":"6.2","requires_php":"8.0","requires_plugins":null,"header_name":"CodeAtoZ \u2013 Cloud Messaging for WooCommerce","header_author":"CodeAtoZ","header_description":"Send WooCommerce order notifications via WhatsApp using Meta's Cloud API. GDPR-compliant checkout opt-in, STOP keyword handling, encrypted token storage. Direct Meta integration \u2014 no BSP middleman, no markup on message costs.","assets_banners_color":"4f6371","last_updated":"2026-10-05 09:51:47","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/codeatoz.com","rating":0,"author_block_rating":0,"active_installs":10,"downloads":455,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.4.6":{"tag":"1.4.6","author":"codeatoz","date":"2026-05-20 13:33:39","revision":3539414},"1.4.7":{"tag":"1.4.7","author":"codeatoz","date":"2026-05-23 07:38:20","revision":3544844},"1.5.0":{"tag":"1.5.0","author":"codeatoz","date":"2026-10-05 08:46:31","revision":3728435},"1.5.1":{"tag":"1.5.1","author":"codeatoz","date":"2026-10-05 09:51:47","revision":3728559}},"upgrade_notice":{"1.5.1":"<p>Adds the Click-to-Chat button that has been advertised since 1.0 but was never implemented, Site Health checks, and a Re-send action on the message log. Fixes retired per-conversation pricing text still shown inside the plugin, and an uninstall routine that left customer phone numbers behind on High-Performance Order Storage stores. The Setup Guide now documents the features added in 1.5.0. No database changes \u2014 safe to update.<\/p>","1.5.0":"<p>Recommended for all users. Fixes a bug where &quot;Order Confirmed&quot; notifications could never fire, two public REST endpoints that returned a PHP fatal error on every call, and a non-functional &quot;Notify Me&quot; button on out-of-stock product pages. Upgrades the Meta Graph API from v21.0 (which expires 21 January 2027) to v25.0. Adds a template variable mapper that eliminates Meta error #132000, a Usage &amp; Costs screen for Meta&#039;s per-message billing, and a customer WhatsApp preference centre under My Account. Your settings, subscribers and message log are preserved; the &quot;Order Confirmed&quot; setting is migrated automatically.<\/p>","1.4.7":"<p>WordPress 7.0 compatibility release. Verified against WP 7.0 and WooCommerce 10.7. No breaking changes \u2014 existing settings, subscribers, message log and message queue continue to work on WP 6.2+ unchanged.<\/p>","1.3.1":"<p>Minor UI refinements and readme expansion for WordPress.org submission. Existing settings and message logs are preserved on update.<\/p>","1.3.0":"<p>WordPress.org compliance pass. Recommended for all users. No database changes \u2014 safe to update.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3539414,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3539414,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3539414,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3539414,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"wcwa\/chat-button":{"name":"wcwa\/chat-button","title":"WhatsApp Chat Button"}},"tagged_versions":["1.4.6","1.4.7","1.5.0","1.5.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3539414,"resolution":"1","location":"assets","locale":"","width":1400,"height":700},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3539414,"resolution":"2","location":"assets","locale":"","width":1400,"height":1103},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3539414,"resolution":"3","location":"assets","locale":"","width":1400,"height":778},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3539414,"resolution":"4","location":"assets","locale":"","width":1400,"height":712}},"screenshots":{"1":"<p><strong>WhatsApp order notifications on mobile<\/strong> \u2014 A real WhatsApp conversation showing the full order journey: confirmed \u2192 shipped with tracking \u2192 delivered, plus a customer reply. This is exactly what your customers receive on their phones, powered directly by Meta's Cloud API.<\/p>","2":"<p><strong>Connection settings<\/strong> \u2014 Enter your Meta Phone Number ID, WhatsApp Business Account ID, permanent System User Token, and App Secret. The Webhook URL and Verify Token are auto-generated and copy-to-clipboard ready. A live \"Test Connection\" button confirms your setup works before going live.<\/p>","3":"<p><strong>Message templates<\/strong> \u2014 Browse all your Meta-approved WhatsApp templates fetched live from your account. Utility and Marketing categories shown with status indicators. Use \"Refresh from Meta\" to sync after creating new templates in the Meta Business portal.<\/p>","4":"<p><strong>Message log<\/strong> \u2014 Full delivery history for every outgoing and incoming message. Shows queue status (Action Scheduler), connection status, pending count, and per-message details including template name, recipient phone, direction, and delivery status.<\/p>"}},"plugin_section":[],"plugin_tags":[263693,2512,38803,3160,286],"plugin_category":[41,45],"plugin_contributors":[256075],"plugin_business_model":[],"class_list":["post-315379","plugin","type-plugin","status-publish","hentry","plugin_tags-cloud-api","plugin_tags-messaging","plugin_tags-order-notifications","plugin_tags-whatsapp","plugin_tags-woocommerce","plugin_category-communication","plugin_category-ecommerce","plugin_contributors-codeatoz","plugin_committers-codeatoz"],"banners":{"banner":"https:\/\/ps.w.org\/codeatoz-cloud-messaging-for-woocommerce\/assets\/banner-772x250.png?rev=3539414","banner_2x":"https:\/\/ps.w.org\/codeatoz-cloud-messaging-for-woocommerce\/assets\/banner-1544x500.png?rev=3539414","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/codeatoz-cloud-messaging-for-woocommerce\/assets\/icon-128x128.png?rev=3539414","icon_2x":"https:\/\/ps.w.org\/codeatoz-cloud-messaging-for-woocommerce\/assets\/icon-256x256.png?rev=3539414","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/codeatoz-cloud-messaging-for-woocommerce\/assets\/screenshot-1.png?rev=3539414","caption":"<p><strong>WhatsApp order notifications on mobile<\/strong> \u2014 A real WhatsApp conversation showing the full order journey: confirmed \u2192 shipped with tracking \u2192 delivered, plus a customer reply. This is exactly what your customers receive on their phones, powered directly by Meta's Cloud API.<\/p>"},{"src":"https:\/\/ps.w.org\/codeatoz-cloud-messaging-for-woocommerce\/assets\/screenshot-2.png?rev=3539414","caption":"<p><strong>Connection settings<\/strong> \u2014 Enter your Meta Phone Number ID, WhatsApp Business Account ID, permanent System User Token, and App Secret. The Webhook URL and Verify Token are auto-generated and copy-to-clipboard ready. A live \"Test Connection\" button confirms your setup works before going live.<\/p>"},{"src":"https:\/\/ps.w.org\/codeatoz-cloud-messaging-for-woocommerce\/assets\/screenshot-3.png?rev=3539414","caption":"<p><strong>Message templates<\/strong> \u2014 Browse all your Meta-approved WhatsApp templates fetched live from your account. Utility and Marketing categories shown with status indicators. Use \"Refresh from Meta\" to sync after creating new templates in the Meta Business portal.<\/p>"},{"src":"https:\/\/ps.w.org\/codeatoz-cloud-messaging-for-woocommerce\/assets\/screenshot-4.png?rev=3539414","caption":"<p><strong>Message log<\/strong> \u2014 Full delivery history for every outgoing and incoming message. Shows queue status (Action Scheduler), connection status, pending count, and per-message details including template name, recipient phone, direction, and delivery status.<\/p>"}],"raw_content":"<!--section=description-->\n<p><strong>CodeAtoZ \u2013 Cloud Messaging for WooCommerce<\/strong> connects your WooCommerce store directly to Meta's WhatsApp Business Cloud API. Send order confirmations, processing updates, shipping notifications, and delivery alerts to your customers on the world's most popular messaging app \u2014 without paying any third-party BSP middleman.<\/p>\n\n<p>You pay Meta's per-message pricing <strong>directly<\/strong>. No markup, no monthly platform fees, no vendor lock-in. Meta gives every business phone number 1,000 free service messages per month, and order notifications are billed at Meta's cheaper Utility rate with volume discounts.<\/p>\n\n<h4>\u2728 What's new in 1.5.1<\/h4>\n\n<ul>\n<li><strong>\ud83c\udd95 Click-to-Chat button \u2014 finally shipped.<\/strong> A \"Chat with us\" button that opens WhatsApp with your number and an optional pre-filled message. Place it automatically on product pages, with the <code>[wcwa_chat_button]<\/code> shortcode, or as a block. <strong>This was listed as a free feature since 1.0 but had never actually been implemented<\/strong> \u2014 only the share button existed. It needs no Meta credentials, so it works on day one.<\/li>\n<li><strong>\ud83c\udd95 Site Health checks.<\/strong> Tools \u2192 Site Health now reports on your connection, webhook, message queue and delivery failures, and adds a WhatsApp Commerce panel to the Info tab that is safe to paste into a support request (it reports whether credentials are set, never their values).<\/li>\n<li><strong>\ud83c\udd95 Re-send from the message log.<\/strong> Each outbound row gets a Re-send button. It rebuilds the message from the template and the order's <strong>current<\/strong> details rather than replaying the old payload, so fixing a variable mapping and re-sending actually produces a corrected message.<\/li>\n<li><strong>\ud83d\udcd6 Setup Guide now documents the 1.5.0 features.<\/strong> An \"Once you are connected\" section covering the variable mapper, Usage &amp; Costs and the preference centre, plus four new FAQ entries (wrong values in messages, error #132000, how customers unsubscribe, custom order statuses).<\/li>\n<li><strong>\ud83d\udc1b Fixed: the in-plugin Setup Guide still described Meta's retired per-conversation pricing<\/strong>, including \"$0.005\u2013$0.05 per conversation\". It now describes per-message billing and the October 2026 change, matching the Usage &amp; Costs screen.<\/li>\n<li><strong>\ud83d\udc1b Fixed: uninstall left order data behind on HPOS stores.<\/strong> Cleanup only cleared <code>wp_postmeta<\/code>, but with High-Performance Order Storage enabled order meta lives in <code>wp_wc_orders_meta<\/code>, so customer phone numbers and consent flags survived uninstall. Both layouts are now cleaned.<\/li>\n<\/ul>\n\n<h4>\u2728 What's new in 1.5.0<\/h4>\n\n<p><strong>Four new free features, six bug fixes, and WordPress 7.1 \/ WooCommerce 11.2 compatibility.<\/strong> Everything below is in the free version \u2014 nothing moved behind the Pro plugin.<\/p>\n\n<ul>\n<li><strong>\ud83c\udd95 Template variable mapper<\/strong> \u2014 Pick your Meta-approved template from a dropdown instead of typing its name, then map each <code>{{1}}<\/code>, <code>{{2}}<\/code> placeholder to the order value it should receive, with a live preview. This eliminates Meta error <code>#132000<\/code> (\"number of parameters does not match\"), which was by far the most common setup problem.<\/li>\n<li><strong>\ud83c\udd95 Usage &amp; Costs screen<\/strong> \u2014 See how many messages you sent this month, broken down by the Meta billing category that determines what each one costs, plus a meter for your 1,000 free monthly service messages. Matters more than ever now that Meta bills service and in-window utility messages.<\/li>\n<li><strong>\ud83c\udd95 Customer preference centre<\/strong> \u2014 A \"WhatsApp\" tab under My Account where customers update their number or unsubscribe themselves. Satisfies GDPR Article 7(3) (withdrawing consent must be as easy as giving it) and cuts support email.<\/li>\n<li><strong>\ud83c\udd95 Official WooCommerce checkout field<\/strong> \u2014 The Blocks checkout opt-in now uses WooCommerce's own Additional Checkout Fields API, so the field also appears in My Account and on the admin order screen. Existing orders are unaffected.<\/li>\n<li><strong>\ud83d\udc1b Fixed: \"Order Confirmed\" notifications never fired.<\/strong> The setting was stored under a key no WooCommerce status ever matches, so the toggle did nothing. Your existing configuration is migrated automatically on update.<\/li>\n<li><strong>\ud83d\udc1b Fixed: dead \"Notify Me\" button.<\/strong> Free installs rendered a back-in-stock form on every out-of-stock product that always failed, because the handler ships only in Pro.<\/li>\n<li><strong>\ud83d\udc1b Fixed: two public REST endpoints returned a PHP fatal error.<\/strong> <code>\/notify-me<\/code> and <code>\/verify-otp<\/code> were registered publicly on every free install but called classes that ship only in Pro, so any request to them produced an HTTP 500 and an error-log entry.<\/li>\n<li><strong>\ud83d\udc1b Fixed: custom order statuses<\/strong> from plugins like Order Status Manager are now configurable, instead of only the nine hardcoded events.<\/li>\n<li><strong>\u26a0\ufe0f Graph API upgraded from v21.0 to v25.0.<\/strong> v21.0 stops working on 21 January 2027, after which Meta silently downgrades calls to an older version. <strong>Updating is strongly recommended.<\/strong><\/li>\n<\/ul>\n\n<h4>Why use WhatsApp for order notifications?<\/h4>\n\n<ul>\n<li><strong>98% open rates<\/strong> \u2014 compared to ~20% for email. Customers read WhatsApp messages within minutes.<\/li>\n<li><strong>No SMS costs<\/strong> \u2014 WhatsApp Cloud API is dramatically cheaper than SMS gateways in most countries.<\/li>\n<li><strong>Two-way conversation<\/strong> \u2014 customers can reply with questions, change requests, or feedback.<\/li>\n<li><strong>Mobile-first<\/strong> \u2014 works perfectly on every smartphone, no app installation needed by the customer.<\/li>\n<li><strong>Trusted channel<\/strong> \u2014 customers already use WhatsApp daily, no learning curve.<\/li>\n<\/ul>\n\n<h4>Features (Free version)<\/h4>\n\n<p><strong>Order Status Notifications<\/strong><\/p>\n\n<p>Send a WhatsApp message automatically on every WooCommerce order status change:<\/p>\n\n<ul>\n<li>Pending payment<\/li>\n<li>Processing (payment received)<\/li>\n<li>On hold (manual review)<\/li>\n<li>Shipped (triggered when a tracking number is added)<\/li>\n<li>Completed<\/li>\n<li>Cancelled<\/li>\n<li>Refunded<\/li>\n<li>Failed<\/li>\n<li><strong>\u2728 New in 1.5.0: any custom order status<\/strong> registered by another plugin (WooCommerce Order Status Manager and similar) \u2014 the event list is now read from WooCommerce itself rather than hardcoded<\/li>\n<\/ul>\n\n<p>Each event has its own message template with full variable substitution \u2014 order number, customer name, total amount, shipping address, tracking URL, and more.<\/p>\n\n<p><strong>\u2728 New in 1.5.0 \u2014 Template picker &amp; variable mapper<\/strong><\/p>\n\n<ul>\n<li>Choose a template from a dropdown of your <strong>Meta-approved templates<\/strong>, fetched live from your account \u2014 no more typing template names and discovering the typo three orders later<\/li>\n<li>The plugin reads each template's structure from Meta and shows you one row per <code>{{1}}<\/code>, <code>{{2}}<\/code> placeholder<\/li>\n<li>Map every placeholder to the exact order value it should receive \u2014 customer name, order number, total, tracking number, and 15 more<\/li>\n<li><strong>Live preview<\/strong> shows how the finished message will read, using sample data<\/li>\n<li>Maps text headers and dynamic URL buttons too, not just the message body<\/li>\n<li>Templates you haven't mapped keep working exactly as before \u2014 mapping is opt-in per template<\/li>\n<li>This is the fix for Meta error <code>#132000<\/code>, the most common cause of messages failing to send<\/li>\n<\/ul>\n\n<p><strong>\u2728 New in 1.5.0 \u2014 Usage &amp; Costs<\/strong><\/p>\n\n<p>Meta moved from per-conversation to <strong>per-message<\/strong> billing, and since 1 October 2026 also bills service messages and utility templates sent inside the 24-hour service window. A new <strong>Settings \u2192 Usage &amp; Costs<\/strong> screen shows:<\/p>\n\n<ul>\n<li>Messages sent this calendar month, grouped by Meta billing category (Utility \/ Marketing \/ Authentication \/ Service)<\/li>\n<li>A meter for your <strong>1,000 free service messages per month<\/strong>, which turns amber at 80% and red once the allowance is used up<\/li>\n<li>What each category actually costs you, in plain language<\/li>\n<li>This month's delivery rate, with failures broken out<\/li>\n<li>A matching card on the dashboard so you notice before the invoice does<\/li>\n<\/ul>\n\n<p>It deliberately shows message counts rather than a currency estimate \u2014 Meta's rates vary by recipient country and volume tier, and a wrong number would be worse than no number.<\/p>\n\n<p><strong>GDPR-Compliant Opt-In<\/strong><\/p>\n\n<ul>\n<li>Customizable consent checkbox at checkout (classic and Blocks Checkout supported)<\/li>\n<li>Configure the checkbox wording, default state, and required\/optional behavior<\/li>\n<li>Records opt-in consent with timestamp and IP address (legal compliance)<\/li>\n<li>Integrates with the WordPress Personal Data Exporter and Eraser tools<\/li>\n<li>Compatible with Cookie\/GDPR consent banner plugins<\/li>\n<li><strong>\u2728 New in 1.5.0:<\/strong> the Blocks checkout opt-in now uses WooCommerce's <strong>official Additional Checkout Fields API<\/strong>, so the same field also appears under My Account and on the admin order screen \u2014 and benefits from WooCommerce's own validation. Classic checkout is unchanged, and existing orders keep working untouched.<\/li>\n<\/ul>\n\n<p><strong>\u2728 New in 1.5.0 \u2014 Customer preference centre<\/strong><\/p>\n\n<ul>\n<li>A <strong>\"WhatsApp\" tab under My Account<\/strong> where customers manage their own subscription<\/li>\n<li>Update the phone number, or unsubscribe, without emailing your support desk<\/li>\n<li>Satisfies <strong>GDPR Article 7(3)<\/strong>: withdrawing consent is now as easy as giving it, which a checkout-only checkbox arguably was not<\/li>\n<li>Works even if you later disconnect your Meta credentials, so a subscriber can always opt out<\/li>\n<li>Enable or disable it from the settings; the URL slug is translatable via a filter<\/li>\n<\/ul>\n\n<p><strong>STOP-Keyword Auto-Unsubscribe<\/strong><\/p>\n\n<ul>\n<li>Customers can reply \"STOP\", \"UNSUBSCRIBE\", \"QUIT\" or \"END\" to any message to opt out<\/li>\n<li>Automatic recognition \u2014 no manual subscriber management needed<\/li>\n<li>Confirmation message sent back to the customer<\/li>\n<li>Opt-out preserved across orders \u2014 you never need to remember it manually<\/li>\n<li>Easy admin re-opt-in tool for accidental unsubscribes<\/li>\n<\/ul>\n\n<p><strong>Staff Notifications (Single Phone)<\/strong><\/p>\n\n<ul>\n<li>Alert your phone via WhatsApp the moment a new order arrives<\/li>\n<li>Alert on failed payments and refund requests<\/li>\n<li>Configurable per-event triggers<\/li>\n<li>(Multi-staff notification lists are available in the Pro version)<\/li>\n<\/ul>\n\n<p><strong>Click-to-Chat &amp; Share Buttons<\/strong><\/p>\n\n<ul>\n<li><strong>\u2728 New in 1.5.1:<\/strong> WhatsApp \"Chat with us\" button \u2014 configurable phone number, button text, pre-filled message and position<\/li>\n<li>Place it automatically on product pages, with the <code>[wcwa_chat_button]<\/code> shortcode, or as a block (works in full-site-editing templates)<\/li>\n<li>Needs no Meta credentials, no approved template and no opt-in \u2014 it is a plain <code>wa.me<\/code> link, so it works before you connect the Cloud API<\/li>\n<li>Pre-filled message supports <code>{product}<\/code>, <code>{product_url}<\/code>, <code>{store}<\/code> and <code>{page_url}<\/code><\/li>\n<li>WhatsApp share button so customers can share products with friends<\/li>\n<\/ul>\n\n<p><strong>\u2728 New in 1.5.1 \u2014 Site Health &amp; diagnostics<\/strong><\/p>\n\n<ul>\n<li>Tools \u2192 Site Health checks your connection, webhook configuration, queue backlog and recent delivery failures<\/li>\n<li>Each check explains the consequence, not just the state \u2014 e.g. a missing App Secret means STOP opt-outs are never processed<\/li>\n<li>A WhatsApp Commerce panel on the Site Health Info tab collects the environment facts support usually has to ask for<\/li>\n<li>Contains no credentials \u2014 only whether each is set \u2014 so it is safe to paste into a public forum<\/li>\n<\/ul>\n\n<p><strong>\u2728 New in 1.5.1 \u2014 Re-send from the message log<\/strong><\/p>\n\n<ul>\n<li>A Re-send button on every outbound row in the message log<\/li>\n<li>Rebuilds the message from the template using the order's current details, so correcting a variable mapping and re-sending produces a fixed message rather than repeating the original failure<\/li>\n<\/ul>\n\n<p><strong>Built-in Message Log<\/strong><\/p>\n\n<ul>\n<li>Every outgoing and incoming WhatsApp message is logged with status (Sent \u2192 Delivered \u2192 Read \u2192 Failed)<\/li>\n<li>Click any log entry to see the full payload, error code, and Meta message ID<\/li>\n<li>Filter by status, phone, date range, or specific order<\/li>\n<li>Configurable retention (default 90 days) to keep the database lean<\/li>\n<\/ul>\n\n<p><strong>In-Plugin Setup Guide<\/strong><\/p>\n\n<ul>\n<li>6-step walkthrough takes new merchants from \"just installed\" to \"first message sent\"<\/li>\n<li>Click-to-copy webhook URL and verify token<\/li>\n<li>Live FAQ covering Cloud API pricing tiers, template rejection causes, message delivery troubleshooting<\/li>\n<li>Accessible both as a top-level menu item and inside Settings<\/li>\n<\/ul>\n\n<p><strong>Technical Excellence<\/strong><\/p>\n\n<ul>\n<li>Direct Meta Graph API integration (no proxy, no third-party server in the middle), pinned to <strong>Graph API v25.0<\/strong> and overridable via a <code>wp-config.php<\/code> constant<\/li>\n<li>Encrypted access-token storage (OpenSSL AES-256-CBC)<\/li>\n<li>HMAC-verified webhook for delivery and read receipts<\/li>\n<li>Action Scheduler queue with WP-Cron fallback (reliable delivery even under load)<\/li>\n<li>HPOS (High-Performance Order Storage) compatible<\/li>\n<li>Blocks Checkout compatible<\/li>\n<li>Translation-ready with .pot file and 9 sample .po translations included<\/li>\n<li>Modern WordPress admin UI with charts (Chart.js bundled locally \u2014 no CDN loads)<\/li>\n<li>All code escapes output, sanitizes input, verifies nonces, checks capabilities<\/li>\n<\/ul>\n\n<h4>Who is this for?<\/h4>\n\n<ul>\n<li>Online stores that want to <strong>stop losing customers to email-overload<\/strong> \u2014 WhatsApp gets read, email doesn't.<\/li>\n<li>Stores in <strong>WhatsApp-heavy markets<\/strong> (India, Brazil, Indonesia, Spain, Mexico, Italy, Argentina, Saudi Arabia, etc.) where customers prefer WhatsApp over SMS.<\/li>\n<li><strong>Direct-to-consumer (DTC) brands<\/strong> that want a personal, mobile-first customer experience.<\/li>\n<li><strong>B2B \/ wholesale stores<\/strong> that need fast confirmation and shipping updates to business buyers.<\/li>\n<li><strong>High-ticket stores<\/strong> where lost orders are expensive and proactive communication directly affects conversion.<\/li>\n<li><strong>Cash-on-Delivery (COD) markets<\/strong> where confirmation messaging dramatically reduces fake orders (basic version free; OTP verification in Pro).<\/li>\n<\/ul>\n\n<h4>Pro version<\/h4>\n\n<p>A Pro add-on plugin is available on <a href=\"https:\/\/codeatoz.com\/cloud-messaging-for-woocommerce-pro\/\">codeatoz.com<\/a> that unlocks advanced commerce automation modules:<\/p>\n\n<ul>\n<li><strong>Abandoned Cart Recovery<\/strong> \u2014 automatic follow-up sequences for incomplete checkouts (configurable delay + max messages + multi-step cadence)<\/li>\n<li><strong>COD Verification with OTP<\/strong> \u2014 verify Cash-on-Delivery orders before fulfillment (massive fake-order reduction)<\/li>\n<li><strong>Back-in-Stock Alerts<\/strong> \u2014 \"Notify Me\" widget on out-of-stock products, auto-message when restocked<\/li>\n<li><strong>Review Collector<\/strong> \u2014 request product reviews a configurable number of days after delivery<\/li>\n<li><strong>Payment Reminders<\/strong> \u2014 automated reminders for pending bank-transfer \/ unpaid orders, with auto-cancel option<\/li>\n<li><strong>Address Confirmation<\/strong> \u2014 interactive button confirmation for high-value or risky orders<\/li>\n<li><strong>WhatsApp Returns Flow<\/strong> \u2014 full conversational return request, photo upload, refund\/exchange selection<\/li>\n<li><strong>Catalog Sync<\/strong> \u2014 push your WooCommerce product catalog to WhatsApp Business Catalog<\/li>\n<li><strong>WhatsApp OTP Login<\/strong> \u2014 passwordless customer login with phone + WhatsApp one-time code<\/li>\n<li><strong>Unlimited staff phones<\/strong> (free is limited to 1)<\/li>\n<li><strong>Multi-language template auto-detection<\/strong> for non-English markets<\/li>\n<li><strong>Quiet Hours engine<\/strong> \u2014 respect customer timezones, avoid 3 AM notifications<\/li>\n<li><strong>Analytics dashboard<\/strong> \u2014 charts, per-module breakdown, delivery rates, revenue recovered<\/li>\n<li><strong>Inline-send architecture<\/strong> \u2014 sub-second message delivery using fastcgi_finish_request<\/li>\n<li><strong>Premium template library<\/strong> + priority email support<\/li>\n<\/ul>\n\n<p>The Pro version is a separate, standalone plugin \u2014 <strong>not a paid feature unlock<\/strong> of this free plugin. If you only ever use the free version, every free feature listed above will keep working forever with no nag screens or time limits.<\/p>\n\n<h3>External Services<\/h3>\n\n<p>This plugin connects to and uses the following external services to deliver its core functionality. By installing and using this plugin you acknowledge that data is transmitted to these services.<\/p>\n\n<p><strong>WhatsApp Business Cloud API (Meta Platforms, Inc.)<\/strong><\/p>\n\n<ul>\n<li><strong>What it is used for:<\/strong> Sending WhatsApp messages (order notifications, opt-in confirmations, transactional alerts), receiving delivery and read receipts via webhook, fetching the merchant's approved message-template list.<\/li>\n<li><strong>What data is sent:<\/strong> Recipient phone number (only for customers who have opted in), message template name, template variables (e.g. customer first name, order ID, order total, shipment tracking URL), and the merchant's access token for authentication.<\/li>\n<li><strong>When data is sent:<\/strong> Whenever a WooCommerce order changes status, when a customer opts in or out, when the merchant clicks \"Refresh templates\", and when the merchant triggers a test message.<\/li>\n<li><strong>Service endpoint:<\/strong> https:\/\/graph.facebook.com (Meta Graph API, v25.0)<\/li>\n<li><strong>Provider:<\/strong> Meta Platforms, Inc.<\/li>\n<li><strong>Terms of Service:<\/strong> https:\/\/developers.facebook.com\/terms<\/li>\n<li><strong>Privacy Policy:<\/strong> https:\/\/www.whatsapp.com\/legal\/business-policy<\/li>\n<\/ul>\n\n<p>This plugin does <strong>not<\/strong> connect to any other external service. All other functionality (message queue, log, settings, subscriber list, dashboard) runs entirely on your own WordPress install. No telemetry, no analytics, no tracking pixels.<\/p>\n\n<h3>Privacy &amp; Data Handling<\/h3>\n\n<p>This plugin stores the following customer data locally in your WordPress database:<\/p>\n\n<ul>\n<li><strong>Phone numbers<\/strong> \u2014 in the subscribers table and the message log. Only for customers who explicitly opt in at  &hellip;<\/li>\n<\/ul>\n\n<!--section=installation-->\n<h4>Quick setup<\/h4>\n\n<ol>\n<li>Upload the plugin ZIP via <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong>, or unzip it into <code>wp-content\/plugins\/<\/code><\/li>\n<li>Activate the plugin from the <strong>Plugins<\/strong> screen<\/li>\n<li>Go to <strong>WhatsApp Commerce \u2192 Setup Guide<\/strong> for a step-by-step walkthrough of Meta's API setup<\/li>\n<li>Or jump straight to <strong>WhatsApp Commerce \u2192 Settings \u2192 Connection<\/strong> if you already have your Meta credentials<\/li>\n<\/ol>\n\n<h4>Detailed setup<\/h4>\n\n<p>You'll need a Meta Business account, a Meta Developer App with WhatsApp product enabled, and a phone number not currently registered to WhatsApp Personal or Business. The built-in Setup Guide walks you through:<\/p>\n\n<ol>\n<li>Creating a Meta Business account<\/li>\n<li>Creating a WhatsApp Business App in Meta Developers<\/li>\n<li>Copying credentials (Access Token, Phone Number ID, WhatsApp Business Account ID) into the plugin<\/li>\n<li>Configuring the webhook (Callback URL + Verify Token) so the plugin receives delivery + read receipts<\/li>\n<li>Approving your message templates with Meta (utility templates auto-approve in minutes)<\/li>\n<li>Generating a permanent System User token for production use<\/li>\n<\/ol>\n\n<p>Setup typically takes 15\u201330 minutes. Once connected, send a test message from the Connection tab to confirm everything works, then start enabling order status notifications.<\/p>\n\n<h4>Requirements<\/h4>\n\n<ul>\n<li>WordPress 6.2 or higher<\/li>\n<li>PHP 8.0 or higher<\/li>\n<li>WooCommerce 8.0 or higher<\/li>\n<li>A Meta Business account (free)<\/li>\n<li>A phone number for your WhatsApp Business presence<\/li>\n<\/ul>\n\n<!--section=faq-->\n<dl>\n<dt id=\"how%20much%20does%20whatsapp%20cloud%20api%20cost%3F\"><h3>How much does WhatsApp Cloud API cost?<\/h3><\/dt>\n<dd><p>Meta bills <strong>per message<\/strong> (it moved away from the old per-conversation model on 1 July 2025). Rates depend on the message category and the recipient's country:<\/p>\n\n<ul>\n<li><strong>Utility<\/strong> \u2014 order confirmations, shipping updates, delivery notices. The cheapest paid category, with volume discounts. This is what the plugin's order notifications use.<\/li>\n<li><strong>Authentication<\/strong> \u2014 one-time codes. Also discounted by volume.<\/li>\n<li><strong>Marketing<\/strong> \u2014 promotional messages. The most expensive category. The free version does not send these.<\/li>\n<li><strong>Service<\/strong> \u2014 your replies inside the 24-hour customer service window. <strong>The first 1,000 service messages per business phone number each calendar month are free<\/strong>, then they are billed per message.<\/li>\n<\/ul>\n\n<p>Note that since <strong>1 October 2026<\/strong>, service messages and utility templates sent inside the 24-hour service window are chargeable; previously they were free. The 72-hour Free Entry Point window remains free.<\/p>\n\n<p>You pay Meta directly and this plugin charges <strong>zero markup<\/strong>. Use <strong>Settings \u2192 Usage &amp; Costs<\/strong> (new in 1.5.0) to see your own monthly volume by category.<\/p>\n\n<p>For most small stores the bill is a fraction of equivalent SMS costs. Exact per-country rates are published by Meta and change periodically, so we deliberately do not reproduce them here.<\/p><\/dd>\n<dt id=\"can%20i%20use%20my%20existing%20whatsapp%20number%3F\"><h3>Can I use my existing WhatsApp number?<\/h3><\/dt>\n<dd><p>Only if you first delete WhatsApp Personal or WhatsApp Business from the device. A phone number can only be registered to ONE of: WhatsApp Personal, WhatsApp Business app, or WhatsApp Cloud API. This plugin uses Cloud API, so you'll need to migrate the number off WhatsApp Personal\/Business first.<\/p>\n\n<p>If you want to keep your personal WhatsApp running, get a separate business number (a VOIP number, a second SIM, or a landline that can receive SMS or voice for verification will work).<\/p><\/dd>\n<dt id=\"why%20are%20my%20messages%20getting%20%22rate%20limited%22%3F\"><h3>Why are my messages getting \"rate limited\"?<\/h3><\/dt>\n<dd><p>Brand-new WhatsApp Business numbers start on Meta's lowest messaging tier \u2014 typically <strong>250 unique customers per 24 hours<\/strong>. As long as your quality rating stays \"High\" in Meta's assessment, Meta automatically promotes you through progressively higher tiers (1,000, then 10,000, then 100,000, then unlimited).<\/p>\n\n<p>The progression usually takes 2\u20134 weeks of healthy sending. Send transactional (Utility) templates first \u2014 they build trust fastest with Meta's quality system, because customers expect them and rarely block or report them.<\/p>\n\n<p>Meta adjusts these tier thresholds from time to time; your current limit and quality rating are shown in the Meta Business Manager for your phone number.<\/p><\/dd>\n<dt id=\"my%20template%20was%20rejected%20by%20meta.%20what%20now%3F\"><h3>My template was rejected by Meta. What now?<\/h3><\/dt>\n<dd><p>The most common rejection reasons:<\/p>\n\n<ul>\n<li>The template feels promotional but was submitted as \"Utility\" \u2014 change the category to \"Marketing\" OR rewrite the wording to be transactional<\/li>\n<li>The template contains unverified claims (\"100% guaranteed!\", \"Best price!\")<\/li>\n<li>The template has placeholders at the start or end ({{1}} as the first or last token is not allowed)<\/li>\n<li>Header or footer text exceeds character limits<\/li>\n<\/ul>\n\n<p>Edit the template wording and resubmit. After two rejections of the same template name, use a new name (e.g., <code>order_shipped_v2<\/code>).<\/p><\/dd>\n<dt id=\"how%20do%20i%20use%20the%20template%20variable%20mapper%3F\"><h3>How do I use the template variable mapper?<\/h3><\/dt>\n<dd><p>Go to <strong>Settings \u2192 Notifications<\/strong>. For each order event, pick the Meta-approved template you want from the dropdown, then click <strong>\"Map template variables\"<\/strong>. The plugin reads that template's structure from Meta and shows one dropdown per <code>{{1}}<\/code>, <code>{{2}}<\/code> placeholder \u2014 choose which order value belongs in each, and check the live preview underneath.<\/p>\n\n<p>You only need to do this once per template. Templates you leave unmapped keep behaving exactly as they did before 1.5.0, where the plugin guessed the variable order from a fixed priority list.<\/p>\n\n<p>If the dropdown is empty, connect your Meta credentials first, then use <strong>Refresh from Meta<\/strong> on the Templates screen.<\/p><\/dd>\n<dt id=\"customer%20isn%27t%20receiving%20any%20messages%20%E2%80%94%20how%20do%20i%20debug%3F\"><h3>Customer isn't receiving any messages \u2014 how do I debug?<\/h3><\/dt>\n<dd><p>Visit <strong>WhatsApp Commerce \u2192 Message Log<\/strong> and find the most recent message to that customer. The status column tells you exactly what happened:<\/p>\n\n<ul>\n<li><strong>Failed<\/strong> \u2014 click the row to see Meta's error code. Common ones: <code>#131026<\/code> (number not on WhatsApp), <code>#132000<\/code> (template parameter mismatch), <code>#132001<\/code> (template language mismatch).<\/li>\n<li><strong>Sent but not Delivered<\/strong> \u2014 customer has likely blocked your number, or their phone has been offline for 30+ days.<\/li>\n<li><strong>Queued<\/strong> \u2014 Action Scheduler hasn't picked up the message yet. Check your WP-Cron or visit <strong>Tools \u2192 Scheduled Actions<\/strong>.<\/li>\n<li><strong>Customer is opted out<\/strong> \u2014 check <strong>Subscribers<\/strong> tab. They may have replied STOP previously.<\/li>\n<\/ul><\/dd>\n<dt id=\"does%20the%20plugin%20work%20with%20woocommerce%20blocks%20checkout%3F\"><h3>Does the plugin work with WooCommerce Blocks Checkout?<\/h3><\/dt>\n<dd><p>Yes. The opt-in checkbox renders on both classic checkout and the new Blocks Checkout. We update it as WooCommerce updates the Blocks API.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20work%20with%20hpos%20%28high-performance%20order%20storage%29%3F\"><h3>Does the plugin work with HPOS (High-Performance Order Storage)?<\/h3><\/dt>\n<dd><p>Yes. HPOS compatibility is declared in the plugin header and tested against the latest WooCommerce versions.<\/p><\/dd>\n<dt id=\"is%20the%20plugin%20translation-ready%3F\"><h3>Is the plugin translation-ready?<\/h3><\/dt>\n<dd><p>Yes. The <code>.pot<\/code> file is included in <code>\/languages\/<\/code>, plus sample <code>.po<\/code> files for German, French, Spanish, Italian, Dutch, Portuguese, Polish, Swedish, and Danish. Translations are loaded on the <code>init<\/code> hook with priority 5 so other modules can use translated strings safely.<\/p><\/dd>\n<dt id=\"how%20is%20my%20meta%20access%20token%20stored%3F\"><h3>How is my Meta access token stored?<\/h3><\/dt>\n<dd><p>The access token is encrypted using OpenSSL AES-256-CBC before being written to the <code>wp_options<\/code> table. The encryption key is derived from your WordPress AUTH_KEY constant. The token is decrypted only at the moment of an outbound API request to Meta. If you back up your database and accidentally expose it, the token cannot be used without your WordPress secret keys.<\/p><\/dd>\n<dt id=\"can%20i%20send%20broadcast%20%2F%20marketing%20messages%3F\"><h3>Can I send broadcast \/ marketing messages?<\/h3><\/dt>\n<dd><p>The free version focuses on transactional notifications (order updates, opt-in confirmations, click-to-chat). For bulk marketing campaigns, segmented broadcasts, or abandoned cart recovery, the Pro version on codeatoz.com adds those features. The free version does <strong>not<\/strong> include broadcast functionality.<\/p><\/dd>\n<dt id=\"where%20can%20i%20get%20more%20help%3F\"><h3>Where can I get more help?<\/h3><\/dt>\n<dd><ul>\n<li><strong>Documentation<\/strong> \u2014 built into the plugin. Go to <strong>WhatsApp Commerce \u2192 Setup Guide<\/strong> for the full 6-step Meta walkthrough, click-to-copy webhook details, and a troubleshooting FAQ. Every settings tab also has inline help text.<\/li>\n<li><strong>Free version users<\/strong> \u2014 community support via the <a href=\"https:\/\/wordpress.org\/support\/plugin\/codeatoz-cloud-messaging-for-woocommerce\/\">WordPress.org plugin support forum<\/a><\/li>\n<li><strong>Pro version customers<\/strong> \u2014 priority email support at support@codeatoz.com<\/li>\n<\/ul><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.5.1<\/h4>\n\n<p><strong>New features (all free)<\/strong><\/p>\n\n<ul>\n<li><strong>Click-to-Chat button.<\/strong> A \"Chat with us\" button opening a <code>wa.me<\/code> deep link with your business number and an optional pre-filled message. Configurable number, button text, message and position; placeable automatically on product pages, via the <code>[wcwa_chat_button]<\/code> shortcode, or as a block that works in full-site-editing templates. The pre-filled message supports <code>{product}<\/code>, <code>{product_url}<\/code>, <code>{store}<\/code> and <code>{page_url}<\/code> \u2014 deliberately a small set, since the text travels in a URL the customer can read. Needs no Meta credentials, approved template or opt-in. New settings tab: Settings \u2192 Chat Button.\n<em>Note: a click-to-chat button has been listed in this readme as a free feature since 1.0, but was never actually implemented \u2014 only the share button existed. This release ships it.<\/em><\/li>\n<li><strong>Site Health integration.<\/strong> Four checks under Tools \u2192 Site Health: credentials present, webhook configured and receiving traffic, queue draining, and recent delivery failures. Each explains the consequence rather than just the state. Also adds a WhatsApp Commerce panel to the Site Health Info tab with the environment facts support usually has to ask for \u2014 it reports whether each credential is set, never its value, so it is safe to paste into a public forum.<\/li>\n<li><strong>Re-send from the message log.<\/strong> Every outbound row gains a Re-send button. The payload is rebuilt from the template using the order's current details rather than replaying the stored payload, so correcting a variable mapping and then re-sending produces a fixed message instead of reproducing the original failure. Deliberately bypasses the idempotency guard, since a re-send is an explicit operator action.<\/li>\n<\/ul>\n\n<p><strong>Documentation<\/strong><\/p>\n\n<ul>\n<li>The Setup Guide now documents the 1.5.0 features. New \"Once you are connected\" section covering the variable mapper, Usage &amp; Costs and the customer preference centre, each with its own steps and caveats.<\/li>\n<li>Four new Setup Guide FAQ entries: messages showing the wrong values in the wrong places, what Meta error #132000 means and how to fix it, how customers unsubscribe, and whether custom order statuses are supported.<\/li>\n<li>Removed outbound documentation URLs in favour of pointers to the built-in Setup Guide, which covers the same ground.<\/li>\n<\/ul>\n\n<p><strong>Bug fixes<\/strong><\/p>\n\n<ul>\n<li><strong>FIXED: the in-plugin Setup Guide still described Meta's retired per-conversation billing<\/strong>, quoting \"roughly $0.005\u2013$0.05 per conversation\" and \"1,000 free service conversations per month\". Both are wrong under per-message pricing and contradicted the new Usage &amp; Costs screen. The readme's pricing FAQ was corrected in 1.5.0; this fixes the same claim inside the plugin.<\/li>\n<li><strong>FIXED: uninstall left customer data behind on HPOS stores.<\/strong> Order-meta cleanup only ran against <code>wp_postmeta<\/code>, but with High-Performance Order Storage enabled WooCommerce stores order meta in <code>wp_wc_orders_meta<\/code>. Phone numbers and consent flags therefore survived uninstall on HPOS sites. Both table layouts are now cleaned, guarded by a table-existence check since WooCommerce may already be deactivated at uninstall time.<\/li>\n<li><strong>FIXED: the click-to-chat pre-filled message would have been double-encoded.<\/strong> <code>add_query_arg()<\/code> URL-encodes values itself, so pre-encoding produced <code>%2520<\/code> for a space and the customer would have seen a literal \"%20\" in their chat box. Caught before release by a regression test.<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<p><strong>New features (all free)<\/strong><\/p>\n\n<ul>\n<li><strong>Template picker &amp; variable mapper<\/strong> \u2014 Settings \u2192 Notifications now lists your Meta-approved templates in a dropdown instead of a free-text field, and lets you map each <code>{{1}}<\/code>\/<code>{{2}}<\/code> placeholder to a specific order value, with a live preview. Covers text headers and dynamic URL buttons as well as the message body. Unmapped templates keep their previous behaviour, so the upgrade changes nothing until you opt in per template. This is the fix for Meta error <code>#132000<\/code>.<\/li>\n<li><strong>Usage &amp; Costs screen<\/strong> \u2014 new settings tab reporting this month's outbound messages grouped by Meta billing category, a meter for the 1,000 free monthly service messages (amber at 80%, red when exhausted), delivery rate, and a plain-language note on what each category costs. A matching card was added to the dashboard.<\/li>\n<li><strong>Customer preference centre<\/strong> \u2014 new \"WhatsApp\" tab under My Account where customers update their number or unsubscribe themselves. Addresses GDPR Article 7(3). Can be disabled in settings; the endpoint slug is filterable via <code>wcwa_account_endpoint_slug<\/code>.<\/li>\n<li><strong>Official WooCommerce checkout field<\/strong> \u2014 the Blocks checkout opt-in now registers through <code>woocommerce_register_additional_checkout_field()<\/code> (WooCommerce 8.9+), so it also surfaces in My Account and on the admin order screen. <code>_wcwa_whatsapp_optin<\/code> remains the canonical meta key and is written on every path, so existing orders, subscriber records and the Pro add-on are unaffected. Falls back to the previous Store API integration on older WooCommerce, or if you disable <code>optin_use_wc_fields<\/code>.<\/li>\n<li><strong>Custom order statuses<\/strong> \u2014 the configurable event list is now derived from <code>wc_get_order_statuses()<\/code>, so statuses registered by plugins like WooCommerce Order Status Manager appear in the settings UI. Filterable via <code>wcwa_order_notification_events<\/code>.<\/li>\n<\/ul>\n\n<p><strong>Bug fixes<\/strong><\/p>\n\n<ul>\n<li><strong>FIXED: \"Order Confirmed\" notifications could never fire.<\/strong> The settings UI wrote <code>notify_order_confirmed<\/code>, but a pending order fires a status change to <code>pending<\/code>, so the dispatcher looked up <code>notify_order_pending<\/code> and never found a match. No WooCommerce status is called <code>confirmed<\/code>. Existing configuration is migrated automatically on update, and the old key is still honoured if you never re-save your settings.<\/li>\n<li><strong>FIXED: dead \"Notify Me\" button in the free version.<\/strong> The back-in-stock form rendered on every out-of-stock product because its setting defaults to on, but the AJAX handler that answers it ships only in the Pro add-on \u2014 so every submission failed with \"Could not register. Please try again.\" The button is now shown only when a handler exists.<\/li>\n<li><strong>FIXED: two public REST routes fatalled on every call in the free version.<\/strong> <code>POST \/wp-json\/wce-whatsapp\/v1\/notify-me<\/code> and <code>POST \/wp-json\/wce-whatsapp\/v1\/verify-otp<\/code> were registered unconditionally with a public permission callback, but their handlers call <code>Back_In_Stock_Model<\/code> and <code>OTP_Generator<\/code> \u2014 classes that exist only in the Pro add-on. Any unauthenticated request returned an HTTP 500 and wrote a fatal error to the PHP log. Both routes are now registered only when their backing classes are present.<\/li>\n<li><strong>FIXED: the Pro upsell bar never rendered.<\/strong> <code>Admin_Menu::render_pro_banner()<\/code> included a partial that had never been added to the plugin, making it a silent no-op since 1.0.<\/li>\n<li><strong>FIXED: potential fatal error<\/strong> if <code>module_whatsapp_login<\/code> was enabled on a free install \u2014 the referenced <code>Login_Form<\/code> class only exists in the Pro build and was called without a guard.<\/li>\n<li><strong>FIXED: rewrite rules<\/strong> were flushed during activation, before the plugin's own endpoints were registered, so the flush could not include them. Now deferred to the first request after activation.<\/li>\n<li>Uninstall now also removes the template-map option, the usage transient, customer meta written by the preference centre, and WooCommerce's own opt-in meta key.<\/li>\n<\/ul>\n\n<p><strong>Compatibility<\/strong><\/p>\n\n<ul>\n<li><strong>Graph API upgraded from v21.0 to v25.0.<\/strong> v21.0 is only available until 21 January 2027, after which Meta silently routes calls to the next-oldest usable version \u2014 changing behaviour without raising an error. v25.0 is published as available until 29 July 2028. Override with <code>define( 'WCWA_WHATSAPP_API_VERSION', 'v26.0' );<\/code> in <code>wp-config.php<\/code> if you need a different version.<\/li>\n<li>Tested up to WordPress 7.1.<\/li>\n<li>WC tested up to WooCommerce 11.2.<\/li>\n<li>Still supports WordPress 6.2+, WooCommerce 8.0+ and PHP 8.0+.<\/li>\n<\/ul>\n\n<p><strong>Documentation<\/strong><\/p>\n\n<ul>\n<li>Corrected the pricing FAQ, which still described Meta's retired per-conversation model. Meta bills per message, and since 1 October 2026 also bills service messages and in-window utility templates beyond the free allowance.<\/li>\n<li>Corrected the Pro version link.<\/li>\n<\/ul>\n\n<h4>1.4.7<\/h4>\n\n<ul>\n<li>COMPAT: Verified compatibility with WordPress 7.0 (Phase 3 \/ collaborative editing release) \u2014 <code>Tested up to: 7.0<\/code>.<\/li>\n<li>COMPAT: Bumped \"WC tested up to\" to WooCommerce 10.7.<\/li>\n<li>COMPAT: Continues to support WordPress 6.2+ and WooCommerce 8.0+ \u2014 no breaking changes for older sites.<\/li>\n<li>No functional changes \u2014 message queue, webhook handler, Blocks checkout opt-in, settings, encryption and all background jobs continue to work unchanged.<\/li>\n<\/ul>\n\n<h4>1.3.1<\/h4>\n\n<ul>\n<li>Setup Guide promoted to top-level admin menu and Settings tab for discoverability<\/li>\n<li>Sidebar upsell now anchored to viewport right edge (position: fixed)<\/li>\n<li>Renamed for WordPress.org submission (display name and slug); internal identifiers unchanged so existing settings are preserved across updates<\/li>\n<li>readme.txt expanded with full external service disclosure and privacy section<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>WordPress.org plugin review compliance pass<\/li>\n<li>Chart.js bundled locally under <code>assets\/js\/vendor\/<\/code> (MIT license attribution included)<\/li>\n<li>All <code>$_GET<\/code> \/ <code>$_POST<\/code> reads wrapped with <code>wp_unslash()<\/code> before sanitization<\/li>\n<li>All <code>$wpdb<\/code> queries use <code>prepare()<\/code> or have appropriate phpcs:ignore documentation<\/li>\n<li>Template ternary output wrapped with <code>esc_attr()<\/code> \/ <code>wp_kses_post()<\/code><\/li>\n<li>Inline <code>&lt;script&gt;<\/code> extracted to enqueued <code>admin-help.js<\/code><\/li>\n<li><code>base64_decode<\/code> calls commented with security justification<\/li>\n<li>readme description rewritten to honestly reflect free-version features only<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Activity feed bug fix \u2014 phone column was using wrong DB field<\/li>\n<li>Active Templates mini card replaces New Subscribers in free dashboard<\/li>\n<li>Friendlier context labels in Recent Activity (\"Order update #1234\" vs generic \"Order\")<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>New Setup Guide tab with 6-step Meta walkthrough<\/li>\n<li>Click-to-copy webhook URL and verify token chips<\/li>\n<li>6-question FAQ accordion (pricing, rate limits, template rejection, debugging)<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Pro-only Settings tabs (Cart Recovery, Quiet Hours) properly filtered in free build<\/li>\n<li>Settings save handler refuses Pro-only tabs in free (defense in depth)<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Plugin version bump for cache busting<\/li>\n<li>Settings tab filtering refinements<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial public release<\/li>\n<\/ul>","raw_excerpt":"Send WooCommerce order notifications via WhatsApp using Meta&#039;s official Cloud API. GDPR opt-in, STOP keyword unsubscribe, encrypted tokens.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/so.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/315379","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/so.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/so.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/so.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=315379"}],"author":[{"embeddable":true,"href":"https:\/\/so.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/codeatoz"}],"wp:attachment":[{"href":"https:\/\/so.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=315379"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/so.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=315379"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/so.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=315379"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/so.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=315379"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/so.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=315379"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/so.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=315379"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}