A client portal where one update reaches the CRM, the recruiter, and the client at once
The company
Resorsi is a recruiting and staffing firm that sources candidates globally for clients in the United States. Every active search involves a client, an account manager, a recruiter, and often a set of candidates moving through multiple stages. Communication happens across email, WhatsApp, Slack, and the CRM. Before this project, those channels did not talk to each other.
The problem
The same information was being entered in four different places. A recruiter would interview a candidate, write notes in the CRM, update the candidate stage, email the resume to the account manager, post a video intro link in Slack, then message the client on WhatsApp. The client would reply in WhatsApp with feedback on three candidates. The recruiter would read that thread, try to remember which feedback belonged to which candidate, and type it back into the CRM. Anything that did not get transcribed correctly disappeared.
Clients had no single place to review candidates. Resumes arrived as PDF attachments. Video intros were YouTube links in an email. Technical challenge results were pasted into WhatsApp messages. There was no way for a client to sit down, see every candidate side by side, and give structured feedback that the recruiting team would actually see.
Updates made in one system did not propagate to the others. A stage change in the CRM did not reach the client. A client comment on WhatsApp did not reach the recruiter. An availability update in a recruiter note did not reach the account manager. The team was manually syncing data between systems every day, and every handoff was a chance to drop the ball.
What we built
A single client portal hosted on Vercel, connected directly to Zoho CRM as the source of truth. The portal is used by internal staff and by clients. Every candidate record, every deal, every piece of client feedback, every communication event flows through it. Zoho stays the database of record. The portal is where people actually work.
The client view
Clients log in and see a pre-filtered list of candidates for their active searches, organized by deal. For each candidate, the client can see a resume, a video introduction, technical challenge results if the deal requires one, and a dedicated comment thread. Clients leave feedback inside the portal. That feedback is written automatically back to the candidate record in the CRM. No transcription. No translation. No lost context.
- ✓Pre-filtered candidate list scoped to the deals that belong to the client account.
- ✓Each candidate card exposes resume, video introduction, challenge results, and a comment thread.
- ✓Feedback written in the portal is saved directly to the candidate record in Zoho CRM.
- ✓View-only permissions are enforced automatically based on the account hierarchy.
- ✓Login is smart enough to route a client back to the exact candidate or deal they were trying to reach before they were prompted to authenticate.
Onboarding that teaches itself
First-time clients land on the portal and see a modal with three options: watch short video walkthroughs, take a guided interactive tour, or skip. The walkthroughs cover the three actions a client will actually do in the portal: submit a job description, review a candidate, and leave a comment. The guided tour walks them through the interface with tooltips tied to real elements. Everything runs inside the portal. Nothing requires a support call or a training session with the account manager.
The internal view
Staff log in through the same portal and see a superset of the client view. Account pages list every deal for a given client. Deal pages show the candidate pipeline as a Kanban board, with overflow scrolling, column hints, and a search that works with the keyboard. Breadcrumbs take a recruiter from the dashboard to an account to a deal to a specific candidate in three clicks. An admin can switch back to the parent portal view with a single button to see what the client sees.
- ✓Kanban candidate pipeline per deal with keyboard-driven search.
- ✓Account and deal hierarchy with breadcrumb navigation and contextual back buttons.
- ✓Skeleton loading states and a single toast system across the application so every feedback signal looks and behaves the same.
- ✓Deep-linkable URLs on every deal, account, and candidate so anything a team member is looking at can be shared in Slack in one click.
- ✓An admin switch that lets internal users see the portal exactly as the client sees it.
One update, everywhere
The part of this project the team uses every day is not any single page in the portal. It is the fact that when something changes in one system, it appears in every other system that needs to know. The portal is the hub, but the effect extends across the whole stack.
- ✓A recruiter adds a candidate to a deal in Zoho CRM and clicks Push Candidates. The system generates a personalized update message and posts it to the internal Slack #Client-Updates channel. The recruiter then relays that message through the client's preferred channel (WhatsApp, Gmail, or Slack) as the last mile. The candidate also appears in the portal for the client to review.
- ✓A client opens the portal and leaves feedback on a candidate. That feedback writes back to the candidate record in Zoho CRM automatically. The recruiter sees it the next time they open the deal.
- ✓A recruiter updates a candidate's stage in the CRM (for example, from presented to accepted). The change reflects in the portal view that the client sees and in the internal Kanban board the team works from.
- ✓Every Monday and Friday, a scheduled process sends a check-in message to #Client-Updates for each active deal. The recruiter relays those updates through the client's channel. Nobody has to remember to send them.
- ✓A deal changes stage in the CRM and the portal updates its status column accordingly. The analytics platform picks up the new stage for reporting in the same cycle.
The flow of information is: Zoho CRM is the database. The portal is the interface. Slack is the internal notification layer. The client's preferred channel is the outgoing voice. Every update made at any point in that chain propagates to the other three.
The deal fields that power every downstream system
Before a deal can move out of the Qualification stage, a set of fields has to be populated in the CRM. These fields are not bureaucratic overhead. Each one drives a downstream behavior in the portal, the communication system, or the recruiter workflow.
- ✓Work Schedule and Benefits/PTO: pulled into the recruiter's sourcing pitch and the eventual offer letter.
- ✓Reporting Structure: shown to candidates during screening and reused in the offer stage.
- ✓Client Timezone: feeds scheduling, availability screening, and the cadence of automated check-ins.
- ✓Technical Challenge Required and Video Intro Required: toggle whether those sections appear on each candidate card in the portal.
- ✓Communication Channel: tells the system whether the recruiter should relay updates to the client through WhatsApp, Gmail, or Slack.
- ✓Deal Priority and Target Start Date: shown on every deal view and used to order recruiter attention.
- ✓Confirmed Start Date: left blank until the offer is signed, then populated and used by the onboarding workflow.
The portal refuses to treat a deal as ready until these fields exist. That rule alone eliminated a recurring problem: deals moving into recruiting without enough information for the recruiter to do their job.
The systems connected
- ✓Zoho CRM: deals, candidates, accounts, contacts, stage transitions, and feedback write-back.
- ✓Slack: #Client-Updates channel for internal notification and scheduled check-ins.
- ✓Gmail, WhatsApp, and Slack client workspaces: the last-mile channels where recruiters relay updates to clients.
- ✓Loom: embedded tutorial videos inside the onboarding modal.
- ✓Google Drive: candidate resume storage with permissioned access from the portal.
The results
Before
A recruiter enters candidate notes in the CRM, emails the resume to the account manager, posts the video link in Slack, and messages the client on WhatsApp. The client replies in WhatsApp with feedback on three candidates. The recruiter reads the thread and tries to type each comment back into the CRM, hoping the right comment lands on the right candidate.
After
The recruiter adds the candidate in the CRM and clicks Push Candidates. The portal shows the candidate to the client, the client leaves structured feedback inside the portal, the feedback lands on the candidate record in the CRM, and an update appears in Slack and in the client's channel. No retyping. No lost context.
What this unlocks
The recruiting team stopped losing feedback in messaging threads. Account managers stopped guessing which candidate a WhatsApp reply was referring to. Clients stopped emailing to ask when the next update was coming, because the next update was already in their inbox. New clients stopped needing a live walkthrough, because the portal taught them itself. New recruiters started onboarding faster, because every record they needed to see was in one place with a consistent view.
The deeper result is architectural. Every system in the business can now point at the portal as the place where the current state lives. The CRM still owns the data. The portal is the only place anyone needs to look at it. And any piece of state that moves in one system reaches every other system that cares about it, without anyone typing it twice.