Inside Projects, Tickets & Resources
File transfers are most useful when they're tied back to the work they belong to — a project deliverable, a ticket attachment, a resource update. ClientCove's transfer system has two layers: a dedicated in-project workflow that's a couple clicks from start to finish, and a general "related record" linking system that works from the main transfers dashboard.
Cloud storage required. All transfer features require cloud storage configured (S3, R2, GCS, DigitalOcean Spaces). Configure in Settings → Storage before using.
Why Link Transfers to Records
A transfer floating in the dashboard tells you "we sent / received some files for some recipient at some date". A transfer linked to a project tells you "these are the deliverables we sent for the Q2 brand refresh project on April 14, and the client downloaded them on April 15".
Linking transfers makes them part of the work history:
- The project workspace shows transfers in its Files tab
- The activity log records the transfer event alongside other project activity
- Anyone reviewing the project later sees the file movement without leaving the project
For long-running engagements with many file exchanges, linking is the difference between a coherent record and a forensic puzzle.
Project Upload Links — the One-Click Receive Bucket
The most useful transfer integration is the project upload link — a one-click feature inside any project's Files tab that creates a permanent inbound transfer bound to the project.
What makes it special:
- One click to create — no modal, no fields to fill
- Permanent — the link doesn't expire (configured as
never) - Project-bound — every file that arrives is automatically associated with the project
- Self-managing — once created, the same Files tab shows the link's URL, current files, and lets you upload too
The pattern is: open a project, click Create Upload Link, copy the URL, send it to your client. From then on, every time they need to send you files for that project, they use the same link. No new transfer needed each time.
Creating a Project Upload Link
- Open the project workspace
- Switch to the Files tab
- In the Files tab header, look for the green Create Upload Link button (only appears when no active inbound transfer exists for this project, and File Transfers is enabled)
- Click it
- Behind the scenes:
- ClientCove POSTs to
/wp-json/clientcove/v1/transfers - Creates an inbound transfer with title
Add files to <project name> project - Sets
expiration_preset: never - Sets
related_post_type: project,related_post_id: <this project's ID>
- ClientCove POSTs to
- The page reloads
- The button disappears, replaced by the active upload link UI
The whole operation takes one second. You don't have to fill in recipient details, expirations, or limits — defaults are tuned for the common case ("we want to receive client files into this project, indefinitely").
The Active Upload Link UI
Once an upload link exists, the Files tab header shows an Upload Link dropdown button (green, with cloud-upload icon). Click it to reveal:
- Header: Public Upload Link
- Helper text: "Share this link so others can upload files to this project."
- The full URL in a read-only input
- A Copy button (clipboard icon)
- An Open in New Tab button (to test the link yourself)
Copy the URL and send it to your client however you communicate (email, Slack, embedded in your project status update). They open it on a public page — no login needed — and upload files directly to your cloud storage.
The link works as long as the inbound transfer is active. You can cancel/delete it from the main Transfers dashboard if you ever need to.
The Transfers In Section
When files start arriving via the upload link, a new Transfers In card appears at the top of the project's Files tab.
The section shows:
Header
- Transfers In title with cloud-upload icon
- Download Group button (when files exist) — bulk-download all received files as ZIP
- Upload Files button — lets you (the project team) also upload directly into the same inbound transfer
- A hidden file input picker (triggered by Upload Files)
Upload progress area
While uploads are in flight, a progress bar appears with status text and percentage.
Files table
Columns:
- Select-all checkbox + per-file checkboxes
- Preview thumbnail
- File-type icon (PDF, Word, Excel, image, ZIP)
- Name (clickable to download, with extension shown)
- Size
- Uploaded date
- Uploaded By (sender name from the transfer record, or "External Upload")
- Per-file actions (Preview if previewable, Download)
Empty state
When no files have been received:
"No files received yet. Share the upload link to receive files."
The section disappears entirely if there's no active inbound transfer AND no files have been received historically.
Outbound Transfers from Project Files
The other direction — sending files OUT of a project — works through a different button.
In the project Files tab, when you select one or more files (checkbox on each row), a fixed Bulk Actions Toolbar slides in at the top-right with these actions:
- Deselect All
- Delete (admin/editor)
- Download as ZIP
- Create Transfer (when File Transfers is enabled)
Click Create Transfer to open the project-specific transfer modal. It's a two-step modal:
Step 1 — Configure
Pre-populated with:
- The selected files (count + total size, expandable list)
- Empty Title, Message, Recipient Name, Recipient Email
- Default 1-week expiration
- Optional password
Fill in the recipient details and click Create Transfer.
Step 2 — Success
- Shareable link with copy-to-clipboard
- Optional notification send (if recipient email was provided)
The created transfer is automatically related_post_type: project for this project, so it surfaces in the project's transfer history and the activity log.
The Active Transfers Dropdown
Outbound transfers created from the project also surface in a header dropdown.
When the project has any active outbound transfers, a blue Transfers button appears next to Download All in the Files header, with a count badge.
Click to reveal a dropdown listing each active transfer:
- Title
- File count
- Expiration date (if set)
- Copy link button (clipboard icon)
- Open in new tab button
Useful when you sent something to a client a week ago and want to grab the link again to remind them.
Linking from the Main Transfers Dashboard
The in-project workflow is the convenient path. The general path — linking any transfer to any portal record — is in the main Transfers dashboard's create modals.
In both Send Files and Request Files modals, expand Advanced Options to find:
- Related type dropdown — Project / Ticket / Resource
- Related record dropdown — populated based on the selected type (and filtered to the chosen client if set)
Pick a type and a specific record. The transfer is created with related_post_type and related_post_id set, exactly as if it had been created from inside that record.
This path is useful when:
- The transfer doesn't fit cleanly into any one record (so you create it from the dashboard, then link)
- You want to link to a ticket or resource (which don't have first-class in-record UI yet)
- You're creating multiple transfers for one record and the dashboard is faster than navigating into the record each time
Tickets & Resources Today
Honest status:
| Record Type | Linking via dashboard | First-class in-record UI |
|---|---|---|
| Project | ✓ (Advanced Options) | ✓ (Create Upload Link button + Transfers In + bulk Create Transfer) |
| Ticket | ✓ (Advanced Options) | — (no dedicated transfer UI in the ticket workspace yet) |
| Resource | ✓ (Advanced Options) | — (no dedicated transfer UI in the resource workspace yet) |
For tickets and resources, the linking works under the hood — set related_post_type: ticket or resource in the dashboard, and the transfer is associated with that record at the database level. The Files tab on a project knows how to query and display its related transfers; the equivalent UI for tickets and resources hasn't been built yet.
If you want to send a transfer for a specific ticket today:
- Open the main Transfers dashboard
- Click Send Files
- Fill in the basics
- Open Advanced Options
- Pick Related: Ticket, then pick the specific ticket
- Send
The transfer record links to the ticket via related_post_id, even if no UI surfaces it in the ticket workspace today. Future portal updates can add the in-ticket UI without re-doing data linking.
How the Linking Works
For the technically curious or anyone customizing the portal:
Database schema
The wp_clientcove_transfers table stores related_post_type and related_post_id columns on every transfer record. They're nullable — most one-off transfers leave them empty.
Helper function
clientcove_get_transfers_for_post($post_type, $post_id, $status = '') returns all transfers linked to a given post. Used by the project Files tab to populate the Transfers In section and the Active Transfers dropdown.
REST API
The /wp-json/clientcove/v1/transfers endpoint accepts related_post_type and related_post_id parameters in the POST body when creating a transfer. The dashboard modals use this; the project's "Create Upload Link" button uses this; any custom integration can use this.
Audit log
Linked transfers don't currently fire activity log events on the linked record automatically (the project Files tab logs its own "Created upload link for project" event manually). Adding linked-record activity events is a customization layer your team can add via post-create hooks if you need it for tickets or resources.
The project upload link is intentionally simple. No expiration to set, no recipient details, no per-link configuration — just one click and you have a permanent file receive endpoint for the project. The trade-off is that the link is publicly accessible to anyone who has it. For sensitive projects, consider canceling the link when the project ends, or use a regular inbound request from the main dashboard with a short expiration and password protection instead.