v1.0.0

Documentation

Everything you need to set up, configure, and use DS Client Portal. From installation to advanced customization.

Installation

  1. Install the plugin — Search for “DS Client Portal” in Plugins → Add New, or upload the .zip file via Upload Plugin. Click Install Now.
  2. Activate — Click Activate Plugin. The plugin will create the necessary database tables, file directories, and user roles automatically.
  3. Configure your settings — Upload your logo, pick an accent color, and customize your portal from the Settings page.
  4. Activate Pro (optional) — If you purchased a Pro license, go to Client Portal → Settings → License tab. Paste your license key and click Activate to unlock invoicing, webhooks, and advanced customization.

Requirements: WordPress 6.0 or higher, PHP 7.4 or higher. Works with any theme.

Quick Start Guide

Get your portal up and running in under 5 minutes:

  1. Add your first client — Go to Client Portal → Clients and click Add New. Enter their name and email. No password needed — they’ll use OTP login.
  2. Create a task — Go to Client Portal → Tasks and click Add New. Assign it to your client, set a status, and add a description.
  3. Share the portal link — Send your client the portal URL: yoursite.com/portal/. They enter their email, receive a login code, and see their tasks immediately.

Tip: Clients can also create their own requests from the portal. New requests appear in your admin with a “Request” status for you to review.

Managing Clients

Clients are WordPress users with the Portal Client role. They can only access the portal — they never see WordPress admin.

Adding a Client

  1. Go to Client Portal → Clients and click Add New.
  2. Enter their full name and email address.
  3. Optionally add a company name.
  4. Click Save. A welcome email is sent automatically with their portal login link.

No passwords needed. Clients log in with a one-time code sent to their email. You don’t manage passwords at all.

Client Isolation

Each client can only see their own data. They cannot access other clients’ tasks, files, or invoices. This is enforced at every level — database queries, template rendering, and file downloads.

Managing Tasks

Tasks are the core of your client communication. Use them for requests, deliverables, revisions — anything you’d otherwise handle over email.

Creating a Task

Go to Client Portal → Tasks → Add New. Fill in:

  • Title — A clear name for the task
  • Description — Details, requirements, or context (rich text supported)
  • Client — Assign to a specific client
  • Status — Set the current stage (see Task Statuses)
  • Due Date — Optional deadline
  • Assignee — Assign a team member from your admin users
  • Project — Group tasks under a project name
  • Files — Attach reference files directly to the task

Time Tracking

Log hours spent on each task from the task detail screen. Time entries are visible to the client on their task detail view, providing transparency on work performed.

Task Lifecycle

Request To Do In Progress On Review Completed

Comments & Discussion

Each task has a comment thread visible to both you and the client. Comments support rich formatting (bold, italic, links, lists) and file attachments. Comments are single-level — no nested replies — for simplicity.

When you post a comment, the client gets an email notification (and vice versa).

Client Approval

When a task reaches “On Review” status, the client sees an Approve button in their portal. Clicking it moves the task to “Completed” automatically.

Activity Log

The system automatically logs key events in each task’s comment thread:

  • Task submitted — When a client submits a new request
  • Status changes — When an admin or client changes the task status
  • Client approval — When the client approves work on review

Activity entries appear inline with regular comments, marked with a “System” label to distinguish them from user comments.

Billing Status

Completed tasks can show a billing status (Billed or Paid) when linked to an invoice. This is managed automatically based on the linked invoice’s status.

Managing Invoices Pro

Create and track invoices directly from WordPress admin. Clients view them in the portal.

Creating an Invoice

  1. Go to Client Portal → Invoices → Add New.
  2. Select a client from the dropdown.
  3. Add line items with description, quantity, and rate. You can also link existing tasks as line items.
  4. Set the issue date. The due date auto-calculates based on your payment terms (configurable in Invoice Settings).
  5. Add optional notes for the client.
  6. Set status to Sent to notify the client by email.

Invoice Numbering

