{"id":300646,"date":"2026-04-27T10:39:39","date_gmt":"2026-04-27T10:39:39","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/flow-editorial-review-content-approval-workflow\/"},"modified":"2026-09-22T12:49:39","modified_gmt":"2026-09-22T12:49:39","slug":"jumplinks-editorial-workflow","status":"publish","type":"plugin","link":"https:\/\/hsb.wordpress.org\/plugins\/jumplinks-editorial-workflow\/","author":23481085,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.5.2","stable_tag":"2.5.2","tested":"7.1.2","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Jumplinks Flow \u2013 Client Feedback & Editorial Workflow","header_author":"Jumplinks Systems","header_description":"Editorial workflow and content approval plugin with inline comments and a familiar WordPress style review experience.","assets_banners_color":"95a6a7","last_updated":"2026-09-22 12:49:39","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/jumplinks.net","rating":5,"author_block_rating":0,"active_installs":0,"downloads":1698,"num_ratings":6,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"jumplinks","date":"2026-04-27 10:39:01","revision":3516313},"1.1.0":{"tag":"1.1.0","author":"jumplinks","date":"2026-04-28 10:14:31","revision":3517224},"1.1.1":{"tag":"1.1.1","author":"jumplinks","date":"2026-04-28 12:03:22","revision":3517365},"1.1.2":{"tag":"1.1.2","author":"jumplinks","date":"2026-04-28 12:12:46","revision":3517378},"1.1.3":{"tag":"1.1.3","author":"jumplinks","date":"2026-04-29 09:15:07","revision":3518211},"1.1.4":{"tag":"1.1.4","author":"jumplinks","date":"2026-04-29 09:49:29","revision":3518258},"1.1.5":{"tag":"1.1.5","author":"jumplinks","date":"2026-05-05 22:03:52","revision":3523848},"1.1.6":{"tag":"1.1.6","author":"jumplinks","date":"2026-05-05 22:19:33","revision":3523858},"1.1.7":{"tag":"1.1.7","author":"jumplinks","date":"2026-05-06 12:27:02","revision":3524408},"1.1.8":{"tag":"1.1.8","author":"jumplinks","date":"2026-05-06 14:39:54","revision":3524534},"1.2.0":{"tag":"1.2.0","author":"jumplinks","date":"2026-05-07 14:19:29","revision":3525634},"1.3.0":{"tag":"1.3.0","author":"jumplinks","date":"2026-05-07 21:42:23","revision":3525992},"1.3.1":{"tag":"1.3.1","author":"jumplinks","date":"2026-05-08 08:53:41","revision":3526302},"1.4.0":{"tag":"1.4.0","author":"jumplinks","date":"2026-05-11 14:05:40","revision":3528797},"2.0.0":{"tag":"2.0.0","author":"jumplinks","date":"2026-05-19 10:59:43","revision":3537139},"2.0.1":{"tag":"2.0.1","author":"jumplinks","date":"2026-05-21 11:10:30","revision":3541711},"2.1.0":{"tag":"2.1.0","author":"jumplinks","date":"2026-05-22 15:10:31","revision":3544071},"2.2.0":{"tag":"2.2.0","author":"jumplinks","date":"2026-06-03 14:07:01","revision":3559535},"2.3.0":{"tag":"2.3.0","author":"jumplinks","date":"2026-06-09 06:33:58","revision":3565525},"2.3.1":{"tag":"2.3.1","author":"jumplinks","date":"2026-08-12 12:20:51","revision":3643363},"2.4.0":{"tag":"2.4.0","author":"jumplinks","date":"2026-08-31 14:35:34","revision":3674452},"2.4.1":{"tag":"2.4.1","author":"jumplinks","date":"2026-09-03 17:17:15","revision":3680139},"2.4.2":{"tag":"2.4.2","author":"jumplinks","date":"2026-09-09 10:58:13","revision":3688154},"2.4.3":{"tag":"2.4.3","author":"jumplinks","date":"2026-09-11 13:52:36","revision":3691500},"2.5.0":{"tag":"2.5.0","author":"jumplinks","date":"2026-09-14 12:34:10","revision":3695218},"2.5.1":{"tag":"2.5.1","author":"jumplinks","date":"2026-09-16 07:12:21","revision":3698050},"2.5.2":{"tag":"2.5.2","author":"jumplinks","date":"2026-09-22 12:49:39","revision":3707354}},"upgrade_notice":[],"ratings":{"1":0,"2":0,"3":0,"4":0,"5":6},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3544071,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3544071,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3544071,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3574136,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3574136,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3707354,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"meta\":{\"title\":\"Jumplinks Flow \\u2014 Demo Review Page\",\"description\":\"You're logged in as a reviewer. Select any text to leave an inline comment, use the sidebar for general feedback, or hit Approve when you're happy.\",\"author\":\"jumplinks\",\"categories\":[\"editorial\",\"workflow\"]},\"landingPage\":\"\\\/?flow_demo_go=1\",\"preferredVersions\":{\"php\":\"8.2\",\"wp\":\"latest\"},\"phpExtensionBundles\":[\"kitchen-sink\"],\"features\":{\"networking\":true},\"steps\":[{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"jumplinks-editorial-workflow\"},\"options\":{\"activate\":true}},{\"step\":\"writeFile\",\"path\":\"\\\/wordpress\\\/wp-content\\\/mu-plugins\\\/flow-demo-go.php\",\"data\":\"<?php\\n\\\/\\\/ Demo helper: \\\/?flow_demo_go=1 \\u2192 redirects to the signed review URL\\n\\\/\\\/ generated by the runPHP step below. This indirection is needed because\\n\\\/\\\/ blueprint `landingPage` is static, but the review URL contains a\\n\\\/\\\/ signed token computed at runtime.\\nadd_action( 'init', function () {\\n\\tif ( ! isset( $_GET['flow_demo_go'] ) ) {\\n\\t\\treturn;\\n\\t}\\n\\t$url = get_option( 'flow_demo_review_url' );\\n\\tif ( $url ) {\\n\\t\\twp_safe_redirect( $url );\\n\\t\\texit;\\n\\t}\\n} );\\n\"},{\"step\":\"runPHP\",\"code\":\"<?php\\nrequire_once '\\\/wordpress\\\/wp-load.php';\\n\\n\\\/\\\/ 1. Reviewer user (Editor role).\\nif ( ! get_user_by( 'login', 'reviewer' ) ) {\\n\\t$reviewer_id = wp_insert_user( [\\n\\t\\t'user_login'   => 'reviewer',\\n\\t\\t'user_pass'    => 'reviewer',\\n\\t\\t'user_email'   => 'reviewer@example.com',\\n\\t\\t'display_name' => 'Demo Reviewer',\\n\\t\\t'role'         => 'editor',\\n\\t] );\\n} else {\\n\\t$reviewer_id = get_user_by( 'login', 'reviewer' )->ID;\\n}\\n\\n\\\/\\\/ 2. Flow settings \\u2014 mark setup completed and (re-)assert reviewer-role + post-type\\n\\\/\\\/    options so cap sync runs and `editor` gets `flow_review_posts`.\\nupdate_option( 'flow_ew_setup_completed', true );\\nupdate_option( 'flow_ew_reviewer_roles', [ 'editor' ] );\\nupdate_option( 'flow_ew_supported_post_types', [ 'post', 'page' ] );\\n\\n\\\/\\\/ 3. Sample draft post (admin = id 1 as author and requester).\\n\\\/\\\/    HTML attributes use single quotes so the surrounding PHP double-quoted\\n\\\/\\\/    string (and the surrounding JSON encoding) doesn't need extra escaping.\\n$post_id = wp_insert_post( [\\n\\t'post_title'   => 'Welcome to the Flow Review Demo page',\\n\\t'post_content' => \\\"<!-- wp:paragraph --><p>You're logged in as the <strong>reviewer<\\\/strong>. Try the things below \\u2014 this whole page is the Flow review experience.<\\\/p><!-- \\\/wp:paragraph --><!-- wp:heading --><h2>What you can try<\\\/h2><!-- \\\/wp:heading --><!-- wp:list --><ul><li><strong>Select any text<\\\/strong> on this page \\u2014 an Add Comment popover appears next to your selection.<\\\/li><li><strong>Click on the image below<\\\/strong> to leave a comment anchored to that image.<\\\/li><li><strong>Open the comment sidebar<\\\/strong> on the right to leave a general comment.<\\\/li><li><strong>Click Approve or Request Changes<\\\/strong> in the top bar to take action.<\\\/li><\\\/ul><!-- \\\/wp:list --><!-- wp:heading --><h2>Comment on an image<\\\/h2><!-- \\\/wp:heading --><!-- wp:paragraph --><p>Image comments are useful when reviewing visual designs, screenshots, or photography. Click the image to leave feedback anchored to it.<\\\/p><!-- \\\/wp:paragraph --><!-- wp:image --><figure class='wp-block-image size-large'><img src='https:\\\/\\\/placehold.co\\\/800x400\\\/2271b1\\\/ffffff\\\/png?text=Click+me+to+leave+a+comment' alt='Demo image - click to leave a comment' \\\/><\\\/figure><!-- \\\/wp:image --><!-- wp:heading --><h2>Comment on a video<\\\/h2><!-- \\\/wp:heading --><!-- wp:paragraph --><p>Embed videos behave like images here \\u2014 click to leave a comment, not to play. Try clicking the video below.<\\\/p><!-- \\\/wp:paragraph --><!-- wp:html --><div style='text-align:center'><video controls preload='metadata' width='800' style='max-width:100%;aspect-ratio:16\\\/9' poster='https:\\\/\\\/placehold.co\\\/800x450\\\/2c3338\\\/ffffff\\\/png?text=Click+to+leave+a+comment'><source src='https:\\\/\\\/commondatastorage.googleapis.com\\\/gtv-videos-bucket\\\/sample\\\/ForBiggerBlazes.mp4' type='video\\\/mp4'><\\\/video><\\\/div><!-- \\\/wp:html --><!-- wp:heading --><h2>Try a longer paragraph<\\\/h2><!-- \\\/wp:heading --><!-- wp:paragraph --><p>Editorial review is most useful on real content \\u2014 paragraphs, headings, lists, the works. Highlight a sentence here and leave a suggestion. Inline comments anchor to the text you selected, so the conversation stays in context instead of getting lost in a long thread.<\\\/p><!-- \\\/wp:paragraph -->\\\",\\n\\t'post_status'  => 'draft',\\n\\t'post_author'  => 1,\\n] );\\n\\n\\\/\\\/ 4. Snapshot to a revision so the review preview has something stable to point at.\\nwp_save_post_revision( $post_id );\\n$revisions   = wp_get_post_revisions( $post_id, [ 'numberposts' => 1 ] );\\n$revision_id = ! empty( $revisions ) ? (int) reset( $revisions )->ID : 0;\\n\\n\\\/\\\/ 5. Create the review and move it to in_review state.\\n$review_id = \\\\Flow\\\\EditorialWorkflow\\\\Review::request( $post_id, $reviewer_id, 1 );\\n\\\\Flow\\\\EditorialWorkflow\\\\Review::send_for_review( $review_id, 1 );\\n\\n\\\/\\\/ 6. Generate the signed preview URL and stash it for the mu-plugin to read.\\n$preview_url = \\\\Flow\\\\EditorialWorkflow\\\\Review::get_preview_url( $review_id, $revision_id, $post_id );\\nupdate_option( 'flow_demo_review_url', $preview_url );\\n\"},{\"step\":\"login\",\"username\":\"reviewer\",\"password\":\"reviewer\"}]}"}},"all_blocks":[],"tagged_versions":["1.0.0","1.1.0","1.1.1","1.1.2","1.1.3","1.1.4","1.1.5","1.1.6","1.1.7","1.1.8","1.2.0","1.3.0","1.3.1","1.4.0","2.0.0","2.0.1","2.1.0","2.2.0","2.3.0","2.3.1","2.4.0","2.4.1","2.4.2","2.4.3","2.5.0","2.5.1","2.5.2"],"block_files":[],"assets_screenshots":{"screenshot-1.gif":{"filename":"screenshot-1.gif","revision":3643470,"resolution":"1","location":"assets","locale":"","width":1176,"height":720},"screenshot-2.gif":{"filename":"screenshot-2.gif","revision":3643363,"resolution":"2","location":"assets","locale":"","width":1320,"height":720},"screenshot-3.gif":{"filename":"screenshot-3.gif","revision":3643363,"resolution":"3","location":"assets","locale":"","width":1316,"height":720},"screenshot-4.gif":{"filename":"screenshot-4.gif","revision":3643470,"resolution":"4","location":"assets","locale":"","width":1320,"height":720},"screenshot-5.gif":{"filename":"screenshot-5.gif","revision":3643363,"resolution":"5","location":"assets","locale":"","width":1244,"height":720},"screenshot-6.gif":{"filename":"screenshot-6.gif","revision":3643363,"resolution":"6","location":"assets","locale":"","width":1320,"height":720},"screenshot-7.gif":{"filename":"screenshot-7.gif","revision":3643363,"resolution":"7","location":"assets","locale":"","width":1316,"height":720},"screenshot-8.gif":{"filename":"screenshot-8.gif","revision":3643363,"resolution":"8","location":"assets","locale":"","width":1312,"height":720},"screenshot-9.gif":{"filename":"screenshot-9.gif","revision":3643363,"resolution":"9","location":"assets","locale":"","width":1316,"height":720}},"screenshots":{"1":"Assign reviewer to page in Gutenberg","2":"Add inline comment to text","3":"Add inline comment to image","4":"Reply to comment","5":"Settings page","6":"Inline comments anchored to content on the review page","7":"Assign reviewer to page in Classic Editor","8":"Assign reviewer to page in Elementor","9":"Assign reviewer to page in Bricks"}},"plugin_section":[262246],"plugin_tags":[145645,255415,96456,15653,147509],"plugin_category":[],"plugin_contributors":[264015,261155],"plugin_business_model":[],"class_list":["post-300646","plugin","type-plugin","status-publish","hentry","plugin_section-dashboard-widgets","plugin_tags-client-feedback","plugin_tags-content-approval","plugin_tags-editorial-workflow","plugin_tags-site-review","plugin_tags-website-feedback","plugin_contributors-alincozari","plugin_contributors-jumplinks","plugin_committers-jumplinks"],"banners":{"banner":"https:\/\/ps.w.org\/jumplinks-editorial-workflow\/assets\/banner-772x250.png?rev=3574136","banner_2x":"https:\/\/ps.w.org\/jumplinks-editorial-workflow\/assets\/banner-1544x500.png?rev=3574136","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/jumplinks-editorial-workflow\/assets\/icon.svg?rev=3544071","icon":"https:\/\/ps.w.org\/jumplinks-editorial-workflow\/assets\/icon.svg?rev=3544071","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/jumplinks-editorial-workflow\/assets\/screenshot-1.gif?rev=3643470","caption":"Assign reviewer to page in Gutenberg"},{"src":"https:\/\/ps.w.org\/jumplinks-editorial-workflow\/assets\/screenshot-2.gif?rev=3643363","caption":"Add inline comment to text"},{"src":"https:\/\/ps.w.org\/jumplinks-editorial-workflow\/assets\/screenshot-3.gif?rev=3643363","caption":"Add inline comment to image"},{"src":"https:\/\/ps.w.org\/jumplinks-editorial-workflow\/assets\/screenshot-4.gif?rev=3643470","caption":"Reply to comment"},{"src":"https:\/\/ps.w.org\/jumplinks-editorial-workflow\/assets\/screenshot-5.gif?rev=3643363","caption":"Settings page"},{"src":"https:\/\/ps.w.org\/jumplinks-editorial-workflow\/assets\/screenshot-6.gif?rev=3643363","caption":"Inline comments anchored to content on the review page"},{"src":"https:\/\/ps.w.org\/jumplinks-editorial-workflow\/assets\/screenshot-7.gif?rev=3643363","caption":"Assign reviewer to page in Classic Editor"},{"src":"https:\/\/ps.w.org\/jumplinks-editorial-workflow\/assets\/screenshot-8.gif?rev=3643363","caption":"Assign reviewer to page in Elementor"},{"src":"https:\/\/ps.w.org\/jumplinks-editorial-workflow\/assets\/screenshot-9.gif?rev=3643363","caption":"Assign reviewer to page in Bricks"}],"raw_content":"<!--section=description-->\n<p>Frustrated with client feedback chaos, multiple staging environments, endless meetings that could have been an email, hundreds of Jira tickets and lost Slack discussions?<\/p>\n\n<p>Send your clients a review magic link. They see the page exactly as visitors will see it, highlight the text or media and leave inline comments. No page is published until approved by a reviewer.<\/p>\n\n<p>https:\/\/www.youtube.com\/watch?v=6g9QunaILLc<\/p>\n\n<p>Flow takes the GitHub pull request review process with inline comments and approve or request changes workflow and builds it into WordPress. It runs entirely on your site, and your clients never needs to create a Wordpress account.<\/p>\n\n<p>If your current process depends on long comment threads, scattered docs and email, or third-party review tools, Flow gives you a cleaner path without complex setup or heavyweight workflow tools. If AI or automation is writing the first draft, Flow is the human checkpoint between that draft and Publish.<\/p>\n\n<h4>\u2699\ufe0f How it works<\/h4>\n\n<ol>\n<li>Assign a reviewer to a page or post: a WordPress user, or just your client's email address.<\/li>\n<li>Your client gets a private magic link straight to the review page. No account, no signup, no login.<\/li>\n<li>They pin comments to the exact text or image on the rendered page.<\/li>\n<li>They approve or request changes. You fix, resubmit, and repeat until it's approved.<\/li>\n<li>You publish once it's approved, knowing exactly who signed off.<\/li>\n<\/ol>\n\n<h4>\ud83c\udfaf Why agencies and freelancers use Flow<\/h4>\n\n<ul>\n<li><strong>Clients don't need an account.<\/strong> Enter an email address and Flow sends a signed magic link tied to that address. It stops working the moment you remove the reviewer or cancel the review.<\/li>\n<li><strong>Feedback on the real page.<\/strong> Reviewers see your theme, layout, and images as visitors will, so they catch spacing and typography problems the editor view hides. They never touch the editor.<\/li>\n<li><strong>Comments where the problem is.<\/strong> Select text or an image to pin a comment to it. Threaded replies keep the back-and-forth in one place.<\/li>\n<li><strong>A clear yes before launch.<\/strong> Approve and request changes are explicit steps. Turn on mandatory review and Publish stays blocked until a reviewer approves.<\/li>\n<li><strong>Nothing hosted elsewhere.<\/strong> Flow runs inside your WordPress install. There's no separate SaaS account, and comments and approvals stay on your site.<\/li>\n<li><strong>Works with your builder.<\/strong> Dedicated integrations for Gutenberg, Classic Editor, Elementor, Bricks, Beaver Builder, Divi, Avada, Breakdance, and Oxygen.<\/li>\n<li><strong>One settings screen.<\/strong> Choose content types, reviewer roles, and an optional default reviewer under Settings \u2192 Flow.<\/li>\n<\/ul>\n\n<h4>\ud83d\udcdd Also works for editorial teams<\/h4>\n\n<p>Writers send drafts to an editor, the editor comments in context and approves, and the post goes live. No custom statuses to design, no workflow builder to configure. Flow works on posts, pages, WooCommerce products, and custom post types. It can assign a default reviewer automatically and show a \"Reviewed by\" credit on published content.<\/p>\n\n<h4>\u2728 Human approval for AI and automated drafts<\/h4>\n\n<p>Flow doesn't generate text or detect AI content. It's the checkpoint between a draft and Publish, whoever or whatever wrote the draft.<\/p>\n\n<ul>\n<li>Drafts created by ChatGPT, Claude, n8n, Make, Zapier, or the REST API can get a reviewer assigned automatically the moment the post is created.<\/li>\n<li>With mandatory review on, the first Publish or Schedule stays blocked until a person approves, including attempts through the REST API.<\/li>\n<li>AI agents connected through WordPress Agent Connector or MCP can send content for review, read comments, resolve threads, and resubmit. Only a human can approve or request changes.<\/li>\n<li>Optionally let an agent reply to a comment to ask what you meant, and make it say what it changed when it resolves one. Off by default; you choose which user those comments are posted as.<\/li>\n<\/ul>\n\n<h4>\ud83e\udd16 What makes Flow different<\/h4>\n\n<p>Most feedback tools are paid-only SaaS subscriptions that charge per reviewer and require clients to sign up for separate accounts. Flow runs entirely inside your WordPress site, and lets you invite reviewers with a single link \u2014 no signup, no monthly fee, no third-party service collecting your content.<\/p>\n\n<p>Editorial workflow plugins optimize for maximum configuration. Flow optimizes for feedback momentum. You get a clear approval process and contextual collaboration without overwhelming your team or clients with complexity.<\/p>\n\n<p>If you want an editorial workflow that is modern, focused, and easy to use from day one, Flow is built for you.<\/p>\n\n<h4>\ud83d\ude80 Flow Pro<\/h4>\n\n<p>Everything above is free. <a href=\"https:\/\/jumplinks.net\/pro\">Flow Pro<\/a> adds:<\/p>\n\n<ul>\n<li><strong>Public review:<\/strong> share one review link that anyone can open and comment on, with no WordPress account and no email invite needed.<\/li>\n<li><strong>Site-wide review:<\/strong> send the whole site. Reviewers browse in review mode and comment on any page.<\/li>\n<li><strong>Unlimited external reviewers:<\/strong> Free includes one external email reviewer per post. Pro removes the limit.<\/li>\n<li><strong>Multiple reviewers:<\/strong> set a minimum number of approvals, with each reviewer's vote tracked separately.<\/li>\n<li><strong>Device switcher:<\/strong> reviewers check desktop, tablet, and mobile widths without leaving the page.<\/li>\n<li><strong>Rich comments and @mentions:<\/strong> formatting, links, and code blocks, plus mentions for reviewers, authors, and external invitees.<\/li>\n<li><strong>Slack notifications:<\/strong> DMs for assignments, mentions, approvals, change requests, and site review invites.<\/li>\n<li><strong>Webhooks for n8n, Zapier, and Make:<\/strong> signed JSON payloads when a review is sent, approved, or sent back for changes. Deliveries are queued and retried with a full log. Payloads include the exact passage each inline comment points at, formatted for a prompt, so a writing agent can apply the fixes and resubmit.<\/li>\n<li><strong>Activity log:<\/strong> every status change on the review page, with the user who triggered it.<\/li>\n<\/ul>\n\n<h4>\ud83d\udee0\ufe0f Development<\/h4>\n\n<p><strong>Where is the JavaScript and CSS source?<\/strong><\/p>\n\n<p>Human-editable source for the compiled assets in <code>build\/<\/code> lives in the <code>src\/<\/code> directory. Files under <code>build\/<\/code> are generated by webpack; edit <code>src\/<\/code> instead of hand-editing <code>build\/<\/code>.<\/p>\n\n<p><strong>How do I rebuild the compiled assets?<\/strong><\/p>\n\n<p>From the plugin directory, with a supported Node.js release:<\/p>\n\n<ol>\n<li>Run <code>npm install<\/code> or <code>npm ci<\/code> to install dependencies.<\/li>\n<li>Run <code>npm run build<\/code> to regenerate webpack output.<\/li>\n<\/ol>\n\n<p><strong>Third-party JavaScript<\/strong><\/p>\n\n<p>Packages such as <code>@wordpress\/scripts<\/code> and <code>@wordpress\/icons<\/code> are declared in <code>package.json<\/code>. After <code>npm install<\/code>, see each package under <code>node_modules\/<\/code> for license text, or refer to the upstream WordPress repositories.<\/p>\n\n<h4>\ud83d\udd0c External services<\/h4>\n\n<p>This plugin loads avatar images from Gravatar (operated by Automattic), which is a third-party service.<\/p>\n\n<ul>\n<li><strong>What is sent:<\/strong> an MD5 hash of the user's email address, generated by WordPress core via <code>get_avatar_url()<\/code>. No raw email address leaves the site.<\/li>\n<li><strong>When:<\/strong> whenever the plugin renders a comment author avatar (review page comment cards, inline comment threads) or a reviewer\/requester avatar (REST responses for the review sidebar and the Elementor, Bricks, Beaver Builder, Divi, Avada, Breakdance, and Oxygen Builder drawers).<\/li>\n<li><strong>Why:<\/strong> to display each commenter's avatar next to their comment, matching the rest of the WordPress avatar experience.<\/li>\n<li><strong>Service URL:<\/strong> https:\/\/gravatar.com\/<\/li>\n<li><strong>Terms:<\/strong> https:\/\/automattic.com\/terms\/<\/li>\n<li><strong>Privacy:<\/strong> https:\/\/automattic.com\/privacy\/<\/li>\n<\/ul>\n\n<p>This is the same Gravatar integration that ships with WordPress core. The free plugin contacts no other external service.<\/p>\n\n<p>Flow Pro adds optional integrations that only send data once you configure them:<\/p>\n\n<ul>\n<li><strong>Slack<\/strong> (https:\/\/slack.com\/) \u2014 when you save a Slack bot token, Flow calls <code>chat.postMessage<\/code> and <code>users.lookupByEmail<\/code> on api.slack.com to deliver direct messages. Sent: the reviewer's WordPress email address (to find their Slack account), reviewer and author display names, content titles, review links, and the text of comments they are mentioned in. Terms: https:\/\/slack.com\/terms-of-service \u00b7 Privacy: https:\/\/slack.com\/privacy-policy<\/li>\n<li><strong>Webhooks<\/strong> \u2014 Flow posts signed JSON to the endpoint URLs you enter under Flow \u2192 Webhooks. Payloads contain review status, post title and links, reviewer and requester names and email addresses, and comment text including the exact passage a comment points at. Deliveries and their payloads are kept in your database for the retention period you set and pruned by cron.<\/li>\n<li><strong>Akismet<\/strong> \u2014 if the Akismet plugin is active and configured, anonymous comments on open-to-public reviews are checked with Akismet's <code>comment-check<\/code> endpoint (comment text, name, email, IP address, user agent and referrer), governed by Akismet's terms and privacy policy: https:\/\/akismet.com\/privacy\/<\/li>\n<li><strong>Freemius<\/strong> (https:\/\/freemius.com\/) \u2014 Pro licences are activated and updates are fetched through Freemius; no usage data is sent unless you explicitly opt in. Privacy: https:\/\/freemius.com\/privacy\/<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Install the plugin from Plugins \u2192 Add New, or upload the files to <code>\/wp-content\/plugins\/jumplinks-editorial-workflow<\/code>.<\/li>\n<li>Activate the plugin through the Plugins screen.<\/li>\n<li>Go to Settings \u2192 Flow to choose content types, reviewer roles, automatic reviewer assignment, mandatory review, and the optional \"Reviewed by\" credit.<\/li>\n<li>Open a page or post, assign a reviewer (a WordPress user or an email address), and send it for review.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"how%20does%20the%20review%20workflow%20work%3F\"><h3>How does the review workflow work?<\/h3><\/dt>\n<dd><p>Assign a reviewer, collect feedback via inline comments, request changes or approve, and publish when approved.<\/p><\/dd>\n<dt id=\"what%20does%20the%20reviewer%20see%3F\"><h3>What does the reviewer see?<\/h3><\/dt>\n<dd><p>The actual page exactly as visitors will see it \u2014 Flow renders the content through your theme on the frontend. Inline comments anchor to the rendered output, so reviewers catch layout, spacing, and typography issues that the editor view hides. Reviewers also don't need to access the editor to leave feedback.<\/p><\/dd>\n<dt id=\"which%20editors%20are%20supported%3F\"><h3>Which editors are supported?<\/h3><\/dt>\n<dd><p>Flow has dedicated integrations for Gutenberg, Classic Editor, Elementor, Bricks Builder, Beaver Builder, Divi, Avada, Breakdance, and Oxygen, plus WooCommerce products. In Gutenberg, Flow is a panel in the document sidebar. In Classic Editor and on WooCommerce products, it's a metabox on the edit screen. In the page builders, it's a control in the builder's top bar or toolbar.<\/p><\/dd>\n<dt id=\"i%20use%20a%20different%20editor.%20what%20do%20i%20do%3F\"><h3>I use a different editor. What do I do?<\/h3><\/dt>\n<dd><p>You can still use Flow. Open the post in Gutenberg or Classic Editor (both included with WordPress) to request reviews, manage reviewers, and track status. Your existing editor stays untouched for the actual content work, and reviewers still comment on the rendered page.<\/p><\/dd>\n<dt id=\"does%20flow%20support%20custom%20content%20types%3F\"><h3>Does Flow support custom content types?<\/h3><\/dt>\n<dd><p>Yes. You can enable the review workflow for posts, pages, products, and custom post types from the settings screen. We cannot guarantee compatibility with every custom content type, but we are confident most cases are handled.<\/p><\/dd>\n<dt id=\"does%20flow%20send%20notifications%3F\"><h3>Does Flow send notifications?<\/h3><\/dt>\n<dd><p>Yes. Flow sends email notifications for key review lifecycle events, helping teams stay aligned on status changes. Slack integration is also included in the Pro version.<\/p><\/dd>\n<dt id=\"is%20flow%20compatible%20with%20woocommerce%3F\"><h3>Is Flow compatible with WooCommerce?<\/h3><\/dt>\n<dd><p>Yes. Open Settings \u2192 Flow and choose the Product content type. WooCommerce products use the classic editor, so Flow appears as a Review metabox under Publish. Reviewers comment on the live product page.<\/p><\/dd>\n<dt id=\"who%20should%20use%20flow%3F\"><h3>Who should use Flow?<\/h3><\/dt>\n<dd><p>Freelance developers and agencies who want a structured way to share in-progress work with clients for feedback and approval, without sending screenshots or asking clients to navigate the WordPress admin. It also suits content and editorial teams that need a simple review and approval workflow without enterprise-style configuration, and teams that use AI or automation for first drafts and want a named person to approve before publishing.<\/p><\/dd>\n<dt id=\"can%20i%20use%20flow%20to%20showcase%20work%20to%20clients%3F\"><h3>Can I use Flow to showcase work to clients?<\/h3><\/dt>\n<dd><p>Yes. Enter your client's email address as the reviewer and Flow sends them a private magic link to the review page, with no WordPress account needed. They comment on the live page and approve or request changes. If you'd rather give them an account, assign a WordPress user with a reviewer role instead. Flow Pro adds public review links anyone can open, several external reviewers per post, and site-wide review.<\/p><\/dd>\n<dt id=\"what%27s%20the%20difference%20between%20external%20reviewers%2C%20open%20review%2C%20and%20public%20review%3F\"><h3>What's the difference between external reviewers, open review, and public review?<\/h3><\/dt>\n<dd><p>An external reviewer is a named person you invite by email. They get a private magic link tied to their address. Free includes one per post; Pro removes the limit. Open review (Free) is a link any logged-in user on your site can open and comment on. Public review (Pro) is a link anyone can open and comment on, with no WordPress account and no invite. Use an external reviewer when you need a specific person's sign-off, and public review when you want wider feedback.<\/p><\/dd>\n<dt id=\"do%20i%20or%20my%20clients%20need%20to%20sign%20up%20for%20anything%3F\"><h3>Do I or my clients need to sign up for anything?<\/h3><\/dt>\n<dd><p>No. Flow is a WordPress plugin, not a hosted service. The free version needs no account anywhere, and clients review through a private magic link. Flow Pro is a per-site license you buy through Freemius and activate inside WordPress.<\/p><\/dd>\n<dt id=\"does%20flow%20generate%20or%20detect%20ai%20content%3F\"><h3>Does Flow generate or detect AI content?<\/h3><\/dt>\n<dd><p>No. Flow is the human review and approval layer around content already in WordPress. It does not generate text, detect whether AI was used, or automatically verify factual claims.<\/p><\/dd>\n<dt id=\"can%20flow%20stop%20an%20ai-generated%20draft%20from%20being%20published%20without%20approval%3F\"><h3>Can Flow stop an AI-generated draft from being published without approval?<\/h3><\/dt>\n<dd><p>Yes. In Mandatory review mode, Flow blocks the initial Publish or Schedule action for supported content types until the active review is approved.<\/p><\/dd>\n<dt id=\"which%20ai%20agents%20work%20with%20it%3F\"><h3>Which AI agents work with it?<\/h3><\/dt>\n<dd><p>Any client that can call WordPress abilities: an MCP client, the WordPress Agent Connector, or your own integration against the REST API. There is no partner list and no approved-vendor gate. If your agent can reach WordPress, it can read the review queue and act on it.<\/p><\/dd>\n<dt id=\"can%20the%20agent%20approve%20its%20own%20work%3F\"><h3>Can the agent approve its own work?<\/h3><\/dt>\n<dd><p>No, and this is deliberate rather than an oversight. There is no approve ability and no request-changes ability exposed to agents. With Mandatory review switched on, the publish block is enforced on the server, so an agent cannot ship unreviewed work even through the REST API.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.5.2<\/h4>\n\n<ul>\n<li>New: Settings \u2192 AI agent now hands you the prompts to give your agent, each with a copy button. An agent only picks up these rules by calling flow\/get-instructions, so the first prompt tells it to do that after you change a setting. The rest are short examples for everyday jobs: resolving the comments on a post, getting an overview of the feedback on a page, and sending it back to the reviewer.<\/li>\n<li>New (Pro): The site review screen now tells you which cookies your page cache has to let through. Reviewers arrive logged out, so a cache can hand them a copy of the site saved before the review existed; the Caching panel lists the exact cookie names to add to a do-not-cache list, names any caching plugin it finds, and links to the setup guide.<\/li>\n<li>Improvement (Pro): Site review feedback now arrives live. When another reviewer comments while you have the review open, it shows up on its own instead of on your next reload, the way it already worked on a page review. Coming back to the tab or window refreshes it straight away, so you never look at a stale page while catching up.<\/li>\n<li>Improvement: Anonymous reviewers can leave up to 10 comments a minute from one address, up from 5. The limit counts the address rather than the person, so two people reviewing from the same office or home network were reaching it between them.<\/li>\n<li>New: Review links get through maintenance and coming-soon modes. Someone holding a valid review link lands on the page and comments as usual while the site is closed to everyone else, and every other visitor still meets the maintenance screen. Works with Bricks, Beaver Builder, Avada, Elementor, Breakdance, Oxygen and WooCommerce, with no setting to turn on.<\/li>\n<li>New: Turn external reviewers off for page reviews. Under Settings \u2192 Workflow, \"Disable external reviewers\" hides the External Email option in the editor and turns away email invites at the API. It is off by default, and anyone already invited keeps the access they have.<\/li>\n<li>New (Pro): Site review rounds. Once a reviewer has sent their feedback and you have applied it, send the site back to that reviewer for another look \u2014 from the Site Review screen, from the review bar while previewing, or through the flow\/resubmit-site-review agent ability. Each reviewer is sent back individually, gets a fresh link, and their earlier comments stay in place. Agents see who to send back in resubmit_to, and a new site_review.resubmitted webhook event fires.<\/li>\n<li>New (Pro): Add or remove reviewers after a site review has gone out. People you add get their invitation; someone you remove loses access immediately.<\/li>\n<li>Improvement (Pro): The Site Review screen was rebuilt. The list is now what you land on, with status, how many reviewers have submitted, and the comment counts readable at a glance, plus filters, search, sorting and paging. Creating a review has its own screen, and every review has its own page with the reviewer roster, per-reviewer actions, and the feedback broken down by page.<\/li>\n<li>Improvement (Pro): External reviewers are invited from the same Reviewers field as everyone else on the Site Review screen. Type an address and pick \"Invite\", instead of ticking a box and filling a second field. With \"Disable external reviews\" on, the option is not offered at all.<\/li>\n<li>Improvement: The welcome popin no longer greets a reviewer who has already been through it. Anyone who gave their name or left feedback goes straight into the review, even on a different browser or device.<\/li>\n<li>Fix (Pro): Clicking the \"Invite {email}\" suggestion in the Reviewers field now adds that external reviewer.<\/li>\n<\/ul>\n\n<h4>2.5.1<\/h4>\n\n<ul>\n<li>New: AI agents can now write back. An agent connected over MCP can reply to a review comment to ask a clarifying question when your instruction is ambiguous, instead of guessing or going quiet.<\/li>\n<li>New: An agent must now say what it changed when it resolves a comment. The explanation is posted into the thread, so every resolved piece of feedback carries its own record.<\/li>\n<li>New: Two switches under Settings \u2192 AI agent control this separately, both on by default. \"Resolve comments\" decides whether an agent has to explain what it changed before a comment counts as resolved, and \"Follow-up comments\" decides whether it may ask you a question when your feedback is unclear. Turn either off and that ability disappears from the agent entirely.<\/li>\n<li>New: \"Ask before editing\", marked Experimental and off by default. It sits with the other AI agent options, so it needs \"Enable AI comments\" and a chosen AI user. With it on, the agent works out what it would change and describes the plan in your chat \u2014 which page, which wording, and anything it still needs from you \u2014 then waits for your go-ahead before touching the site. It is an instruction Flow gives the agent rather than a lock: Flow never edits content itself, so it cannot physically block an edit.<\/li>\n<li>Improvement: Tightened what agents are told about feedback. A highlighted passage only locates a comment and never states what to change, and a vague or non-actionable comment must be left unresolved and asked about rather than guessed at.<\/li>\n<li>New: Reopen a resolved comment. Reply to a resolved thread and tick \"Reopen this thread\" to move it back to active.<\/li>\n<li>New: Copy a reviewer's link straight from the site review screen.<\/li>\n<li>Improvement: First-time reviewers now get a short looping clip showing how to highlight text and leave a comment.<\/li>\n<li>Improvement: The review page hint moved out of the way. It is now a dismissible card in the bottom-left corner.<\/li>\n<li>Improvement: Long comments are no longer cut off in the sidebar. A \"Read more\" toggle expands a comment or a reply in place, and collapses it again.<\/li>\n<li>Improvement: Settings are easier to scan. The AI agent options have their own tab, and the notification settings moved to Extras next to the other occasional options.<\/li>\n<li>Fix: Saving settings no longer throws you back to the first tab. Whichever tab you were on is carried through the save, so you land where you left off.<\/li>\n<\/ul>\n\n<h4>2.5.0<\/h4>\n\n<ul>\n<li>New: Live updates on the review page. Comments from another reviewer appear, change and disappear as they happen, and the status badge follows a decision someone else makes. No page refresh needed.<\/li>\n<li>New: When the author saves a new version while you are reviewing, Flow tells you instead of swapping the page under you. The bar marks the content as outdated and a notification offers the link to the new version, so you choose when to move.<\/li>\n<li>New: Settings are now split into Workflow, Multiple reviewers and Site Review tabs, so the Pro options no longer crowd one screen.<\/li>\n<li>Improvement: The Jumplinks icon now sits beside Review in the admin bar, tinted with the review status.<\/li>\n<li>Improvement: Site review now carries the same desktop, tablet and mobile preview switcher as a single-page review.<\/li>\n<li>Improvement: A new post now names the auto-assigned reviewer straight away, marked as pending until the first save creates the review.<\/li>\n<li>Improvement: Page cache compatibility. Reviewer sessions bypass W3 Total Cache, WP Rocket, LiteSpeed, WP Super Cache, Cache Enabler and SiteGround Optimizer, so a share link never shows a stale page.<\/li>\n<li>Improvement: Personal data export and erase now cover Flow, so review invitations, anonymous comments and Slack details answer the WordPress privacy tools.<\/li>\n<li>Improvement: Faster admin and review pages, with far fewer database queries per request and a smaller editor bundle.<\/li>\n<li>Fix: Send for review no longer appears until a reviewer is assigned, so turning on Open Review does not leave a dead button behind.<\/li>\n<li>Fix: The auto-assign reviewer setting now accepts any WordPress user, as the field describes. Picking someone outside the Review Roles, or yourself, assigns them and lets them approve.<\/li>\n<li>Fix: Security hardening across review permissions, comment validation and webhook destinations.<\/li>\n<\/ul>\n\n<p>Earlier versions: https:\/\/jumplinks.net\/changelog\/<\/p>","raw_excerpt":"Client feedback on the live page with inline comments and content approval editorial workflow. Magic links for clients, no signup, no SaaS subscriptio &hellip;","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/300646","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=300646"}],"author":[{"embeddable":true,"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/jumplinks"}],"wp:attachment":[{"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=300646"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=300646"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=300646"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=300646"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=300646"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=300646"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}