{"id":350935,"date":"2026-08-12T11:49:47","date_gmt":"2026-08-12T11:49:47","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/merchantkits-client-portal\/"},"modified":"2026-08-12T11:49:30","modified_gmt":"2026-08-12T11:49:30","slug":"merchantkits-client-portal","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/merchantkits-client-portal\/","author":23518438,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.0.4","requires":"6.0","requires_php":"8.0","requires_plugins":null,"header_name":"MerchantKits Client Portal","header_author":"MerchantKits","header_description":"Give each client their own branded portal with file sharing, project milestones, message threads, and deliverable approvals \u2014 all from your WordPress dashboard.","assets_banners_color":"3f4555","last_updated":"2026-08-12 11:49:30","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/merchantkits.com\/client-portal\/","header_author_uri":"https:\/\/merchantkits.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":15,"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":"khaliddurani","date":"2026-08-12 11:49:30"}},"upgrade_notice":{"1.0.0":"<p>First release of MerchantKits Client Portal.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3643310,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3643310,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3643364,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3643310,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3643310,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3643310,"resolution":"1","location":"assets","locale":"","width":1400,"height":900},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3643310,"resolution":"2","location":"assets","locale":"","width":1400,"height":638},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3643310,"resolution":"3","location":"assets","locale":"","width":1400,"height":1100},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3643310,"resolution":"4","location":"assets","locale":"","width":1360,"height":880},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3643310,"resolution":"5","location":"assets","locale":"","width":1360,"height":1125},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3643310,"resolution":"6","location":"assets","locale":"","width":1360,"height":555},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3643310,"resolution":"7","location":"assets","locale":"","width":1360,"height":749},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3643310,"resolution":"8","location":"assets","locale":"","width":1400,"height":760}},"screenshots":{"1":"The admin dashboard, with client and project stats, pending actions, and a colour-coded activity feed.","2":"The client list, showing portal links, project counts, and last sign-in.","3":"The project editor, with inline drag-and-drop milestones and auto-calculated progress.","4":"The client-facing portal dashboard, branded with your logo and colour.","5":"A project in the portal: milestone timeline, files, messages, and approvals.","6":"The approval workflow \u2014 a client approving a deliverable or requesting a revision with a note.","7":"The client portal sign-in page.","8":"The settings screen, showing the General tab."}},"plugin_section":[],"plugin_tags":[226063,17989,12683,7142,7135],"plugin_category":[],"plugin_contributors":[267877],"plugin_business_model":[],"class_list":["post-350935","plugin","type-plugin","status-publish","hentry","plugin_tags-client-dashboard","plugin_tags-client-portal","plugin_tags-file-sharing","plugin_tags-freelance","plugin_tags-project-management","plugin_contributors-khaliddurani","plugin_committers-khaliddurani"],"banners":{"banner":"https:\/\/ps.w.org\/merchantkits-client-portal\/assets\/banner-772x250.png?rev=3643310","banner_2x":"https:\/\/ps.w.org\/merchantkits-client-portal\/assets\/banner-1544x500.png?rev=3643310","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/merchantkits-client-portal\/assets\/icon.svg?rev=3643364","icon":"https:\/\/ps.w.org\/merchantkits-client-portal\/assets\/icon.svg?rev=3643364","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/merchantkits-client-portal\/assets\/screenshot-1.png?rev=3643310","caption":"The admin dashboard, with client and project stats, pending actions, and a colour-coded activity feed."},{"src":"https:\/\/ps.w.org\/merchantkits-client-portal\/assets\/screenshot-2.png?rev=3643310","caption":"The client list, showing portal links, project counts, and last sign-in."},{"src":"https:\/\/ps.w.org\/merchantkits-client-portal\/assets\/screenshot-3.png?rev=3643310","caption":"The project editor, with inline drag-and-drop milestones and auto-calculated progress."},{"src":"https:\/\/ps.w.org\/merchantkits-client-portal\/assets\/screenshot-4.png?rev=3643310","caption":"The client-facing portal dashboard, branded with your logo and colour."},{"src":"https:\/\/ps.w.org\/merchantkits-client-portal\/assets\/screenshot-5.png?rev=3643310","caption":"A project in the portal: milestone timeline, files, messages, and approvals."},{"src":"https:\/\/ps.w.org\/merchantkits-client-portal\/assets\/screenshot-6.png?rev=3643310","caption":"The approval workflow \u2014 a client approving a deliverable or requesting a revision with a note."},{"src":"https:\/\/ps.w.org\/merchantkits-client-portal\/assets\/screenshot-7.png?rev=3643310","caption":"The client portal sign-in page."},{"src":"https:\/\/ps.w.org\/merchantkits-client-portal\/assets\/screenshot-8.png?rev=3643310","caption":"The settings screen, showing the General tab."}],"raw_content":"<!--section=description-->\n<p>Stop losing client work in email threads and shared drive links. MerchantKits Client Portal gives every client their own password-protected page on your site, where they can follow project progress, download deliverables, upload their own files, message you, and sign off on work.<\/p>\n\n<p>Your clients do <strong>not<\/strong> need WordPress accounts. They sign in with an email address and a password you set, using a portal session that is completely separate from WordPress logins.<\/p>\n\n<h4>Built for freelancers and small agencies<\/h4>\n\n<ul>\n<li><strong>A portal per client.<\/strong> Each client gets a URL like <code>yoursite.com\/client-portal\/acme-corp\/<\/code>, branded with your logo and colour \u2014 not your theme, and with no WordPress admin bar in sight.<\/li>\n<li><strong>Projects with milestones.<\/strong> Break work into milestones, drag to reorder them, and let progress calculate itself as you move each one forward.<\/li>\n<li><strong>Secure file sharing.<\/strong> Files are stored outside the publicly served uploads tree, with randomised filenames and downloads served through an authenticated PHP handler. Direct URL access is blocked.<\/li>\n<li><strong>Deliverable approvals.<\/strong> Mark a file \"requires approval\" and your client gets Approve and Request Revision buttons. Revision requests require a note, so you always know what to change.<\/li>\n<li><strong>Message threads per project.<\/strong> Async, comment-style messaging with unread counts in your admin menu \u2014 no live chat to keep up with.<\/li>\n<li><strong>Activity log.<\/strong> Every upload, download, message, milestone change, and approval is recorded. You see everything; each client sees only their own.<\/li>\n<li><strong>Email notifications.<\/strong> Eight notification types, each individually switchable, sent as clean branded HTML with a plain-text alternative.<\/li>\n<li><strong>Embed anywhere.<\/strong> Prefer the portal inside your existing site design? Drop the <code>[mkcp_portal]<\/code> shortcode on any page and it inherits your theme.<\/li>\n<\/ul>\n\n<h4>Everything is included<\/h4>\n\n<ul>\n<li>Unlimited clients, projects, milestones, files, and messages<\/li>\n<li>The full portal, approval workflow, and activity log<\/li>\n<li>All email notifications<\/li>\n<li>CSV export for clients, projects, files, and activity<\/li>\n<li>Full REST API<\/li>\n<\/ul>\n\n<p>There are no locked features, no client caps, and no upsell prompts blocking your\nwork. Everything described on this page is in the plugin you download.<\/p>\n\n<p>The plugin makes no external requests. All of your data stays in your own\nWordPress database and on your own server.<\/p>\n\n<h4>Part of the MerchantKits suite<\/h4>\n\n<ul>\n<li><strong>MerchantKits Document Signatures<\/strong> \u2014 collect legally binding e-signatures on documents.<\/li>\n<li><strong>MerchantKits Attendance Manager<\/strong> \u2014 track employee attendance, shifts, and leave.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin files to <code>\/wp-content\/plugins\/merchantkits-client-portal\/<\/code>, or install it through the Plugins screen in WordPress.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> screen.<\/li>\n<li>Go to <strong>Client Portal \u2192 Settings<\/strong> and set your company name, logo, and brand colour.<\/li>\n<li>Go to <strong>Client Portal \u2192 Clients<\/strong> and add your first client. A portal slug and password are generated automatically.<\/li>\n<li>Tick \"Email the client their portal link and password\" when you save, and they are ready to sign in.<\/li>\n<\/ol>\n\n<p>If portal URLs return a 404 straight after activation, visit <strong>Settings \u2192 Permalinks<\/strong> once. That refreshes WordPress's rewrite rules \u2014 you do not need to change anything on that screen.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20my%20clients%20need%20wordpress%20accounts%3F\"><h3>Do my clients need WordPress accounts?<\/h3><\/dt>\n<dd><p>No. Clients sign in with an email address and password stored by this plugin, using a separate portal session. They never touch wp-admin and never appear in your Users list. If you <em>want<\/em> to link a client to an existing WordPress user, there is an optional field for that on the client form.<\/p><\/dd>\n<dt id=\"where%20are%20uploaded%20files%20stored%3F\"><h3>Where are uploaded files stored?<\/h3><\/dt>\n<dd><p>In <code>wp-content\/uploads\/mkcp\/{client-slug}\/{project-id}\/<\/code>, with randomised filenames. That directory ships with <code>.htaccess<\/code> and <code>web.config<\/code> rules denying direct web access, and every download runs through a PHP handler that verifies your portal session first. The original filename is preserved in the database and restored when the file is downloaded.<\/p><\/dd>\n<dt id=\"is%20there%20a%20limit%20on%20how%20many%20clients%20i%20can%20add%3F\"><h3>Is there a limit on how many clients I can add?<\/h3><\/dt>\n<dd><p>No. Add as many clients and projects as you like. Client statuses (Active, Inactive, Archived) exist purely to keep your list tidy \u2014 archiving a client keeps all of their data and they can be reactivated at any time.<\/p><\/dd>\n<dt id=\"can%20a%20client%20see%20another%20client%27s%20files%3F\"><h3>Can a client see another client's files?<\/h3><\/dt>\n<dd><p>No. Every query is scoped to the signed-in client, and project, file, and message lookups re-check ownership before rendering. Changing an ID in the URL returns \"not found\", not someone else's data.<\/p><\/dd>\n<dt id=\"is%20the%20portal%20mobile%20friendly%3F\"><h3>Is the portal mobile friendly?<\/h3><\/dt>\n<dd><p>Yes. The sidebar collapses to a hamburger menu on small screens and the layout switches to a single column. Clients can upload files and approve deliverables from a phone.<\/p><\/dd>\n<dt id=\"can%20i%20use%20my%20theme%27s%20design%20instead%20of%20the%20standalone%20portal%20page%3F\"><h3>Can I use my theme's design instead of the standalone portal page?<\/h3><\/dt>\n<dd><p>Yes \u2014 put the <code>[mkcp_portal]<\/code> shortcode on any page. The portal then renders inside your theme with its header, footer, and styles. Both options work at the same time; use whichever suits each client.<\/p><\/dd>\n<dt id=\"can%20i%20customise%20the%20portal%20templates%20and%20emails%3F\"><h3>Can I customise the portal templates and emails?<\/h3><\/dt>\n<dd><p>Yes. Copy any template from the plugin's <code>templates\/<\/code> directory into <code>your-theme\/mkcp\/<\/code> and edit it there \u2014 for example <code>your-theme\/mkcp\/email\/client-welcome.php<\/code>. Your copy takes precedence and survives plugin updates. There are also filters for branding, navigation items, allowed file types, email subjects and content, and more.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20my%20data%20if%20i%20delete%20the%20plugin%3F\"><h3>What happens to my data if I delete the plugin?<\/h3><\/dt>\n<dd><p>Nothing is removed unless you ask for it. Under <strong>Settings \u2192 Advanced<\/strong> there are two separate opt-ins: one to delete database records and one to delete uploaded files. Both are off by default, so deleting the plugin leaves your data intact for a reinstall.<\/p><\/dd>\n<dt id=\"i%20forgot%20a%20client%27s%20password.%20can%20i%20look%20it%20up%3F\"><h3>I forgot a client's password. Can I look it up?<\/h3><\/dt>\n<dd><p>No, and that is deliberate \u2014 passwords are stored hashed with WordPress's own hashing, so nobody can read them back, including you. Use the \"Send credentials\" row action to generate a fresh password and email it, or point the client at the \"Forgot password\" link on their sign-in page.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20work%20on%20multisite%3F\"><h3>Does the plugin work on multisite?<\/h3><\/dt>\n<dd><p>Yes. Each site in the network keeps its own clients, projects, and files.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Client management with auto-generated portal slugs and passwords.<\/li>\n<li>Projects with milestones, drag-and-drop reordering, and progress calculated from milestone status.<\/li>\n<li>Secure file sharing with private storage, randomised filenames, and authenticated downloads.<\/li>\n<li>Deliverable approval workflow with mandatory revision notes.<\/li>\n<li>Per-project message threads with unread counts.<\/li>\n<li>Standalone branded client portal with custom cookie authentication, rate-limited sign-in, and password reset.<\/li>\n<li><code>[mkcp_portal]<\/code> shortcode for embedding the portal in your theme.<\/li>\n<li>Activity log across the admin dashboard, project screens, and client portal.<\/li>\n<li>Eight email notification types, all individually switchable and theme-overridable.<\/li>\n<li>Full REST API under the <code>mkcp\/v1<\/code> namespace.<\/li>\n<li>CSV export for clients, projects, files, and activity.<\/li>\n<\/ul>","raw_excerpt":"Give each client a branded portal with file sharing, project milestones, message threads, and deliverable approvals.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/350935","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=350935"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/khaliddurani"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=350935"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=350935"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=350935"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=350935"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=350935"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=350935"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}