Invoices are auto-numbered with a configurable prefix. Default format: INV-001, INV-002, etc. Change the prefix and starting number in Invoice Settings.

Invoice-Task Linking

When adding line items to an invoice, you can link existing tasks directly. Linked tasks automatically update their billing status based on the invoice — showing Billed when the invoice is sent and Paid when marked as paid.

PDF Download

Clients can download any invoice as a professionally formatted PDF directly from the portal. The PDF includes your logo, company information, line items with amounts, and the footer text configured in Invoice Settings.

PDF generation uses the mPDF library bundled with the plugin. If mPDF is unavailable, the plugin falls back to browser print functionality.

Overdue Detection

A daily background process checks for invoices past their due date. Unpaid invoices are automatically marked Overdue and the client receives an email reminder.

Managing Files

Files can be uploaded to tasks (by you or the client) and attached to comments. All files are stored securely.

Where Files Are Stored

Files are stored in a private directory outside the standard uploads folder. This means they aren’t publicly accessible or indexed by search engines. Direct access is blocked by server rules.

Upload Limits

SettingDefault
Max file size10 MB per file
Allowed typesImages, PDFs, documents, spreadsheets, archives, and more (WordPress defaults)
Blocked types.php, .exe, .sh, .bat, .js, and other executable formats

Downloading Files

All downloads go through a secure endpoint that verifies the user has permission to access the file. Clients can only download files from their own tasks.

Dashboard & Analytics

The admin dashboard at Client Portal → Dashboard gives you an overview of your portal activity.

KPI Cards

Total Tasks

All tasks across statuses with month-over-month trend.

Overdue Tasks

Tasks past their due date that need attention.

Revenue This Month

Total invoiced amount for the current month.

Outstanding Amount

Unpaid invoices (sent + overdue) requiring follow-up.

Charts

Two visual charts help you spot trends at a glance:

  • Tasks Overview — Doughnut chart showing task distribution by status.
  • Revenue Breakdown — Bar chart comparing paid, unpaid, and overdue amounts.

Action Required

A quick list of items needing your attention: overdue tasks and tasks awaiting your review.

Client Login (OTP)

DS Client Portal uses passwordless authentication. Clients never need to create or remember a password.

How It Works

Enter email Receive 6-digit code Enter code Logged in
  • Codes expire after 15 minutes.
  • Each code is single-use — it’s deleted after successful login.
  • Rate limited to 3 requests per 15 minutes per email to prevent abuse.

Email delivery matters. OTP codes are sent via your server’s email system. Make sure your site can send emails reliably. We recommend using an SMTP plugin like WP Mail SMTP for production sites.

Client Portal: Tasks & Requests

The tasks page is the main dashboard your clients see after logging in. Tasks are grouped by status for easy scanning.

Viewing Tasks

Clients see their tasks organized into status groups. Each task card shows the title, ID number, date, current status, and assigned team member (with avatar). Click any task to view its full details, comments, and files.

Search & Filtering

Clients can quickly find tasks using:

  • Live search — A search bar that filters tasks by title as you type
  • Project filter — A dropdown to filter tasks by project name (visible when multiple projects exist)

Notification Badges

Navigation links in the portal sidebar show unread count badges for tasks and invoices. This helps clients quickly see when new activity requires their attention.

Creating a Request

Clients click the Add Request button to submit a new task. They can:

  • Enter a title and description (rich text editor with bold, italic, lists, links)
  • Attach files to the request
  • Submit for your review

New requests appear in your admin with a Request status.

Approving Work

When you set a task to On Review, the client sees an Approve button. Clicking it marks the task as completed.

Client Portal: Files

The Files page shows all files across all of the client’s tasks in one place. Files can be filtered by type:

  • All — Every file
  • PDF — PDF documents
  • Images — JPG, PNG, GIF, SVG
  • Documents — Word, Excel, PowerPoint
  • Other — Everything else

Each file shows its name, size, which task it belongs to, and the upload date. Clients can download or delete their own uploaded files.

