{"id":391120,"date":"2026-10-26T08:11:51","date_gmt":"2026-10-26T08:11:51","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/xd-form-notify-for-zalo-oa\/"},"modified":"2026-10-26T08:11:16","modified_gmt":"2026-10-26T08:11:16","slug":"vinh-xd-form-notifications-for-zalo-oa","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/vinh-xd-form-notifications-for-zalo-oa\/","author":13977273,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.1","stable_tag":"1.0.1","tested":"7.1.4","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"Vinh XD Form Notifications for Zalo OA","header_author":"V\u0129nh XD","header_description":"Send instant Zalo Official Account (OA) notifications when Fluent Forms or Contact Form 7 forms are submitted, with built-in anti-spam and rate limiting.","assets_banners_color":"","last_updated":"2026-10-26 08:11:16","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/vinhxd.com\/plugin","header_author_uri":"https:\/\/vinhxd.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":70,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.1":{"tag":"1.0.1","author":"vinhxomdoi","date":"2026-10-26 08:11:16","revision":3765796}},"upgrade_notice":{"1.0.1":"<p>Name update and packaging cleanup.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3765827,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3765827,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.1"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Zalo OA connection and test message.","2":"Per-form configuration and the configured forms table.","3":"Delivery logs.","4":"Anti-spam settings."}},"plugin_section":[],"plugin_tags":[2656,1152,185045,1159,150432],"plugin_category":[54],"plugin_contributors":[288614],"plugin_business_model":[],"class_list":["post-391120","plugin","type-plugin","status-publish","hentry","plugin_tags-anti-spam","plugin_tags-contact-form-7","plugin_tags-fluent-forms","plugin_tags-notification","plugin_tags-zalo","plugin_category-security-and-spam-protection","plugin_contributors-vinhxomdoi","plugin_committers-vinhxomdoi"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/vinh-xd-form-notifications-for-zalo-oa\/assets\/icon-128x128.png?rev=3765827","icon_2x":"https:\/\/ps.w.org\/vinh-xd-form-notifications-for-zalo-oa\/assets\/icon-256x256.png?rev=3765827","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Vinh XD Form Notifications for Zalo OA sends a message through the official Zalo Official Account (OA) API every time a visitor submits a Fluent Forms or Contact Form 7 form, so you can respond to leads in seconds.<\/p>\n\n<p>This plugin is not affiliated with or endorsed by Zalo or VNG Corporation. It uses only the official, documented Zalo OA API.<\/p>\n\n<p><strong>Features<\/strong><\/p>\n\n<ul>\n<li>Works with Fluent Forms and Contact Form 7.<\/li>\n<li>Per-form configuration: enable, recipient, message template, optional webhook. A table lists all configured forms with Edit, Enable\/Disable and Delete actions.<\/li>\n<li>Message templates with placeholders: <code>{all_data}<\/code>, <code>{ip}<\/code>, <code>{embed_post.permalink}<\/code>, <code>{form_title}<\/code>, <code>{submitted_at}<\/code> and any field name, including Fluent Forms style <code>{inputs.names.last_name}<\/code>.<\/li>\n<li>Sends immediately after the submission (no dependency on WP-Cron); WP-Cron is only used for retries.<\/li>\n<li>Automatic access token refresh using your OA refresh token.<\/li>\n<li>Delivery logs with status filters and automatic cleanup.<\/li>\n<li>Anti-spam: rate limit (default 3 messages \/ 10 minutes and 20 messages \/ day, editable), one summary message for held submissions, duplicate detection, link \/ foreign-script \/ IP-flood filters, and a hidden honeypot field.<\/li>\n<li>No tracking, no external assets. Credentials are stored encrypted using your WordPress salts.<\/li>\n<\/ul>\n\n<p><strong>Requirements<\/strong><\/p>\n\n<ul>\n<li>A Zalo Official Account and an app on <a href=\"https:\/\/developers.zalo.me\/\">Zalo for Developers<\/a> linked to it.<\/li>\n<li>The recipient must be the OA <code>user_id<\/code> of a person who follows or has interacted with your OA (Zalo OA cannot message arbitrary phone numbers).<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to the Zalo Official Account API, operated by VNG Corporation, to deliver notifications. It is required for the plugin's core function.<\/p>\n\n<ul>\n<li><strong>openapi.zalo.me<\/strong> (<code>https:\/\/openapi.zalo.me\/v3.0\/oa\/message\/cs<\/code>): called each time a configured form is submitted (and when you click \"Send test\", or when a failed message is retried). Data sent: the recipient OA user_id, the notification text built from your template (which may include the submitted form fields, the visitor's IP address and the page URL), and your OA access token.<\/li>\n<li><strong>oauth.zaloapp.com<\/strong> (<code>https:\/\/oauth.zaloapp.com\/v4\/oa\/access_token<\/code>): called when the access token is about to expire, once a day, or when you click \"Refresh access token now\". Data sent: your App ID, Secret Key and refresh token.<\/li>\n<\/ul>\n\n<p>Nothing is sent before you enter your OA credentials and enable a form.<\/p>\n\n<p>Zalo terms of use: https:\/\/zalo.vn\/dieukhoan\/\nZalo privacy policy: https:\/\/zalo.me\/zalo\/policy\/\nZalo OA developer terms: https:\/\/developers.zalo.me\/docs\/official-account\/bat-dau\/dieu-khoan-dich-vu<\/p>\n\n<p>If you set an optional webhook URL, a JSON copy of each notification (form id, title, message, time; raw fields are not included) is also posted to that URL, which you control.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin to <code>\/wp-content\/plugins\/<\/code> or install it from the Plugins screen, then activate it.<\/li>\n<li>Go to <strong>Vinh XD Form Notifications &gt; Zalo OA<\/strong> and enter the App ID, Secret Key, Access Token and Refresh Token of your OA app.<\/li>\n<li>Use <strong>Send test<\/strong> with your own OA user_id to confirm delivery.<\/li>\n<li>Go to <strong>Forms<\/strong>, pick a Fluent Forms or Contact Form 7 form, tick <strong>Enable<\/strong>, set the recipient and template, then <strong>Save form<\/strong>.<\/li>\n<li>Optionally adjust limits in <strong>Settings &gt; Anti-spam<\/strong>.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"can%20it%20send%20to%20a%20phone%20number%3F\"><h3>Can it send to a phone number?<\/h3><\/dt>\n<dd><p>No. The official OA API only delivers to users who follow or have interacted with your OA, identified by their OA user_id.<\/p><\/dd>\n<dt id=\"where%20do%20i%20find%20my%20oa%20user_id%3F\"><h3>Where do I find my OA user_id?<\/h3><\/dt>\n<dd><p>Follow your OA from your Zalo account and send it a message, then look up the sender's user_id in the OA management tools or your webhook events.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20the%20rate%20limit%20is%20reached%3F\"><h3>What happens when the rate limit is reached?<\/h3><\/dt>\n<dd><p>Extra submissions are logged as \"limited\" and not sent individually. When quota is available again, one summary message tells you how many were held.<\/p><\/dd>\n<dt id=\"does%20it%20work%20without%20wp-cron%3F\"><h3>Does it work without WP-Cron?<\/h3><\/dt>\n<dd><p>Yes. Messages are sent at the end of the submission request. WP-Cron is only used to retry failed messages.<\/p><\/dd>\n<dt id=\"what%20does%20uninstalling%20remove%3F\"><h3>What does uninstalling remove?<\/h3><\/dt>\n<dd><p>All plugin options, credentials, the queue and the log table.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Renamed display name to \"Vinh XD Form Notifications for Zalo OA\" (not affiliated with Zalo).<\/li>\n<li>Removed bundled translation files; translations are handled by translate.wordpress.org.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Get instant Zalo Official Account messages when Fluent Forms or Contact Form 7 forms are submitted, with rate limiting and spam filters.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/391120","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=391120"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/vinhxomdoi"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=391120"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=391120"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=391120"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=391120"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=391120"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=391120"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}