All projects
Web DevelopmentRecruitmentCustomer PortalMigrationNext.jsReact

VG Charles & Co – From Job Board to Legal Recruitment Platform

VG Charles needed more than a new website: its vacancies lived in a recruitment CRM, its candidates had little reason to come back, and its WordPress job board no longer looked like a specialist legal search firm. I built a new site, a staff admin and a candidate portal on one platform, with an unattended CRM job feed, job alerts, applications routed to the right consultant, and a domain move that kept every old link working.

Jump to a section
VG Charles & Co – From Job Board to Legal Recruitment Platform

Built with

  • Next.js
  • React
  • TypeScript
  • Tailwind CSS
  • Node.js
  • SQLite
  • Drizzle ORM
  • TipTap
  • Nodemailer
  • Zod
  • reCAPTCHA
  • Vitest

At a glance

Client

VG Charles & Co, a specialist legal recruitment and search firm with offices in Birmingham, London and Manchester

The starting point

a WordPress job-board site (JobMonster, Elementor and Revolution Slider) that no longer reflected the firm, with vacancies arriving from the recruitment CRM as files

What I built

a new website, a staff admin, a candidate portal and an unattended CRM job feed, then moved the firm's domain onto it with every old link still leading somewhere

My role

consultancy, design, development, content migration, hosting and ongoing support


The brief

VG Charles works on the relationships between lawyers and law firms: qualified recruitment, retained search, and practice mergers and acquisitions. The website had to carry that reputation, but it also had three practical jobs to do, and the old site made all three harder than they needed to be.

The WordPress site was built from a general-purpose job-board theme and a page builder. It worked, but it looked and behaved like a job board. The firm wanted something that felt like a specialist search practice: its black-and-red brand, its people front and centre, and a clear focus on legal recruitment. Energy recruitment was dropped during the project so the firm could concentrate on legal.

Vacancies that live in the CRM

The firm's live roles are managed in its recruitment CRM, which exports them as XML files. On the old site those files were pushed over FTP. Each export turned out to be a full snapshot of every live vacancy, not one file per job, so the website needed to treat it that way: add the new roles, close the ones that had gone and reopen any that came back, without anyone re-typing a job.

Candidates worth keeping

A candidate who applies for one role is often right for the next. The old site gave candidates little reason to come back. The new one needed accounts, stored CVs, job alerts and a way to see how an application was progressing, and it had to handle CVs with the care a law-firm audience expects.


From job board to recruitment platform

What the firm could show the world was a website. What the business needed behind it was a recruitment system: one that keeps the site in step with the CRM, puts every application in front of the right consultant, and gives candidates a reason to stay.

So the project became three things in one: the public website, an admin where staff run the content, jobs, applications and candidates, and a portal where candidates manage their own CVs, alerts and applications.


One platform, connected journeys

CRMWebsiteMatching candidates

A vacancy published in the CRM arrives as a snapshot file, goes live on the site within minutes, and alerts every candidate whose saved search matches it.

CandidateApplicationConsultant

A candidate applies with a stored CV in a couple of clicks. The application goes straight to the consultant who owns that role, and the candidate can follow its progress from their account.

StaffPagesSearch engines

The team edits the home page, service pages, articles and profiles themselves, and every page is published with its own title, description, structured data and an entry in the sitemap.

Where they meet

  • The consultant named on a CRM vacancy is matched to their profile on the site, so imported roles route applications to the right person automatically.

  • Publishing a job and alerting candidates are the same action, and each job only ever alerts once.

  • A candidate's alerts, saved jobs, applications and CVs all hang off one account, and staff see the same history from the admin.


What the platform does

An unattended CRM job feed

For the business: nobody re-keys vacancies. The CRM uploads its export and the website catches up on its own: new roles go live, filled roles close, and relisted roles reopen. Roles created by hand in the admin are never touched by the feed.