File Preview

Clients can preview files directly in the portal without downloading. Click any file to open an in-page modal preview that supports:

  • Images — JPG, PNG, GIF, SVG displayed at full size
  • PDFs — Rendered inline with page navigation
  • Text files — Plain text and code files displayed with formatting

Drag-and-Drop Upload

The Add Request form includes a drag-and-drop file upload zone. Clients can drag files from their computer directly onto the drop area, or click to browse. Multiple files can be attached to a single request.

Client Portal: Invoices Pro

Clients can view all their invoices, filtered by status: All, Sent, Paid, or Overdue. Each invoice shows the invoice number, amount, dates, and current status.

Clicking an invoice shows the full detail view with line items, totals, and any notes you’ve added. A Download PDF button is available on each invoice detail page, allowing clients to save a professionally formatted PDF copy for their records.

Client Portal: Profile

Clients can update their profile from the portal:

  • Avatar — Upload a profile photo
  • Full name — Update their display name
  • Email — Displayed but cannot be changed (for security)
  • Notification preferences — Toggle emails for task updates, new comments, and invoice alerts

Settings Overview

All plugin settings are at Client Portal → Settings. Settings are organized into tabs:

TabWhat’s ThereAvailability
GeneralLogo, accent colorFree
PortalPortal URL slug, homepage redirectFree
CustomizationWelcome text, instructions, footer text with shortcodes. Login page text and powered-by toggle are pro-only.Free + Pro
EmailBasic notifications (welcome, OTP) in free. Task ready, comments, and invoice notifications in pro.Free + Pro
InvoiceNumber prefix, payment terms, company info, footer, currency formatPro
IntegrationsWebhook URL, secret key, event selection, delivery logPro
LicenseLicense key activation and managementPro

Branding & Customization

Logo

Upload your logo in Settings → General. It appears in the portal header, the login page, and all email notifications. Recommended size: 200×50px or similar horizontal format.

Accent Color

Pick a color in Settings → General. This color is used for buttons, status badges, links, and email call-to-action buttons throughout the portal.

Welcome Message

In Settings → Customization, set a welcome heading and note displayed on the client’s tasks page. Use the placeholder [dscp_client_name] in the heading to show the client’s name. Example: “Welcome back, [dscp_client_name]”.

Client Instructions

Write a help guide in Settings → Customization. This appears as a help modal accessible from the portal. If left empty, the help button is hidden. Supports rich text.

Footer

Customize the portal footer text in Settings → Customization. Use the shortcodes [dscp_year] for the current year and [dscp_site_title] for the site name. Default: © [dscp_year] [dscp_site_title].

Pro only: The “Powered by DS Client Portal” toggle and Login Page Text field are only available in the pro version. In the free version, the powered-by badge is always shown and the login page text field is hidden.

Email Notifications

The plugin sends HTML emails automatically. Toggle each type in Settings → Email.

EmailTriggerRecipient
WelcomeClient role assignedClient
OTP Login CodeClient requests loginClient
Task Ready for ReviewStatus changed to On ReviewClient
New CommentComment posted on taskAdmin or Client (opposite party)
Invoice SentInvoice status set to SentClient
Invoice OverdueInvoice past due date (daily check)Client

All emails use your logo and accent color. Clients can override their notification preferences from their portal profile.

Recommended: Use an SMTP plugin (like WP Mail SMTP) to ensure reliable email delivery. Default WordPress email can be unreliable on some hosts.

Invoice Settings Pro

Configure invoice defaults in Settings → Invoice.

SettingDefaultDescription
Number PrefixINV-Prefix before invoice numbers (e.g., INV-001)
Start Number1First invoice number in sequence
Payment TermsNet 30Due on Receipt (Net 7), Net 15, Net 30, Net 60, Net 90, or Custom
Currency Prefix$Symbol displayed before amounts (e.g., $, €, £)
Currency SuffixEmptySymbol displayed after amounts (e.g., EUR, USD)
Thousand Separator,Character between thousands (e.g., 1,000)
Decimal Separator.Character for decimals (e.g., 100.00)
Number of Decimals2Decimal places shown in amounts
Company InfoEmptyYour company details shown on invoices
Invoice FooterEmptyFooter text on invoices (payment instructions, etc.)

