{"id":292845,"date":"2026-04-06T18:35:33","date_gmt":"2026-04-06T18:35:33","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/signoffflow-client-approval-workflow-client-portal\/"},"modified":"2026-04-06T18:38:06","modified_gmt":"2026-04-06T18:38:06","slug":"signoffflow-client-approval-workflow","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/signoffflow-client-approval-workflow\/","author":23430804,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"6.9.4","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"SignoffFlow - Client Approval Workflow & Client Portal","header_author":"Vasileios Zisis","header_description":"Private client portal for service businesses with updates, files, and client requests.","assets_banners_color":"243e53","last_updated":"2026-04-06 18:38:06","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/profiles.wordpress.org\/vzisis\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":45,"num_ratings":0,"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":"vzisis","date":"2026-04-06 18:38:06"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3500090,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3500090,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3500090,"resolution":"1544x500","location":"assets","locale":""},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3500090,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3500090,"resolution":"1","location":"assets","locale":""},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3500090,"resolution":"2","location":"assets","locale":""},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3500090,"resolution":"3","location":"assets","locale":""},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3500118,"resolution":"4","location":"assets","locale":""},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3500090,"resolution":"5","location":"assets","locale":""},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3500090,"resolution":"6","location":"assets","locale":""}},"screenshots":{"1":"Client portal dashboard with Action required","2":"Updates timeline inside the client portal","3":"Files area with protected client downloads","4":"Requests checklist with client completion actions","5":"SignoffFlow settings and notification toggles","6":"Event Log showing audit and email-attempt entries"},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[5590,17989,259572,12683,7135],"plugin_category":[],"plugin_contributors":[253418],"plugin_business_model":[],"class_list":["post-292845","plugin","type-plugin","status-publish","hentry","plugin_tags-agency","plugin_tags-client-portal","plugin_tags-client-communication","plugin_tags-file-sharing","plugin_tags-project-management","plugin_contributors-vzisis","plugin_committers-vzisis"],"banners":{"banner":"https:\/\/ps.w.org\/signoffflow-client-approval-workflow\/assets\/banner-772x250.png?rev=3500090","banner_2x":"https:\/\/ps.w.org\/signoffflow-client-approval-workflow\/assets\/banner-1544x500.png?rev=3500090","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/signoffflow-client-approval-workflow\/assets\/icon-128x128.png?rev=3500090","icon_2x":"https:\/\/ps.w.org\/signoffflow-client-approval-workflow\/assets\/icon-256x256.png?rev=3500090","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/signoffflow-client-approval-workflow\/assets\/screenshot-1.png?rev=3500090","caption":"Client portal dashboard with Action required"},{"src":"https:\/\/ps.w.org\/signoffflow-client-approval-workflow\/assets\/screenshot-2.png?rev=3500090","caption":"Updates timeline inside the client portal"},{"src":"https:\/\/ps.w.org\/signoffflow-client-approval-workflow\/assets\/screenshot-3.png?rev=3500090","caption":"Files area with protected client downloads"},{"src":"https:\/\/ps.w.org\/signoffflow-client-approval-workflow\/assets\/screenshot-4.png?rev=3500118","caption":"Requests checklist with client completion actions"},{"src":"https:\/\/ps.w.org\/signoffflow-client-approval-workflow\/assets\/screenshot-5.png?rev=3500090","caption":"SignoffFlow settings and notification toggles"},{"src":"https:\/\/ps.w.org\/signoffflow-client-approval-workflow\/assets\/screenshot-6.png?rev=3500090","caption":"Event Log showing audit and email-attempt entries"}],"raw_content":"<!--section=description-->\n<p>SignoffFlow is a <strong>client portal<\/strong> plugin for agencies, freelancers, and service teams.<\/p>\n\n<p>Create a private portal workspace per client account where you can:\n* Share <strong>project updates<\/strong> (timeline)\n* Share <strong>files<\/strong> with protected downloads\n* Send <strong>client requests\/tasks<\/strong> and track completion<\/p>\n\n<p>Portal access is restricted to WordPress users assigned to a client account, plus staff users with management capability.<\/p>\n\n<p>This plugin only outputs front-end content on the portal page via the <code>[cliapwo_portal]<\/code> shortcode.<\/p>\n\n<h3>Use cases<\/h3>\n\n<ul>\n<li>Collect client confirmations on deliverables and tasks<\/li>\n<li>Keep client communication out of email threads<\/li>\n<li>Share files securely with per-client access control<\/li>\n<li>Provide a branded agency client portal experience<\/li>\n<\/ul>\n\n<h3>Getting started<\/h3>\n\n<ol>\n<li>Go to <code>SignoffFlow &gt; Settings<\/code>.<\/li>\n<li>Use the <code>Quick setup<\/code> panel to create a sample portal page, or create a page manually and add <code>[cliapwo_portal]<\/code>.<\/li>\n<li>Confirm that page is selected as the portal page in SignoffFlow settings.<\/li>\n<li>Create a client account in <code>SignoffFlow &gt; Clients<\/code> and assign one or more WordPress portal users.<\/li>\n<li>Add updates, files, and requests for that client account.<\/li>\n<li>Log in as an assigned portal user to view the portal and complete requests.<\/li>\n<\/ol>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code> or install it as a zip in WordPress.<\/li>\n<li>Activate <strong>SignoffFlow<\/strong> through the WordPress Plugins screen.<\/li>\n<li>Go to <code>SignoffFlow &gt; Settings<\/code>.<\/li>\n<li>Use the optional <code>Quick setup<\/code> panel to create a sample portal page automatically, or create your own page and add the <code>[cliapwo_portal]<\/code> shortcode.<\/li>\n<li>Confirm the portal page is selected in SignoffFlow settings.<\/li>\n<li>Create a client account in <code>SignoffFlow &gt; Clients<\/code>.<\/li>\n<li>Assign one or more WordPress portal users to that client account.<\/li>\n<li>Add updates, files, and requests for that client account.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"who%20can%20see%20a%20client%20portal%3F\"><h3>Who can see a client portal?<\/h3><\/dt>\n<dd><p>Only WordPress users assigned to that client account, plus staff users with the <code>cliapwo_manage_portal<\/code> capability.<\/p><\/dd>\n<dt id=\"how%20are%20files%20protected%3F\"><h3>How are files protected?<\/h3><\/dt>\n<dd><p>Clients receive protected download links that go through an access-checked endpoint. Files are stored in a dedicated <code>cliapwo-private<\/code> uploads subdirectory instead of standard public Media Library URLs, and the portal UI does not expose raw file paths.<\/p>\n\n<p>Apache hardening files are created automatically for that directory. Nginx hosts may still need an equivalent deny rule added at the server level.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20send%20email%20notifications%3F\"><h3>Does the plugin send email notifications?<\/h3><\/dt>\n<dd><p>Yes. SignoffFlow can send request, update, and file notifications with <code>wp_mail()<\/code> to all WordPress users assigned to the related client account. Notification types can be toggled in <code>SignoffFlow &gt; Settings<\/code>.<\/p><\/dd>\n<dt id=\"can%20i%20test%20notifications%20on%20a%20local%20site%3F\"><h3>Can I test notifications on a local site?<\/h3><\/dt>\n<dd><p>Yes, but local mail delivery depends on your environment. SignoffFlow records <code>Email attempt<\/code> entries in the Event Log for each notification. If WordPress cannot confirm delivery, SignoffFlow also shows a dismissible admin notice on its own screens so you can check the Event Log and review your mail transport.<\/p>\n\n<p>The Notifications settings screen also includes an Email delivery help section with a simple test flow and recommendations for Mailpit, MailHog, SMTP, Postmark, and Mailtrap.<\/p><\/dd>\n<dt id=\"can%20developers%20customize%20the%20portal%20styling%3F\"><h3>Can developers customize the portal styling?<\/h3><\/dt>\n<dd><p>Yes. The portal uses a stable root wrapper (<code>.cliapwo-portal<\/code>), documented CSS variables, and a small set of filters for wrapper classes, section classes, and inline style variables.<\/p>\n\n<p>For installed sites, see the Portal styling help note in <code>SignoffFlow &gt; Settings<\/code>. Customizations should be added from a theme or site-specific plugin rather than by editing SignoffFlow directly.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<p>Initial release.<\/p>","raw_excerpt":"Client portal for agencies: share updates, files, and client requests privately.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/292845","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=292845"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/vzisis"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=292845"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=292845"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=292845"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=292845"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=292845"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=292845"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}