Managing Clients & Permissions
The settings, status changes, and lifecycle controls for clients — plus the access model for who can see and edit what.
Capability Matrix
| Capability | Who Has It |
|---|---|
| View Clients page | Administrator, Editor |
| View any client workspace | Administrator, Editor |
| View own client workspace | Client users assigned to that client (limited to features they have access to) |
| Create clients | Administrator, Editor |
| Edit client settings | Administrator, Editor |
| Add / remove contacts | Administrator, Editor |
| Send / resend invites | Administrator, Editor |
| Designate billing contact | Administrator, Editor |
| Manage statuses (taxonomy) | Administrator, Editor |
| Manage categories (taxonomy) | Administrator, Editor |
| Archive client | Administrator, Editor |
| Permanently delete client | Administrator only |
| Bulk import clients | Administrator, Editor |
Other roles (representative, technician, client roles, subscriber) cannot reach the /clients/ listing — they're redirected with an "Access Restricted" notice.
The Settings Tab
The Settings tab is the configuration hub for the client itself — distinct from the contact list, project list, etc.
It's organized into stacked cards:
Basic Information
- Client Name (required)
- Logo (with drag-drop upload + remove)
- Description (textarea)
Billing Contact
- Dropdown of client users to designate as the billing contact
- Form text reminder to add contacts in the Contacts tab first if the list is empty
Address Information
- Multiple addresses (Address 1, Address 2, etc.)
- Add Address button to append more
- Each address has its own Remove button
(Future cards)
Additional configuration cards may appear depending on enabled features and your portal customization.
Click Save Changes at the bottom to commit. Changes are saved via AJAX — a success toast confirms.
Editing Basic Information
In-place editing for the three core fields:
Name
- Edit the input directly
- Save commits the change to the post title and re-slugs the URL if the title changed significantly
- Old URL still works (WordPress redirects from old to new slug)
Logo
The logo upload zone:
- Upload — opens file picker (PNG/JPG)
- Remove (trash icon) — clears the logo
- Drop a file directly onto the zone for fast replacement
- Preview shown immediately
Description
A standard textarea — multi-line plain text. Saved with the rest of the form.
Managing Addresses
A client can have any number of addresses — useful for multi-location companies, separate billing/shipping addresses, or franchise networks.
Add an address
- Click Add Address at the top of the Address Information card
- A new collapsible block appears with empty fields
- Fill in: Street, Billing flag (toggle), City, Country, State/Province, Zip
- Click Save Changes at the bottom of the form
Edit an address
- Just type into the fields and save
Remove an address
- Click the Remove button on any address block
- Confirm
- Click Save Changes
Billing flag
Each address has a Mark as Billing toggle. The flag is just a label — it doesn't auto-route anything. Use it to identify which address should appear on invoices and other billing documents.
You can mark multiple addresses as billing if a client has separate billing entities. Most setups use exactly one.
Status Management
Client statuses are stored in the client-status taxonomy.
Changing a client's status
- From the client workspace, the status badge near the name shows the current status
- Click the badge → dropdown → pick a new status
- Or in Settings, change the status field and save
Adding new statuses
- From the Clients page, click the gear icon next to the status filter tabs
- The Manage Statuses modal opens
- Add a new status: Name + Slug + Description
- Optionally set Hide from filter — keeps the status active but doesn't show its tab on the Clients page (useful for archive states)
Editing a status
- From the same modal, click the edit (pencil) icon on any status row
- Update name, description, or the hide-from-filter flag
Deleting a status
- Click the delete (trash) icon
- Confirm — clients currently with this status fall back to "Active"
- Default statuses (Active / On Hold / Inactive) cannot be deleted
Status filter cap
The Clients page filter row shows a maximum of 8 statuses. If you have more, the rest are accessible from the Manage Statuses modal but won't appear as tabs.
Category Management
Categories work the same way as statuses but with a different purpose — categories group clients (Enterprise, SMB, etc.) while statuses describe state (Active, On Hold, etc.).
Adding a new category
- From the Clients page sidebar, click the gear icon next to "Categories"
- The Manage Categories modal opens
- Add a new category with Name + Slug + optional Parent (categories are hierarchical)
Hierarchical categories
Categories support parent-child relationships. Example structure:
- Enterprise (parent)
- Fortune 500 (child)
- Mid-market Enterprise (child)
- SMB (parent)
- Startup (child)
- Established Small Business (child)
In the sidebar, child categories nest under their parent. Filter by either the parent (matches all children) or a specific child.
Assigning categories
- A client can be assigned to multiple categories simultaneously
- Set categories from the Add Client modal at create time, or
- From the Settings tab → Category multi-select
Archiving a Client
When a client is no longer active and you want to keep them out of the active list without deleting:
- Open the client workspace
- Click the three-dot menu in the header
- Click Archive Client
- Confirm
The client gets _archived = '1' post meta. Effects:
- Hidden from the default Clients page view
- Hidden from dashboard widgets and dropdowns
- Their projects, tickets, contracts remain in the database
- The client's contact users retain their accounts
Viewing archived clients
- A separate filter or query parameter exposes archived clients
- Restore by editing the client and removing the archive flag
Why archive vs change to "Inactive" status
- Inactive status keeps the client visible in lists with an "Inactive" badge — useful when you want them on radar but not actively engaged
- Archived removes them from the working list entirely — useful when they're truly done and you don't want to scroll past them
Most workflows use both: change to Inactive when engagement ends, archive when you're past needing the visual reminder.
Deleting a Client
Permanent deletion is administrator-only and irreversible.
How to delete
- From the workspace, three-dot menu → Delete Client
- Confirmation dialog appears, requires typing the client name to confirm
- On confirm, the client post is deleted
What gets deleted
- The client post itself
- The client's address records (stored as ACF metadata)
- The client's logo (the media library attachment can stay — only the link is removed)
What survives
- Projects, tickets, contracts, invoices linked to this client — they still exist but their
the_clientreference becomes broken - Contact users (kept; they might be linked to other clients)
- Activity logs (preserved for audit trail)
Because of these orphaned references, archive is almost always preferable to delete. Reserve delete for clients created in error or test data cleanup.
Cascade Effects
Changes to a client cascade to other features:
| Action | Cascade |
|---|---|
| Rename client | Updates the dropdown label everywhere; the_client references work via ID, not name, so they're unaffected |
| Change status to Inactive | Some dashboard widgets filter inactive clients out; existing projects/tickets stay accessible |
| Archive client | Client disappears from active client lists; existing tickets/projects show but their client filter no longer matches |
| Change billing contact | Future invoices route to the new contact; existing invoices stay routed to the original |
| Remove a contact | The contact loses access to this client's content; their projects/tickets they authored remain (post_author doesn't change) |
| Delete client | Orphans all related content's client reference; not recommended |
Client User Visibility
When a logged-in client user opens the portal, what they see is filtered by:
The assign_to_client field
The user's assign_to_client user-meta points to one or more clients. The client filter on every feature (projects, tickets, contracts, etc.) intersects this with the feature's data:
- A user with
assign_to_client = [Acme]sees Acme's projects, Acme's tickets, etc. - A user with
assign_to_client = [Acme, Globex]sees both clients' content - A user with no assignment sees nothing client-scoped
The user's role
Within their assigned client(s), a user's WordPress role further scopes what they can do:
| Role | Capabilities |
|---|---|
client_basic | View only — no creating/editing |
client_standard | View + file tickets |
client_billing | client_standard + view invoices |
client_admin | Edit anything for their client (closest to a "manager" role within the client company) |
author / contributor | Legacy WordPress roles — broadly equivalent to client_standard for portal purposes |
Account managers (representative role)
The representative role gives access to multiple clients' content but with admin-style permissions:
- Can view any client they're assigned to via
assign_to_client - Can create projects, file tickets on behalf of clients, send contracts
- Cannot manage clients themselves (admin/editor only)
This is the typical "account manager" persona — sales reps, customer success managers, etc.
Visibility is enforced at every feature. Even if a client user manually constructs a URL to a project they don't own, the project's access check rejects them. Don't rely on the UI hiding things — the data layer enforces access too.