Portal URL

By default, the portal is accessible at yoursite.com/portal/. You can change this in Settings → Portal.

Examples

SlugPortal URL
portalyoursite.com/portal/
clientyoursite.com/client/
my-accountyoursite.com/my-account/
dashboardyoursite.com/dashboard/

After changing the slug, go to Settings → Permalinks and click Save Changes to flush rewrite rules. Otherwise the new URL won’t work.

Task Statuses Reference

StatusMeaningWho Sets It
RequestNew client submission, awaiting admin reviewClient (auto on submit)
To DoApproved and queued for workAdmin
In ProgressActively being worked onAdmin
On ReviewWork done, waiting for client approvalAdmin
CompletedApproved and finishedClient (via Approve) or Admin

Invoice Statuses Reference

StatusMeaningHow It’s Set
DraftCreated but not yet sent to clientAdmin (default on creation)
SentSent to client, awaiting paymentAdmin (triggers email notification)
PaidPayment receivedAdmin
OverduePast due date, still unpaidAutomatic (daily cron check)

Security

DS Client Portal is built with security as a priority.

Client Isolation

Every data access checks the user’s permissions. Clients see only their own tasks, files, and invoices.

Secure File Storage

Files stored outside public directories with multi-layer server protection. Secure download scripts verify permissions on every request. Works on all major servers.

Input Sanitization

All user input is sanitized and escaped. Nonce verification on every form and AJAX request. Prepared SQL statements for all queries.

OTP Rate Limiting

Login code requests limited to 3 per 15 minutes per email address. Codes are single-use and expire after 15 minutes.

Blocked File Types

The following file extensions are always blocked from upload, regardless of other settings:

.php .php3 .php4 .php5 .phtml .exe .sh .bat .cmd .com .pif .scr .vbs .js .jar

Requirements

RequirementMinimum
WordPress6.0+
PHP7.4+
ThemeAny (portal uses its own templates)
ServerApache, Nginx, LiteSpeed, or IIS
EmailServer must be able to send emails (SMTP plugin recommended)

No build tools needed. DS Client Portal uses standard WordPress architecture — PHP templates, custom post types, and simple CSS/JS. No React, no npm, no webpack.

Developer Hooks Pro

DS Client Portal provides actions and filters that let developers customize and extend plugin behavior. All hooks use the dscp_ prefix.

Portal Access & Authentication

These hooks control who can access the portal and how authentication works. Use them to create public portals, demo environments, or integrate with external auth systems.

HookTypeDescription
dscp_portal_requires_authFilterReturn false to make the portal publicly accessible without login.
dscp_portal_page_auth_excludedFilterArray of portal page slugs that skip authentication.
dscp_is_user_authenticatedFilterFinal override of the authentication check result.
dscp_otp_bypassFilterReturn true to skip OTP verification and auto-login a user.
dscp_otp_rate_limitFilterOverride the maximum OTP attempts allowed (default: 3 per 15 min).
dscp_otp_expiryFilterOverride OTP time-to-live in seconds.
dscp_otp_login_redirectFilterOverride the redirect URL after successful OTP login.
dscp_after_otp_loginActionFires after a user successfully logs in via OTP.

Public/Demo Portal (bypass all auth):

// Make the entire portal publicly accessible (no login required)
add_filter( 'dscp_portal_requires_auth', '__return_false' );

Demo Mode (read-only with auto-login):

// Enable demo mode: auto-login as demo user, block all writes
add_filter( 'dscp_demo_mode', '__return_true' );

Bypass OTP for a specific email:

add_filter( 'dscp_otp_bypass', function( $bypass, $email, $user ) {
    if ( $email === 'demo@example.com' ) {
        return true;
    }
    return $bypass;
}, 10, 3 );