Under the hood:

  • The CRM uploads to a locked-down SFTP account that can do nothing except drop files into one folder. Every five minutes the site imports any settled snapshot and then deletes it.

  • Files still uploading are left alone, and broken files are retried before being set aside.

  • A snapshot that would close more than half of the live roles is held back for a person to check, so a bad export can't empty the jobs board.

  • Internal CRM fields such as role notes, client addresses and phone numbers are never imported. There is also a manual import with a preview, for one-off files.

Job alerts candidates control

For the business: every new role reaches the people most likely to want it, without anyone sending a mailshot.

Under the hood: candidates choose practice areas, locations and keywords, and instant, daily or weekly delivery. Matching candidates get an in-app notification when a job is published; instant subscribers are emailed straight away and the rest receive a digest. Each job alerts once, and every email carries a one-click unsubscribe.

Applications that reach the right consultant

For the business: applications land with the consultant who owns the role, and the whole team works from one pipeline instead of an inbox.

Under the hood:

  • Each application goes to the job's consultant, to an override address if one is set, or to the firm's general inbox.

  • Staff move it through new, reviewing, shortlisted, interview, offered and placed (or rejected or withdrawn), with internal notes and a CSV export.

  • Registered candidates see the outward-facing stages in their account, with the "not progressing" message worded gently.

A candidate portal with CVs handled properly

For the business: candidates have a reason to register and to come back, and the firm keeps a relationship rather than a one-off application.

Under the hood:

  • Up to five stored CVs per candidate, with the file type checked from its contents, not just its name.

  • CVs are never public. Only the candidate and recruitment staff can open them, and every staff download is recorded.

  • Saved jobs, notifications and application history in one place.

  • Deleting an account erases the candidate's data. Applications they already made are kept for the firm's records but anonymised.

Content the team runs themselves

For the business: the firm updates its own site without waiting on a developer, and can't accidentally break it.

Under the hood: a section-by-section home page editor, a block editor for every other page, articles, team profiles with each consultant's testimonials, LinkedIn posts embedded straight from a link, and a media library that won't delete an image that's still in use. Staff have roles (admin, editor and recruiter), so each person sees only what they need.

Moving the domain without losing the old site's value

For the business: the switch to the new site was a change of address, not a fresh start. Old links, bookmarks and search results still lead somewhere sensible.

Under the hood:

  • The WordPress pages, articles, team and images were migrated into the new platform.

  • The old site's addresses were checked against the public web archive, and 75 that no longer existed now redirect to their closest new page, from old blog posts to job-category and author pages.

  • Website emails are sent from vgcharles.com and pass SPF, DKIM and DMARC checks, with no change to the firm's Microsoft 365 mail.

  • The public forms are protected by reCAPTCHA, a hidden honeypot field and per-visitor rate limits.


What was delivered

  • A website that looks like a specialist legal search firm, with its people and its practice areas at the centre.

  • Vacancies that keep themselves up to date from the CRM, with a safety net against a bad export.

  • Every application routed to the right consultant and tracked through one pipeline.

  • A candidate portal with stored CVs, job alerts and application tracking, built to protect personal data.

  • A site the team edits themselves, with roles that match how the firm works.

  • A domain move that kept the old site's links working, with authenticated email from the firm's own domain.


The patterns here fit any business whose website has to stay in step with a system it doesn't control:

Import, don't re-type

any CRM, ERP or stock system that can export a file can keep a website current, with checks that stop a bad file doing damage.

Route to the owner

estate agents, lettings, care providers and trades can send each enquiry to the person responsible for it.

Accounts that bring people back

saved searches and alerts turn one visit into a relationship.

Moving platforms without starting again

content, links and email reputation can all come with you.

Talk to me about your platform


Technical stack

Next.js 16 · React 19 · TypeScript · Tailwind CSS · SQLite (libSQL) · Drizzle ORM · TipTap · Nodemailer · Zod · reCAPTCHA · Vitest

Legal RecruitmentJob BoardCRM IntegrationCandidate PortalJob AlertsApplicant TrackingWordPress MigrationSFTPNext.jsSQLite