Contacts & Billing
A client without contacts is just a folder — no one can log in, file tickets, sign contracts, or receive invoices. The Contacts tab is where you wire up the people.
The Contacts Tab
The Contacts tab is the default tab on every client workspace. It's a Vue.js application that splits into two sub-tabs:
| Sub-tab | Who |
|---|---|
| Client Users | External users from the client company — the people who log into the portal |
| Account Managers | Internal team members responsible for this client |
The header shows a "Most Recent" badge with the contact who logged in most recently — useful at a glance to see if the client is active.
Client Users vs Account Managers
The two sub-tabs map to two different role groups:
Client Users
- WordPress roles:
client_basic,client_standard,client_billing,client_admin,author,contributor - Linked to this client via the
assign_to_clientuser-meta field - See only their client's content (projects, tickets, contracts, etc.)
Account Managers
- WordPress roles:
administrator,editor,representative - Linked to this client via the same
assign_to_clientfield — but their admin role gives them broader portal access - Used for assignment in dashboards ("show my clients") and for routing client communications
A user can be a contact for multiple clients — assign_to_client is a multi-value relationship.
Adding a Contact
To add a client user (someone who'll log into the portal):
- Open the client workspace
- Confirm you're on the Client Users sub-tab
- Click Add Contact
- The Add Contact modal opens
Fields
- First Name (required)
- Last Name (required)
- Email (required) — must be unique across all WordPress users
- Phone (optional)
- Job Title (optional)
- Role — pick from the client roles dropdown (default:
client_standard) - Send invite email immediately — toggle (default: off)
- Click Add Contact
ClientCove:
- Creates a WordPress user with
pending_invite = 1andactive = 0 - Sets
assign_to_clientto this client - Adds them to the contacts list immediately
- If "Send invite" was on, sends the activation email
- If "Send invite" was off, the contact appears with a "Pending Invite" badge — you can send the invite later
Why "Add Contact" doesn't always send invite
Two reasons to skip the immediate invite:
- Bulk staging — onboarding 20 contacts in one sitting; send all invites in a batch when you're ready
- Awaiting confirmation — you've created the contact but the client hasn't confirmed they want them in the portal yet
The Pending Invite state lets you stage without committing.
Sending an Invite
For contacts in the Pending Invite state:
- Find the contact row in the Client Users list
- Click the Send Invite button (envelope icon, "Send Invite" label)
- Confirm in the prompt
- ClientCove sends an account activation email
- The contact's row updates to show "Invite Sent" with a timestamp
The activation email includes:
- The contact's name greeting
- A link to set their password
- Your portal's branding (per Settings → Email)
The activation link is one-time-use and expires after 7 days. If the contact doesn't act in time, click Resend Invite to issue a new link.
Pending Invites & Activation
The lifecycle of a contact:
| State | What's true |
|---|---|
| Pending Invite | User account exists, no invite sent |
| Invite Sent | Activation email sent, awaiting user click |
| Active | Contact set their password and logged in at least once |
| Inactive | Contact's active flag was set to 0 (e.g. they left the company) |
Contact rows show a colored badge for the current state. Click the badge to see the timestamp of the last state change.
Activating without an invite
If a contact tells you they don't have access, but they should:
- Resend Invite generates a fresh activation email
- Or, in WordPress admin (admin only), use the standard password reset flow
Deactivating a contact
If a contact leaves the client company:
- Find their row
- Click the menu → Deactivate
- The user's
activeflag flips to 0 - They can no longer log in
- Their record is preserved for history (don't delete unless you really want to lose the audit trail)
Editing a Contact
For each contact row, the menu includes Edit:
- Update name, email, phone, job title
- Change role (from client_basic up to client_admin)
- The change syncs to the WordPress user record immediately
You cannot change the client assignment from this modal — to move a contact to a different client, edit the user in WordPress admin and update their assign_to_client field.
Removing a Contact
To remove a contact from this client:
- Find the contact row
- Click the menu → Remove from Client
- Confirm
This removes the client link (assign_to_client) but keeps the user account. The contact:
- Loses access to this client's content
- Retains access to any other clients they're assigned to
- Can be re-added later by adding them as a contact again
To delete the user account entirely, do it from WordPress admin — Removing from Client is the safer default.
Most Recent Login
The header of the Contacts tab shows a badge:
Most Recent: Jane Doe — 2 hours ago
This is the most recent login across all client users for this client. Useful for:
- At-a-glance activity check ("are they still using the portal?")
- Spotting accounts gone stale
- Identifying the active contact when reaching out
The login timestamp is stored as last_login user meta and updated on every successful login.
Account Managers
The Account Managers sub-tab works the same way as Client Users but for internal staff:
Adding an account manager
- Switch to the Account Managers sub-tab
- Click Add Account Manager
- Pick a user from the dropdown (filtered to admin / editor / representative roles)
- Save
The selected user is now linked to this client. They appear:
- In the Account Managers list on this client's workspace
- In dashboard widgets that show "my clients"
- In ticket assignment dropdowns when this client's ticket is being routed
Removing an account manager
Same pattern — menu → Remove.
Internal users are typically responsible for many clients, so adding and removing happens often as ownership shifts.
Designating the Billing Contact
For clients with invoicing enabled, one client user is designated as the Billing Contact — the recipient for invoice notifications.
Setting the billing contact
- Open the Settings tab in the workspace
- Scroll to Billing Contact
- The dropdown lists every client user (excluding admins and account managers)
- Pick one
- Click Save Changes
The dropdown shows each user's display name and email so you can confirm you're picking the right person.
Empty contact list
If the dropdown shows "No contacts found", you haven't added any client users yet. Go to the Contacts tab, add at least one user, then come back to Settings.
Changing the billing contact
You can change the billing contact at any time. The change applies to invoices issued from that point forward — already-sent invoices are not retroactively re-routed.
What the billing contact sees
The billing contact gets:
- All invoice notification emails for the client
- A flagged "Billing" badge on their user profile
- Optionally: receipts for online payments (when payment integration is enabled)
Other client users don't see invoices unless they have the client_billing role, which is independent of the billing-contact designation.
Billing Contact ≠ client_billing role. The role grants access to view all invoices for the client; the billing-contact designation is who receives the invoice email. They're related but distinct — most setups grant client_billing to one person and also designate them as the billing contact, but you could give multiple people the role while keeping invoice emails routed to one.