Task Lifecycle

HookTypeDescription
dscp_task_createdActionFires after a new task is inserted into the database.
dscp_task_status_changedActionFires after any task status change. Receives old and new status.
dscp_task_approvedActionFires when a client approves a task from the portal.
dscp_task_meta_savedActionFires after admin saves task meta fields.
dscp_task_statusesFilterAdd or modify the available task statuses array.
dscp_task_initial_statusFilterOverride the default status assigned to new client requests.

Invoice Lifecycle

HookTypeDescription
dscp_invoice_status_changedActionFires after any invoice status change.
dscp_invoice_paidActionFires specifically when an invoice is marked as paid.
dscp_invoice_meta_savedActionFires after admin saves invoice meta fields.
dscp_invoice_totalFilterModify the invoice total (e.g. add tax or discounts).
dscp_invoice_statusesFilterAdd or modify the available invoice statuses array.
dscp_invoice_line_itemsFilterModify line items before they are saved.

Add tax to invoice totals:

add_filter( 'dscp_invoice_total', function( $total, $items, $post_id ) {
    $tax_rate = 0.10; // 10% tax
    return $total * ( 1 + $tax_rate );
}, 10, 3 );

File Handling

HookTypeDescription
dscp_file_uploadedActionFires after a file is stored and its database record created.
dscp_before_file_deleteActionFires before a file is physically deleted from disk.
dscp_file_max_sizeFilterOverride the maximum upload size in bytes (default: 10 MB).
dscp_file_allowed_typesFilterOverride the array of allowed MIME types.
dscp_file_upload_dirFilterOverride the file storage directory path.
dscp_file_download_headersFilterModify HTTP headers sent during file download.

Email Notifications

HookTypeDescription
dscp_email_templateFilterOverride the shared HTML email wrapper template.
dscp_email_headersFilterModify email From, CC, or BCC headers.
dscp_should_send_notificationFilterReturn false to suppress a specific notification.
dscp_notify_{type}_subjectFilterModify the email subject for a given notification type.
dscp_notify_{type}_bodyFilterModify the email body for a given notification type.

Override email template:

add_filter( 'dscp_email_template', function( $html, $heading, $greeting, $body, $url, $btn_text ) {
    // Return your own HTML email template
    return $custom_html;
}, 10, 6 );

Portal Templates

HookTypeDescription
dscp_portal_template_pathFilterOverride the template file path for a portal page.
dscp_portal_nav_linksFilterAdd or remove navigation items in the portal sidebar.
dscp_portal_headActionInject content into the portal <head> section.
dscp_portal_after_headerActionInject content below the portal navigation bar.
dscp_portal_before_footerActionInject content above the portal footer.
dscp_portal_new_task_fieldsActionAdd custom fields to the new task/request form.
dscp_portal_profile_fieldsActionAdd custom fields to the client profile page.
dscp_portal_login_before_formActionInject content before the login form (e.g. SSO buttons).

Custom portal template from theme:

add_filter( 'dscp_portal_template_path', function( $path, $page ) {
    $custom = get_stylesheet_directory() . '/dscp/portal-' . $page . '.php';
    if ( file_exists( $custom ) ) {
        return $custom;
    }
    return $path;
}, 10, 2 );

Settings

HookTypeDescription
dscp_settings_tabsFilterAdd custom tabs to the settings page.
dscp_save_settingsActionFires when settings are saved — use to persist custom fields.
dscp_portal_slugFilterOverride the portal page slug programmatically.

Access Control

HookTypeDescription
dscp_user_can_access_taskFilterOverride whether a user can view a specific task.
dscp_user_can_access_invoiceFilterOverride whether a user can view a specific invoice.
dscp_user_can_access_fileFilterOverride whether a user can download a specific file.
dscp_format_priceFilterModify how prices are displayed (currency symbol, decimals).

Available Shortcodes

