Client Collaboration Portal Guide
Last Updated: 2026-01-12 Status: Implemented Plan Reference: 036-client-collaboration-portal.md Enhancement Reference: 054-client-collaboration-enhancement.md, 090-client-collaboration-improvement.md
Overview
The Client Collaboration Portal transforms the client portal from a read-only view into an interactive collaboration platform. It provides document requests, deliverable approval workflows, progress tracking, milestone acceptance, file comments, and satisfaction surveys to enable seamless communication between administrators and clients.
Recent Enhancements (Plan 054)
- Document Request Templates: Create reusable templates for common document requests
- Multi-Stage Approval Workflows: Configure sequential or parallel approval stages with multiple approvers
- Enhanced Feedback System: File comments and project feedback now support types, status tracking, and priority levels
- Notification Preferences: Clients can configure their notification preferences for different collaboration events
Recent Enhancements (Plan 090)
- Unified CollaborationService: Centralized service for all collaboration features
- Collaboration Configuration: Configurable settings in
config/client-collaboration.php - Client/Project Summaries: Quick overview of collaboration status
- Pending Actions: Dashboard of pending collaboration items for users
Table of Contents
- Accessing Collaboration Features
- Document Requests
- Document Request Templates
- Deliverable Approvals
- Multi-Stage Approval Workflows
- File Comments & Feedback
- Progress Tracking
- Milestone Acceptance
- Client Satisfaction Surveys
- Client Uploads
- Notification Preferences
- Technical Architecture
- Related Features
Accessing Collaboration Features
Client Portal Navigation
| Feature | Location | URL |
|---|---|---|
| Document Requests | Portal sidebar | /portal/document-requests |
| Deliverables | Project page | /portal/projects/{id}/deliverables |
| Progress | Project page | /portal/projects/{id}/progress |
| Surveys | Portal menu | /portal/surveys/create |
| Uploads | Portal sidebar | /portal/uploads |
| Notification Preferences | Portal settings | /portal/settings/notifications |
Admin Navigation
| Feature | Location | URL |
|---|---|---|
| Document Requests | Admin sidebar | /admin/document-requests |
| Document Request Templates | Admin sidebar | /admin/document-request-templates |
| Approval Workflows | Admin sidebar | /admin/approval-workflows |
| Submit Deliverable | Project page | /admin/projects/{id}/deliverables |
| Update Progress | Project page | /admin/projects/{id}/progress |
| Satisfaction Reports | Admin sidebar | /admin/satisfaction |
Permissions
| Action | Admin | Client |
|---|---|---|
| Create document requests | ✅ | ❌ |
| Manage request templates | ✅ | ❌ |
| Submit documents | ❌ | ✅ |
| Approve/reject documents | ✅ | ❌ |
| Submit deliverables | ✅ | ❌ |
| Approve deliverables | ❌ | ✅ |
| Manage approval workflows | ✅ | ❌ |
| Add file comments | ✅ | ✅ |
| Update progress | ✅ | ❌ |
| View progress | ✅ | ✅ |
| Accept milestones | ❌ | ✅ |
| Submit surveys | ❌ | ✅ |
| View survey analytics | ✅ | ❌ |
| Upload files | ❌ | ✅ |
| Manage notification preferences | ❌ | ✅ |
Document Requests
Document requests allow administrators to request specific files or documents from clients.
Creating Requests (Admin)
- Navigate to Admin → Document Requests
- Click "Create Request"
- Fill in request details:
- Client: Select the client
- Project (optional): Associate with a project
- Title: Request title (e.g., "Tax Documents")
- Description: Details about what's needed
- Category: Contract, Invoice, Identity, Other
- Required: Mark if mandatory
- Due Date (optional): Set deadline
- Click "Create Request"
Notification Flow
Admin creates request → Client notified → Client submits → Admin notified
↘ Admin approves/rejects → Client notified
Fulfilling Requests (Client)
- Navigate to Portal → Document Requests
- View pending requests
- Click on a request to view details
- Click "Submit Documents"
- Upload required files (max 50MB each)
- Add notes (optional)
- Click "Submit"
Request Status
| Status | Description | Next Action |
|---|---|---|
pending | Awaiting client submission | Client submits |
submitted | Files uploaded, awaiting review | Admin reviews |
approved | Documents accepted | Complete |
rejected | Documents need revision | Client resubmits |
Viewing Submitted Documents (Admin)
- Navigate to Admin → Document Requests
- Click on a submitted request
- View uploaded files
- Download files to review
- Click "Approve" or "Reject"
- If rejecting, provide reason
Document Request Templates
Document request templates allow administrators to create reusable templates for common document requests, streamlining the request creation process.
Accessing Templates (Admin)
Navigate to Admin → Document Request Templates to manage templates.
| URL | Description |
|---|---|
/admin/document-request-templates | List all templates |
/admin/document-request-templates/create | Create new template |
/admin/document-request-templates/{id}/edit | Edit template |
Creating a Template
- Navigate to Admin → Document Request Templates
- Click "Create Template"
- Fill in template details:
- Template Name: Internal name (e.g., "Standard Logo Request")
- Request Title: Default title for requests created from this template
- Description: Default description explaining what's needed
- Category: legal, financial, design, identity, project, other
- Default Priority: low, normal, high, urgent
- Default Due Days: Days until due (e.g., 7)
- Accepted File Types: Restrict to specific types (pdf, doc, png, etc.)
- Click "Create Template"
Template Categories
| Category | Description | Common Uses |
|---|---|---|
legal | Legal documents | Contracts, agreements, NDAs |
financial | Financial records | Tax docs, bank statements |
design | Design assets | Logos, images, brand files |
identity | Identity verification | ID copies, certifications |
project | Project deliverables | Specifications, requirements |
other | Miscellaneous | Any other documents |
Using Templates
When creating a new document request:
- Select a template from the dropdown
- Template values auto-populate the form
- Modify as needed for this specific request
- Create the request
Template Management
- Toggle Status: Activate/deactivate templates
- Usage Count: Track how many times a template has been used
- Edit: Modify template settings
- Delete: Remove unused templates
Deliverable Approvals
The deliverable approval workflow allows clients to review and approve work deliverables.
Submitting Deliverables (Admin)
- Navigate to Admin → Projects → [Project]
- Click "Submit Deliverable"
- Fill in submission details:
- Title: Deliverable name
- Description: What's included
- File (optional): Attach project file
- Milestone (optional): Link to milestone
- Click "Submit for Approval"
Reviewing Deliverables (Client)
- Navigate to Portal → Projects → [Project] → Deliverables
- View pending deliverables
- Click on a deliverable to review
- Download and review attached files
- Choose action:
- Approve: Accept the deliverable
- Request Revision: Ask for changes
- Reject: Decline the deliverable
- Add feedback (required for revisions/rejection)
Approval Status
| Status | Description |
|---|---|
pending | Awaiting client review |
approved | Client accepted |
revision_requested | Changes needed |
rejected | Client declined |
Revision Workflow
Admin submits (v1) → Client requests revision → Admin resubmits (v2) → Client approves
Each resubmission increments the revision number.
Multi-Stage Approval Workflows
Multi-stage approval workflows enable complex approval processes with multiple stages and approvers, ideal for enterprise clients or regulated industries.
Accessing Workflows (Admin)
Navigate to Admin → Approval Workflows to manage workflows.
| URL | Description |
|---|---|
/admin/approval-workflows | List all workflows |
/admin/approval-workflows/create | Create new workflow |
/admin/approval-workflows/{id} | View workflow details |
/admin/approval-workflows/{id}/edit | Edit workflow |
Creating a Workflow
- Navigate to Admin → Approval Workflows
- Click "Create Workflow"
- Fill in workflow details:
- Workflow Name: Descriptive name (e.g., "Design Review Process")
- Description: When this workflow should be used
- Sequential Stages: Whether stages must be completed in order
- Require All Approvers: Default approval requirement per stage
- Add Approval Stages:
- Stage Name: Name for this stage (e.g., "Design Review")
- Approvers: Select users who can approve this stage
- Required Approvals: How many approvers must approve
- Click "Create Workflow"
Workflow Types
| Type | Description | Use Case |
|---|---|---|
| Sequential | Stages completed in order | Review → Approval → Final Sign-off |
| Parallel | All stages can run simultaneously | Multiple department approvals |
Stage Configuration
Each stage can have:
- Multiple approvers
- Required approval count (e.g., 2 of 3 must approve)
- Automatic advancement when requirements met
Using Workflows with Deliverables
- When submitting a deliverable, select an approval workflow
- The deliverable starts at Stage 1
- Designated approvers review and approve
- When stage requirements are met, advances to next stage
- After final stage, deliverable is marked as approved
Workflow Status Tracking
| Field | Description |
|---|---|
current_stage | Index of the current approval stage |
stage_approvals | Record of who approved each stage |
final_approved_at | Timestamp when all stages completed |
Progress Visualization
Stage 1 (Design Review) Stage 2 (Final Approval)
[✓] Completed → [●] In Progress
Approved by: John Waiting: Jane, Mike
Workflow Management
- Duplicate: Copy a workflow for modification
- Toggle Status: Activate/deactivate workflows
- View Details: See approvers and recent approvals
- Edit: Modify stages and approvers
File Comments & Feedback
Adding Comments to Files
- Navigate to a project file
- Click "Add Comment"
- Select comment options:
- Type: general, question, feedback, issue, suggestion
- Priority (optional): low, normal, high, urgent
- Enter your comment
- Click "Post"
Comment Types
| Type | Description | Use Case |
|---|---|---|
general | General observation | Standard comments |
question | Needs clarification | Questions for reviewer |
feedback | Review feedback | Client review notes |
issue | Problem identified | Bug or concern |
suggestion | Improvement idea | Enhancement requests |
Comment Status
| Status | Description |
|---|---|
open | Active, needs attention |
in_progress | Being addressed |
resolved | Issue resolved |
closed | No action needed |
Comment Threading
- Comments support nested replies
- Click "Reply" on any comment to respond
- Thread maintains conversation context
Resolving Comments
- Review the comment
- Click "Mark Resolved"
- Comment moves to resolved state
- Resolution logged with user and timestamp
Comment Visibility
| Type | Who Can See |
|---|---|
| All | Both admin and client |
| Admin Only | Only administrators |
Project Feedback
Clients can provide general feedback on projects:
- Navigate to Portal → Projects → [Project]
- Click "Leave Feedback"
- Select feedback options:
- Type: general, milestone, deliverable, concern, praise
- Priority: low, normal, high, urgent
- Enter feedback text
- Click "Submit"
Feedback Status Tracking
| Status | Description |
|---|---|
open | New feedback, unaddressed |
acknowledged | Seen by team |
in_progress | Being acted upon |
resolved | Issue resolved |
closed | No action required |
Progress Tracking
Viewing Progress (Client)
- Navigate to Portal → Projects → [Project]
- View progress bar showing completion percentage
- Click "View History" to see updates
Updating Progress (Admin)
- Navigate to Admin → Projects → [Project]
- Click "Update Progress"
- Set Percentage (0-100%)
- Add Breakdown (optional):
{ "design": 100, "development": 75, "testing": 25 } - Add Notes describing what changed
- Click "Update"
Progress Components
The visual progress bar component shows:
- Overall percentage
- Phase breakdown (if provided)
- Last update timestamp
- Update history
Auto-Calculate from Milestones
Progress can be calculated automatically:
Progress % = (Completed Milestones / Total Milestones) × 100
Milestone Acceptance
Reviewing Milestones (Client)
- Navigate to Portal → Projects → [Project]
- View project milestones
- Click on a completed milestone
- Review milestone deliverables
- Click "Accept Milestone" or "Reject"
- Add acceptance comments (optional)
- Sign if required (digital signature)
Acceptance Record
Each acceptance is recorded with:
- Accepting user
- Status (accepted/rejected)
- Comments
- Signature (if applicable)
- Timestamp
Milestone Status Flow
Pending → In Progress → Completed → Awaiting Acceptance → Accepted
↘ Rejected
Client Satisfaction Surveys
Survey Types
| Type | When Sent |
|---|---|
project_completion | When project completes |
milestone | After milestone acceptance |
periodic | On schedule (monthly/quarterly) |
Taking a Survey (Client)
- Navigate to Portal → Surveys (or click email link)
- Rate the following (1-5 stars):
- Overall Satisfaction
- Communication Quality
- Work Quality
- Timeliness
- Value for Money
- Provide feedback:
- What went well
- What could improve
- Answer: Would you recommend? (Yes/No)
- Click "Submit Survey"
Viewing Analytics (Admin)
- Navigate to Admin → Satisfaction
- View dashboard metrics:
- Overall Score: Average rating
- NPS Score: Net Promoter Score
- Category Scores: By dimension
- Trends: Over time
- Filter by:
- Date range
- Client
- Project
NPS Calculation
NPS = (% Promoters - % Detractors) × 100
Promoters: Rating 4-5
Detractors: Rating 1-2
Passives: Rating 3
Client Uploads
Uploading Files (Client)
- Navigate to Portal → Uploads
- Click "Upload File"
- Select file(s) to upload
- Fill in details:
- Description: What the file contains
- Category: Categorize the upload
- Project (optional): Associate with project
- Click "Upload"
File Limits
- Maximum file size: 50MB
- Supported types: Documents, images, archives
Managing Uploads
Clients can:
- View all their uploads
- Filter by category/project
- Download uploaded files
- Delete their own uploads
Notification Preferences
Clients can configure their notification preferences to control how they receive collaboration updates.
Accessing Preferences (Client)
Navigate to Portal → Settings → Notifications to manage preferences.
| URL | Description |
|---|---|
/portal/settings/notifications | Edit notification preferences |
Configurable Events
| Event Type | Description |
|---|---|
document_requests | New document requests |
feedback_received | Responses to feedback |
approval_needed | Deliverables awaiting approval |
deliverable_status | Deliverable status changes |
Notification Channels
| Channel | Description |
|---|---|
email | Email notifications |
in_app | In-application notifications |
Reminder Frequency
| Frequency | Description |
|---|---|
off | No reminders |
minimal | Weekly digest only |
normal | Standard frequency |
frequent | More frequent reminders |
Setting Preferences
- Navigate to Portal → Settings → Notifications
- For each event type, toggle:
- Email: Receive email notifications
- In-App: Receive in-app notifications
- Set Reminder Frequency: How often to receive digests
- Click "Save Preferences"
Default Preferences
New users receive these defaults:
- Document requests: Email + In-App
- Feedback received: Email + In-App
- Approval needed: Email + In-App
- Deliverable status: In-App only
- Reminder frequency: Normal
Reset to Defaults
Click "Reset to Defaults" to restore original notification settings.
Technical Architecture
Models
Location: app/Models/
| Model | Table | Purpose |
|---|---|---|
DocumentRequest | document_requests | Admin document requests |
DocumentRequestFile | document_request_files | Files submitted for requests |
DocumentRequestTemplate | document_request_templates | Reusable request templates |
DeliverableApproval | deliverable_approvals | Deliverable approval records |
ApprovalWorkflow | approval_workflows | Multi-stage approval workflows |
FileComment | file_comments | Comments on project files |
ProjectFeedback | project_feedback | General project feedback |
ProjectProgress | project_progress | Progress history |
MilestoneAcceptance | milestone_acceptances | Milestone acceptance records |
SatisfactionSurvey | satisfaction_surveys | Survey responses |
ClientUpload | client_uploads | Client-uploaded files |
CollaborationNotificationPreference | collaboration_notification_preferences | User notification settings |
Enums
Location: app/Enums/
// DocumentRequestStatus
enum DocumentRequestStatus: string {
case Pending = 'pending';
case Submitted = 'submitted';
case Approved = 'approved';
case Rejected = 'rejected';
}
// ApprovalStatus
enum ApprovalStatus: string {
case Pending = 'pending';
case Approved = 'approved';
case Rejected = 'rejected';
case RevisionRequested = 'revision_requested';
}
Services
Location: app/Services/Collaboration/
// DocumentRequestService
class DocumentRequestService
{
public function create(array $data, User $requester): DocumentRequest;
public function submit(DocumentRequest $request, array $files, User $user): void;
public function approve(DocumentRequest $request, User $reviewer): void;
public function reject(DocumentRequest $request, string $reason, User $reviewer): void;
public function getOverdueRequests(): Collection;
}
// DeliverableService
class DeliverableService
{
public function submit(Project $project, array $data, User $submitter): DeliverableApproval;
public function approve(DeliverableApproval $approval, User $reviewer, ?string $feedback): void;
public function reject(DeliverableApproval $approval, User $reviewer, string $feedback): void;
public function requestRevision(DeliverableApproval $approval, User $reviewer, string $feedback): void;
}
// ProgressTrackingService
class ProgressTrackingService
{
public function updateProgress(Project $project, int $percentage, ?array $breakdown, ?string $notes, User $user): ProjectProgress;
public function calculateFromMilestones(Project $project): int;
public function getProgressHistory(Project $project): Collection;
}
// SatisfactionService
class SatisfactionService
{
public function recordSurvey(array $data, User $user): SatisfactionSurvey;
public function getClientSatisfactionScore(Client $client): float;
public function getProjectSatisfactionScore(Project $project): float;
public function getAverageSatisfaction(): array;
}
// CollaborationNotificationService
class CollaborationNotificationService
{
public function notifyDocumentRequest(DocumentRequest $request): void;
public function notifyDeliverableSubmitted(DeliverableApproval $approval): void;
public function notifyFeedbackReceived(ProjectFeedback $feedback): void;
public function notifyApprovalNeeded(DeliverableApproval $approval): void;
public function shouldNotify(User $user, string $type, string $channel): bool;
}
// CollaborationService - Unified API
class CollaborationService
{
public function getClientSummary(Client $client): array;
public function getProjectSummary(Project $project): array;
public function createDocumentRequest(array $data, User $requestedBy): DocumentRequest;
public function startConversation(array $data, User $createdBy): Conversation;
public function sendMessage(Conversation $conversation, string $body, User $user): Message;
public function submitFeedback(Project $project, array $data, User $user): ProjectFeedback;
public function getPendingActions(User $user): array;
}
Controllers
Portal Controllers: app/Http/Controllers/Portal/
DocumentRequestControllerDeliverableApprovalControllerClientUploadControllerMilestoneAcceptanceControllerProjectFeedbackControllerSurveyControllerNotificationPreferenceController
Admin Controllers: app/Http/Controllers/Admin/
DocumentRequestControllerDocumentRequestTemplateControllerApprovalWorkflowControllerDeliverableApprovalControllerFileCommentControllerProjectProgressControllerSatisfactionController
Routes
// Portal routes
Route::prefix('portal')->middleware(['auth', 'client'])->group(function () {
// Document Requests
Route::get('document-requests', [DocumentRequestController::class, 'index']);
Route::get('document-requests/{documentRequest}', [DocumentRequestController::class, 'show']);
Route::post('document-requests/{documentRequest}/submit', [DocumentRequestController::class, 'submit']);
// Deliverables
Route::get('projects/{project}/deliverables', [DeliverableController::class, 'index']);
Route::get('deliverables/{approval}', [DeliverableController::class, 'show']);
Route::post('deliverables/{approval}/approve', [DeliverableController::class, 'approve']);
Route::post('deliverables/{approval}/reject', [DeliverableController::class, 'reject']);
Route::post('deliverables/{approval}/revision', [DeliverableController::class, 'requestRevision']);
// File Comments
Route::post('files/{projectFile}/comments', [FileCommentController::class, 'store']);
Route::post('comments/{comment}/resolve', [FileCommentController::class, 'resolve']);
// Progress & Surveys
Route::get('projects/{project}/progress', [ProgressController::class, 'show']);
Route::get('surveys/create', [SurveyController::class, 'create']);
Route::post('surveys', [SurveyController::class, 'store']);
// Uploads
Route::get('uploads', [ClientUploadController::class, 'index']);
Route::post('uploads', [ClientUploadController::class, 'store']);
// Notification Preferences
Route::prefix('settings')->group(function () {
Route::get('notifications', [NotificationPreferenceController::class, 'edit']);
Route::put('notifications', [NotificationPreferenceController::class, 'update']);
Route::post('notifications/reset', [NotificationPreferenceController::class, 'reset']);
});
});
// Admin routes
Route::prefix('admin')->middleware(['auth', 'admin'])->group(function () {
Route::resource('document-requests', Admin\DocumentRequestController::class);
Route::post('document-requests/{documentRequest}/approve', [Admin\DocumentRequestController::class, 'approve']);
Route::post('document-requests/{documentRequest}/reject', [Admin\DocumentRequestController::class, 'reject']);
// Document Request Templates
Route::resource('document-request-templates', Admin\DocumentRequestTemplateController::class);
Route::patch('document-request-templates/{template}/toggle', [Admin\DocumentRequestTemplateController::class, 'toggle']);
// Approval Workflows
Route::resource('approval-workflows', Admin\ApprovalWorkflowController::class);
Route::patch('approval-workflows/{workflow}/toggle', [Admin\ApprovalWorkflowController::class, 'toggle']);
Route::post('approval-workflows/{workflow}/duplicate', [Admin\ApprovalWorkflowController::class, 'duplicate']);
Route::post('projects/{project}/deliverables', [Admin\DeliverableController::class, 'store']);
Route::post('projects/{project}/progress', [Admin\ProgressController::class, 'update']);
Route::get('satisfaction', [Admin\SatisfactionController::class, 'index']);
});
Notifications
| Notification | Recipient | Trigger |
|---|---|---|
DocumentRequestCreated | Client users | Admin creates request |
DocumentRequestSubmitted | Admin (requester) | Client submits docs |
DeliverableSubmitted | Client users | Admin submits deliverable |
DeliverableReviewed | Admin (submitter) | Client reviews deliverable |
Configuration
Location: config/client-collaboration.php
return [
'document_requests' => [
'enabled' => true,
'max_files_per_request' => 10,
'max_file_size_mb' => 50,
'default_due_days' => 7,
'allowed_file_types' => ['pdf', 'doc', 'docx', 'xls', 'xlsx', 'png', 'jpg', 'jpeg', 'gif', 'zip'],
'categories' => ['general', 'financial', 'legal', 'identity', 'other'],
'priorities' => ['low', 'normal', 'high', 'urgent'],
'auto_approve' => false,
'notify_on_submit' => true,
],
'messaging' => [
'enabled' => true,
'max_message_length' => 5000,
'allow_attachments' => true,
'max_attachments_per_message' => 5,
'project_conversations' => true,
'general_conversations' => true,
],
'feedback' => [
'enabled' => true,
'types' => ['general', 'concern', 'suggestion', 'praise'],
'visibility_options' => ['all', 'admin'],
'require_project' => true,
'allow_anonymous' => false,
],
'approvals' => [
'enabled' => true,
'require_notes_on_reject' => true,
'auto_approve_timeout_days' => null,
],
'notifications' => [
'email' => true,
'in_app' => true,
'digest' => false,
'digest_frequency' => 'daily',
],
];
Blade Components
{{-- Progress Bar Component --}}
<x-progress-bar :percentage="$project->progress_percentage" :breakdown="$progress->breakdown" />
{{-- Comment Thread Component --}}
<x-comment-thread :comments="$file->comments" :file-id="$file->id" />
Best Practices
For Document Requests
- Be specific about what documents are needed
- Set reasonable due dates to give clients time
- Review submissions promptly to maintain engagement
- Provide clear rejection reasons so clients can fix issues
For Deliverable Approvals
- Include detailed descriptions of what's being delivered
- Attach relevant files for review
- Respond to revisions quickly to keep projects moving
- Provide constructive feedback when requesting changes
For Progress Updates
- Update regularly (at least weekly for active projects)
- Use breakdown for complex projects
- Add notes explaining what was accomplished
- Set realistic percentages to maintain trust
For Surveys
- Send promptly after project completion
- Keep surveys short for better completion rates
- Review feedback and act on improvement suggestions
- Share positive feedback with the team
Troubleshooting
| Issue | Solution |
|---|---|
| Can't submit documents | Check file size limit (50MB) |
| Document request not showing | Verify client association |
| Deliverable stuck in pending | Remind client to review |
| Progress not updating | Check user permissions |
| Survey not submitting | Ensure all required fields filled |
Related Features
Dependencies
| Feature | Relationship |
|---|---|
| Project Management | Project context |
| File Sharing | File attachments |
| Notifications | Email alerts |
| Authorization | Permission checks |
Complementary Features
| Feature | Description |
|---|---|
| Client Dashboard | Portal overview |
| Activity Logging | Action history |
| Analytics | Satisfaction metrics |
See Also
- Project Management - Project workflows
- File Sharing - File management
- Notifications - Alert system
- Client Dashboard - Portal interface