{"id":374154,"date":"2026-09-24T02:27:50","date_gmt":"2026-09-24T02:27:50","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/grafo-for-woocommerce\/"},"modified":"2026-09-25T06:58:50","modified_gmt":"2026-09-25T06:58:50","slug":"grafo-for-woocommerce","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/grafo-for-woocommerce\/","author":23572311,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.1","stable_tag":"1.1.1","tested":"7.1.2","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Grafo for WooCommerce","header_author":"Grafo","header_description":"Creates WooCommerce orders, with automatic shipping and fee calculation, from Grafo.","assets_banners_color":"","last_updated":"2026-09-25 06:58:50","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/www.grafoflow.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":78,"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":"jayarajesvar","date":"2026-09-24 02:27:16","revision":3710403},"1.1.1":{"tag":"1.1.1","author":"jayarajesvar","date":"2026-09-25 06:58:50","revision":3712540}},"upgrade_notice":{"1.1.1":"<p>Fixes silent $0 shipping when a destination\/weight can&#039;t actually be quoted.<\/p>","1.1.0":"<p>Adds a delivery-address update endpoint for existing orders.<\/p>","1.0.1":"<p>Security hardening: removes an unnecessary user-context elevation in the REST authentication check and sanitizes incoming address fields.<\/p>","1.0.0":"<p>Initial public release.<\/p>"},"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.1","1.1.1"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[16281,23853,3546,3160,286],"plugin_category":[45],"plugin_contributors":[282385],"plugin_business_model":[],"class_list":["post-374154","plugin","type-plugin","status-publish","hentry","plugin_tags-orders","plugin_tags-rest-api","plugin_tags-shipping","plugin_tags-whatsapp","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-jayarajesvar","plugin_committers-jayarajesvar"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/grafo-for-woocommerce.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Grafo for WooCommerce extends the WooCommerce REST API with a single endpoint purpose-built for creating orders from outside the WordPress admin.<\/p>\n\n<p>It is the bridge between your WooCommerce store and <a href=\"https:\/\/www.grafoflow.com\/\">Grafo<\/a>, a workflow automation platform that lets merchants take orders over WhatsApp. The plugin itself does not contain any WhatsApp or messaging logic \u2014 it only exposes one authenticated REST endpoint that an external, authorized caller (such as your Grafo workflow) can use to create an order:<\/p>\n\n<ul>\n<li>Create a WooCommerce order from a JSON payload (line items, billing\/shipping addresses, payment method, custom meta)<\/li>\n<li>Automatically resolve applicable shipping rates for the order's destination and attach the selected shipping line<\/li>\n<li>Automatically calculate and attach any cart-level fees configured on the store (via WooCommerce's native fee hooks, plus a <code>grafo_order_fees<\/code> filter for custom fee logic)<\/li>\n<li>Update the delivery (shipping) address on an existing order, re-pricing shipping for the new destination. The update is rejected if it would raise the shipping cost, and blocked once the order is completed, cancelled or refunded<\/li>\n<\/ul>\n\n<h4>Who this is for<\/h4>\n\n<p>Store owners who use Grafo to take orders through WhatsApp conversations and want those orders created in WooCommerce with correct shipping and fees, without giving the automation platform admin access to wp-admin.<\/p>\n\n<h4>External services<\/h4>\n\n<p>This plugin adds one new REST API route to your site; it does not make outbound requests to any third-party service itself. That route is designed to be called by your Grafo account: when you connect your store to Grafo, Grafo's servers send authenticated requests to <code>POST \/wp-json\/wc\/v3\/grafo-orders<\/code> to create orders on your behalf. Only requests authenticated as a user with the <code>manage_woocommerce<\/code> capability (via a logged-in session or WooCommerce REST API consumer key\/secret) are accepted. No data is transmitted anywhere by this plugin without such an authenticated request initiating it. See Grafo's terms and privacy policy at https:\/\/www.grafoflow.com\/ for how Grafo itself handles the data it sends and receives.<\/p>\n\n<h4>Privacy<\/h4>\n\n<p>This plugin does not collect analytics or telemetry, does not add any tracking scripts, and does not create any custom database tables. It only writes standard WooCommerce order data, for orders created through its REST endpoint \u2014 identical in structure to orders created any other way. No personal data is sent off-site by this plugin.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin files to <code>\/wp-content\/plugins\/grafo-for-woocommerce<\/code>, or install the plugin through the WordPress plugins screen directly.<\/li>\n<li>Activate the plugin through the \"Plugins\" screen in WordPress. WooCommerce must already be installed and active.<\/li>\n<li>In WooCommerce, go to <strong>WooCommerce \u2192 Settings \u2192 Advanced \u2192 REST API<\/strong> and create a key with <strong>Read\/Write<\/strong> permissions for the user account you want Grafo to act as (that user needs the <code>manage_woocommerce<\/code> capability).<\/li>\n<li>Enter the resulting Consumer Key and Consumer Secret in your Grafo WooCommerce integration settings.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20plugin%20add%20anything%20to%20the%20wordpress%20admin%20ui%3F\"><h3>Does this plugin add anything to the WordPress admin UI?<\/h3><\/dt>\n<dd><p>No. It is intentionally headless \u2014 it only registers one REST API route. All configuration happens through WooCommerce's own REST API key management (WooCommerce \u2192 Settings \u2192 Advanced \u2192 REST API) and your Grafo account.<\/p><\/dd>\n<dt id=\"does%20this%20work%20without%20grafo%3F\"><h3>Does this work without Grafo?<\/h3><\/dt>\n<dd><p>The endpoint will work with any authenticated client that sends correctly-shaped requests, but the plugin is built and tested specifically to pair with Grafo's WhatsApp order-creation workflows.<\/p><\/dd>\n<dt id=\"does%20this%20plugin%20handle%20shipment%20tracking%3F\"><h3>Does this plugin handle shipment tracking?<\/h3><\/dt>\n<dd><p>No. This plugin is scoped to order creation only. It does not register a tracking endpoint and does not store courier or tracking-number data.<\/p><\/dd>\n<dt id=\"does%20this%20plugin%20reduce%20stock%20when%20it%20creates%20an%20order%3F\"><h3>Does this plugin reduce stock when it creates an order?<\/h3><\/dt>\n<dd><p>Yes, through WooCommerce's own core status-transition hooks, in the same way any other order does when its status changes.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Fix: order creation now checks that a real shipping rate can be resolved for the destination before creating the order, and rejects a $0 rate unless it genuinely comes from the Free Shipping method (a $0 rate from any other method usually means the cost couldn't be calculated for that address\/weight, not that shipping is free). Same check applied to the delivery-address update endpoint.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Add an endpoint to update the delivery address on an existing order, with shipping re-priced for the new destination.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Security: authenticated REST API requests no longer switch the global current user; the endpoint still requires the manage_woocommerce capability, but no longer runs the rest of the request as a logged-in user.<\/li>\n<li>Security: sanitize incoming billing\/shipping fields before use.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release: order creation endpoint with automatic shipping and fee calculation, and HPOS (custom order tables) compatibility declaration.<\/li>\n<\/ul>","raw_excerpt":"Adds a REST API endpoint for creating WooCommerce orders, with automatic shipping and fee calculation, for Grafo.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/374154","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=374154"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/jayarajesvar"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=374154"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=374154"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=374154"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=374154"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=374154"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=374154"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}