DS Client Portal provides shortcodes you can use in portal settings fields such as the footer text and welcome heading.

ShortcodeOutputWhere to Use
[dscp_year]Current year (e.g. 2026)Footer text, login page text
[dscp_site_title]Your WordPress site nameFooter text, login page text
[dscp_client_name]Logged-in client’s display nameWelcome heading only

Usage Examples

Footer text — In Settings → Customization → Footer:

© [dscp_year] [dscp_site_title]. All rights reserved.

Renders as: © 2026 DS Client Portal. All rights reserved.

Welcome heading — In Settings → Customization → Welcome Heading:

Welcome back, [dscp_client_name]

Renders as: Welcome back, Jane Smith

[dscp_year] and [dscp_site_title] are standard WordPress shortcodes processed via do_shortcode(). [dscp_client_name] is a template placeholder replaced at render time — it only works in the welcome heading field.

Integrations Pro

DS Client Portal connects to thousands of external apps through outgoing webhooks. Instead of building individual integrations for each service, the plugin provides a single webhook system that fires HTTP POST requests when portal events occur — compatible with Zapier, Make (Integromat), IFTTT, n8n, or any custom HTTP endpoint.

More integrations coming soon. Webhooks are the first of several planned integration features. Future versions will include native connectors for popular services, incoming webhooks for two-way sync, and a REST API for full external access. Stay tuned for updates.

Setting Up Webhooks

  1. Go to Client Portal → Settings → Integrations tab.
  2. Enter your Webhook URL — the destination for POST requests (e.g. a Zapier Webhooks catch hook URL, a Make webhook URL, or your own endpoint).
  3. A Secret Key is auto-generated on first save. This key signs every request with HMAC-SHA256 so your endpoint can verify payloads are authentic.
  4. Check the events you want to fire. Only checked events send HTTP requests.
  5. Click Save Settings.
  6. Use the Test Webhook button to send a sample payload and confirm your endpoint responds with a 200 status.

Available Webhook Events

EventFires WhenExample Use Case
task.createdClient submits a new request from the portalNotify your team in Slack
task.status_changedAny task status transition (admin or portal)Update a Google Sheets tracker
task.approvedClient approves a task marked for reviewLog completed deliverables
task.comment_addedNew comment posted on a taskPush notification to your phone
invoice.status_changedAny invoice status transitionTrigger overdue reminders via SMS
invoice.paidInvoice is marked as paidCreate a QuickBooks entry
file.uploadedFile is uploaded to a task or commentBackup to Google Drive or S3
file.deletedFile is deleted from a taskAudit log of removed files
client.loginClient logs in via OTPTrack client engagement

Payload Format

Every webhook sends a JSON payload with a consistent structure:

{
  "event": "task.created",
  "timestamp": "2025-01-15T14:30:00+00:00",
  "site_url": "https://yoursite.com",
  "data": {
    "task_id": 142,
    "title": "Update homepage banner",
    "status": "request",
    "client_id": 5,
    "client_name": "Jane Smith",
    "client_email": "jane@example.com"
  }
}

The data object varies by event — task events include task fields, invoice events include invoice fields, and so on. See llm/integrations.md for the complete payload reference for every event.

Security

Every request includes an X-DSCP-Signature header:

X-DSCP-Signature: sha256=a1b2c3d4e5f6...

Verify the signature on your endpoint by computing HMAC-SHA256 of the raw request body using your secret key and comparing it to the header value. This ensures the request came from your portal and hasn’t been tampered with.

Delivery & Retries

  • Webhooks are dispatched in the background via WordPress cron to avoid slowing down user actions.
  • Failed deliveries (non-2xx response or timeout) are retried up to 3 times with increasing delays: 5 minutes, 30 minutes, then 2 hours.
  • The Delivery Log at the bottom of the Integrations tab shows the last 10 delivery attempts with event type, HTTP status, and timestamp — useful for debugging without server access.

