Documentation
Everything you need to set up, configure, and use DS Client Portal. From installation to advanced customization.
Installation
- Install the plugin — Search for “DS Client Portal” in Plugins → Add New, or upload the
.zipfile via Upload Plugin. Click Install Now. - Activate — Click Activate Plugin. The plugin will create the necessary database tables, file directories, and user roles automatically.
- Configure your settings — Upload your logo, pick an accent color, and customize your portal from the Settings page.
- 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:
- 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.
- Create a task — Go to Client Portal → Tasks and click Add New. Assign it to your client, set a status, and add a description.
- 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
- Go to Client Portal → Clients and click Add New.
- Enter their full name and email address.
- Optionally add a company name.
- 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
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
- Go to Client Portal → Invoices → Add New.
- Select a client from the dropdown.
- Add line items with description, quantity, and rate. You can also link existing tasks as line items.
- Set the issue date. The due date auto-calculates based on your payment terms (configurable in Invoice Settings).
- Add optional notes for the client.
- 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
| Setting | Default |
|---|---|
| Max file size | 10 MB per file |
| Allowed types | Images, 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
- 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:
| Tab | What’s There | Availability |
|---|---|---|
| General | Logo, accent color | Free |
| Portal | Portal URL slug, homepage redirect | Free |
| Customization | Welcome text, instructions, footer text with shortcodes. Login page text and powered-by toggle are pro-only. | Free + Pro |
| Basic notifications (welcome, OTP) in free. Task ready, comments, and invoice notifications in pro. | Free + Pro | |
| Invoice | Number prefix, payment terms, company info, footer, currency format | Pro |
| Integrations | Webhook URL, secret key, event selection, delivery log | Pro |
| License | License key activation and management | Pro |
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.
| Trigger | Recipient | |
|---|---|---|
| Welcome | Client role assigned | Client |
| OTP Login Code | Client requests login | Client |
| Task Ready for Review | Status changed to On Review | Client |
| New Comment | Comment posted on task | Admin or Client (opposite party) |
| Invoice Sent | Invoice status set to Sent | Client |
| Invoice Overdue | Invoice 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.
| Setting | Default | Description |
|---|---|---|
| Number Prefix | INV- | Prefix before invoice numbers (e.g., INV-001) |
| Start Number | 1 | First invoice number in sequence |
| Payment Terms | Net 30 | Due on Receipt (Net 7), Net 15, Net 30, Net 60, Net 90, or Custom |
| Currency Prefix | $ | Symbol displayed before amounts (e.g., $, €, £) |
| Currency Suffix | Empty | Symbol 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 Decimals | 2 | Decimal places shown in amounts |
| Company Info | Empty | Your company details shown on invoices |
| Invoice Footer | Empty | Footer 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
| Slug | Portal URL |
|---|---|
portal | yoursite.com/portal/ |
client | yoursite.com/client/ |
my-account | yoursite.com/my-account/ |
dashboard | yoursite.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
| Status | Meaning | Who Sets It |
|---|---|---|
| Request | New client submission, awaiting admin review | Client (auto on submit) |
| To Do | Approved and queued for work | Admin |
| In Progress | Actively being worked on | Admin |
| On Review | Work done, waiting for client approval | Admin |
| Completed | Approved and finished | Client (via Approve) or Admin |
Invoice Statuses Reference
| Status | Meaning | How It’s Set |
|---|---|---|
| Draft | Created but not yet sent to client | Admin (default on creation) |
| Sent | Sent to client, awaiting payment | Admin (triggers email notification) |
| Paid | Payment received | Admin |
| Overdue | Past due date, still unpaid | Automatic (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
| Requirement | Minimum |
|---|---|
| WordPress | 6.0+ |
| PHP | 7.4+ |
| Theme | Any (portal uses its own templates) |
| Server | Apache, Nginx, LiteSpeed, or IIS |
| Server 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.
| Hook | Type | Description |
|---|---|---|
dscp_portal_requires_auth | Filter | Return false to make the portal publicly accessible without login. |
dscp_portal_page_auth_excluded | Filter | Array of portal page slugs that skip authentication. |
dscp_is_user_authenticated | Filter | Final override of the authentication check result. |
dscp_otp_bypass | Filter | Return true to skip OTP verification and auto-login a user. |
dscp_otp_rate_limit | Filter | Override the maximum OTP attempts allowed (default: 3 per 15 min). |
dscp_otp_expiry | Filter | Override OTP time-to-live in seconds. |
dscp_otp_login_redirect | Filter | Override the redirect URL after successful OTP login. |
dscp_after_otp_login | Action | Fires 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
| Hook | Type | Description |
|---|---|---|
dscp_task_created | Action | Fires after a new task is inserted into the database. |
dscp_task_status_changed | Action | Fires after any task status change. Receives old and new status. |
dscp_task_approved | Action | Fires when a client approves a task from the portal. |
dscp_task_meta_saved | Action | Fires after admin saves task meta fields. |
dscp_task_statuses | Filter | Add or modify the available task statuses array. |
dscp_task_initial_status | Filter | Override the default status assigned to new client requests. |
Invoice Lifecycle
| Hook | Type | Description |
|---|---|---|
dscp_invoice_status_changed | Action | Fires after any invoice status change. |
dscp_invoice_paid | Action | Fires specifically when an invoice is marked as paid. |
dscp_invoice_meta_saved | Action | Fires after admin saves invoice meta fields. |
dscp_invoice_total | Filter | Modify the invoice total (e.g. add tax or discounts). |
dscp_invoice_statuses | Filter | Add or modify the available invoice statuses array. |
dscp_invoice_line_items | Filter | Modify 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
| Hook | Type | Description |
|---|---|---|
dscp_file_uploaded | Action | Fires after a file is stored and its database record created. |
dscp_before_file_delete | Action | Fires before a file is physically deleted from disk. |
dscp_file_max_size | Filter | Override the maximum upload size in bytes (default: 10 MB). |
dscp_file_allowed_types | Filter | Override the array of allowed MIME types. |
dscp_file_upload_dir | Filter | Override the file storage directory path. |
dscp_file_download_headers | Filter | Modify HTTP headers sent during file download. |
Email Notifications
| Hook | Type | Description |
|---|---|---|
dscp_email_template | Filter | Override the shared HTML email wrapper template. |
dscp_email_headers | Filter | Modify email From, CC, or BCC headers. |
dscp_should_send_notification | Filter | Return false to suppress a specific notification. |
dscp_notify_{type}_subject | Filter | Modify the email subject for a given notification type. |
dscp_notify_{type}_body | Filter | Modify 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
| Hook | Type | Description |
|---|---|---|
dscp_portal_template_path | Filter | Override the template file path for a portal page. |
dscp_portal_nav_links | Filter | Add or remove navigation items in the portal sidebar. |
dscp_portal_head | Action | Inject content into the portal <head> section. |
dscp_portal_after_header | Action | Inject content below the portal navigation bar. |
dscp_portal_before_footer | Action | Inject content above the portal footer. |
dscp_portal_new_task_fields | Action | Add custom fields to the new task/request form. |
dscp_portal_profile_fields | Action | Add custom fields to the client profile page. |
dscp_portal_login_before_form | Action | Inject 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
| Hook | Type | Description |
|---|---|---|
dscp_settings_tabs | Filter | Add custom tabs to the settings page. |
dscp_save_settings | Action | Fires when settings are saved — use to persist custom fields. |
dscp_portal_slug | Filter | Override the portal page slug programmatically. |
Access Control
| Hook | Type | Description |
|---|---|---|
dscp_user_can_access_task | Filter | Override whether a user can view a specific task. |
dscp_user_can_access_invoice | Filter | Override whether a user can view a specific invoice. |
dscp_user_can_access_file | Filter | Override whether a user can download a specific file. |
dscp_format_price | Filter | Modify 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.
| Shortcode | Output | Where to Use |
|---|---|---|
[dscp_year] | Current year (e.g. 2026) | Footer text, login page text |
[dscp_site_title] | Your WordPress site name | Footer text, login page text |
[dscp_client_name] | Logged-in client’s display name | Welcome 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
- Go to Client Portal → Settings → Integrations tab.
- 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).
- 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.
- Check the events you want to fire. Only checked events send HTTP requests.
- Click Save Settings.
- Use the Test Webhook button to send a sample payload and confirm your endpoint responds with a
200status.
Available Webhook Events
| Event | Fires When | Example Use Case |
|---|---|---|
task.created | Client submits a new request from the portal | Notify your team in Slack |
task.status_changed | Any task status transition (admin or portal) | Update a Google Sheets tracker |
task.approved | Client approves a task marked for review | Log completed deliverables |
task.comment_added | New comment posted on a task | Push notification to your phone |
invoice.status_changed | Any invoice status transition | Trigger overdue reminders via SMS |
invoice.paid | Invoice is marked as paid | Create a QuickBooks entry |
file.uploaded | File is uploaded to a task or comment | Backup to Google Drive or S3 |
file.deleted | File is deleted from a task | Audit log of removed files |
client.login | Client logs in via OTP | Track 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 DevelopmentPassword & Credentials Vault
ProSecurely 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
ProGenerate branded PDF reports of project activity — task summaries, time logs, invoice history — on a weekly or monthly schedule. Automatically emailed to clients.
Planned
ConfirmedRecurring Tasks
FreeCreate tasks that automatically repeat on a schedule — daily, weekly, monthly, or custom. Perfect for retainer clients with ongoing deliverables.
Stripe & PayPal Payments
ProLet 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
FreePublish help articles, guides, and FAQs visible to clients inside the portal. Reduce repetitive support questions with self-service documentation.
Exploring
ResearchingTask Templates
FreeSave reusable task templates with pre-filled titles, descriptions, and checklists. Speed up task creation for common request types.
Client Teams & Permissions
ProGroup multiple contacts under one client account. Assign roles (viewer, editor, admin) so teams can collaborate within the portal.
Multi-Language Support
FreeFull 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 filepost_max_size— Maximum size of POST datamax_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.