Reliable cron required. WordPress cron runs on page visits by default, which can delay webhook delivery on low-traffic sites. For real-time delivery, configure a system cron job to hit wp-cron.php every minute. Most managed WordPress hosts do this automatically.

Roadmap

Here’s what’s coming next for DS Client Portal. Features move through three stages: Exploring (researching feasibility), Planned (confirmed and designed), and Coming Soon (actively in development).

Coming Soon

In Development

Password & Credentials Vault

Pro

Securely share passwords, API keys, and credentials with clients through an encrypted vault. AES-256 encryption at rest, auto-expiring links, and one-click copy.

Automatic PDF Reports

Pro

Generate branded PDF reports of project activity — task summaries, time logs, invoice history — on a weekly or monthly schedule. Automatically emailed to clients.

Planned

Confirmed

Recurring Tasks

Free

Create tasks that automatically repeat on a schedule — daily, weekly, monthly, or custom. Perfect for retainer clients with ongoing deliverables.

Stripe & PayPal Payments

Pro

Let clients pay invoices directly from the portal. One-click checkout with Stripe or PayPal. Invoices auto-update to “Paid” on successful payment.

Client Knowledge Base

Free

Publish help articles, guides, and FAQs visible to clients inside the portal. Reduce repetitive support questions with self-service documentation.

Exploring

Researching

Task Templates

Free

Save reusable task templates with pre-filled titles, descriptions, and checklists. Speed up task creation for common request types.

Client Teams & Permissions

Pro

Group multiple contacts under one client account. Assign roles (viewer, editor, admin) so teams can collaborate within the portal.

Multi-Language Support

Free

Full i18n support with translation-ready strings. Serve different portal languages based on client locale or site language.

Have a feature request? We prioritize based on customer feedback. Reach out via the support portal or email us — your input directly shapes what we build next.

Troubleshooting & Common Issues

Solutions to the most common issues encountered when setting up and using DS Client Portal.

Email Delivery Issues

Problem: OTP codes, notifications, or invoice emails are not being received.

Solution: WordPress default wp_mail() relies on your server’s mail configuration, which is unreliable on many hosts. Install a dedicated SMTP plugin:

  • WP Mail SMTP — Most popular, free tier available
  • FluentSMTP — Free with no upsells
  • Post SMTP — Free with email logging

Also check your spam/junk folders and ensure SPF/DKIM DNS records are configured for your domain.

Portal Returns 404

Problem: Portal pages return a 404 Not Found error after installation or changing the portal slug.

Solution: Go to Settings → Permalinks in WordPress admin and click Save Changes. This flushes the rewrite rules. You don’t need to change any settings — just clicking Save is enough.

PDF Download Not Working

Problem: Invoice PDF download shows a blank page or error.

Solution: The plugin uses the mPDF library for PDF generation. Ensure vendor/autoload.php exists in the plugin directory. If it’s missing, re-upload the plugin ZIP file. If mPDF can’t render the PDF, the plugin automatically falls back to browser print.

File Upload Fails

Problem: Uploading files returns an error or times out.

Solution: Check your PHP upload limits in your hosting configuration. These values should be at least 10MB:

  • upload_max_filesize — Maximum size of an uploaded file
  • post_max_size — Maximum size of POST data
  • max_execution_time — Script timeout (increase for large files)

Contact your hosting provider to increase these if needed. The plugin enforces a 10MB per-file limit.

OTP Code Not Received

Problem: Client enters their email but never receives the login code.

Solution: This is typically the same root cause as general email delivery issues — install an SMTP plugin (see above). Also verify that the client’s email address is correct and the account exists in your system. Note: rate limiting allows a maximum of 3 OTP requests per 15 minutes per email address.

Quill Editor Not Loading

Problem: The rich text editor on the task detail or Add Request page shows as an empty div.

Solution: The Quill.js editor is loaded from CDN (cdn.quilljs.com). If your site blocks external scripts via Content Security Policy (CSP) headers or a security plugin, whitelist this domain. Check the browser console for JavaScript errors to confirm.