Back to Portfolio
Case Study · Custom Plugin

French Door Factory CRM.

A fully custom WordPress plugin and React portal replacing legacy CRM workflows for a Wellington joinery business. Quote builder → job pipeline → staff scheduling → Xero accounting — every business workflow under one roof, behind a clean React-powered front-end.

Client
French Door Factory
Type
WP Plugin + React SPA
Year
2024 — present
Role
Build, Ship, Iterate
frenchdoorfactory.co.nz/crm
French Door Factory CRM dashboard — Xero-synced metrics, jobs pipeline, leads sidebar
01 / Overview

Quote → Job → Paid.

French Door Factory builds bespoke joinery — windows, doors, panels — for the Wellington trade and residential markets. The team had grown beyond what spreadsheets and disconnected tools could handle: quotes were getting lost, staff didn't know which jobs to start, and Xero was being checked manually for who'd paid.

We rebuilt their entire operational stack as a custom WordPress plugin with a React front-end at /crm/. Quotes are built, sent and accepted online; accepted quotes flow into a job pipeline; the workshop sees only what they need; and Xero handles the truth on customers and invoices — synced bidirectionally with carefully scoped OAuth.

02 / Build phases

Built in five phases.

Shipped iteratively — each phase delivered a workflow that immediately replaced an existing manual process.

// Phase 1

Portal & Authentication

  • Custom front-end portal at /crm/ — no wp-admin exposure for staff
  • React SPA delivered via WordPress custom page templates
  • Role-based login with full session management
  • Dashboard with at-a-glance metrics: customers, jobs, revenue, outstanding
// Phase 2

Quote Workflow

  • End-to-end quote builder with materials pricing pulled from a JMS-sourced database
  • Email-based quote acceptance flow — customer clicks a link, accepts, signed and dated
  • Quote-to-job pipeline conversion tracked via source_quote_id
  • Related quotes panel on every customer record for full history
// Phase 3

Staff, Scheduling & Time Tracking

  • Custom fdf_workshop role with restricted access — financial fields, pricing, invoice numbers, delete actions all hidden
  • Staff Jobs / My Jobs views with month/day accordion grouping
  • "Next Up" highlighted header for the first job group
  • All-staff filter dropdown for admins; modal-based assign / remove
  • Editable staff notes (workshop edits; admins read-only) and job description per assignment
  • Automatic job status transitions via WP cron (5-min) plus on-page checks
  • Per-staff per-job time tracking with cascade-delete on job removal
// Phase 4

Xero Integration & Reporting

  • OAuth2 connection with granular scopes (accounting.invoices)
  • Optimised sync — bulk import once, then update only unpaid invoices (~15–50 calls vs 3,200+ previously)
  • Customers and invoices sourced from Xero as the single source of truth
  • Stale-token recovery via consent reconnect
  • NZ financial year reporting (April 1 – March 31)
// Phase 5

Lead Management (v3.1.0)

  • Editable customer fields, inline — no modals, no page reloads
  • 10-stage CRM pipeline dropdown
  • Timestamped notes log against every lead
  • Quick actions: Call, Email, Open in Maps
  • Assigned-staff sidebar plus a full activity timeline
// Bonus

Technical Highlights

  • Custom MySQL schema — wp_fdf_ prefixed tables
  • Cache-busting strategy for LiteSpeed_t=Date.now() on API calls
  • DB migrations triggered automatically by FDF_CRM_VERSION bumps
  • REST API with nonce auth (X-WP-Nonce)
  • Materials pricing DB integration (wood, fittings, glass, finishing)
  • template_redirect-based custom URL routing
03 / Under the hood

WordPress meets React.

// Backend

  • WordPress custom plugin (PHP)
  • Custom MySQL schema, wp_fdf_-prefixed
  • WP-Cron for status transitions (5-min intervals)
  • REST API with nonce auth (X-WP-Nonce)

// Frontend

  • React SPA served at /crm/
  • WordPress custom page templates as the shell
  • template_redirect-based URL routing
  • LiteSpeed-aware cache-busting on every API call

// Integrations

  • Xero OAuth2 (granular accounting.invoices scope)
  • Materials pricing DB sourced from JMS
  • WP user / role system for staff segregation
  • Email delivery for quote acceptance flow

// Stack at a glance

PHP WordPress Plugin API React SPA MySQL Custom Schema REST API WP-Cron Xero OAuth2 LiteSpeed Custom Roles
Got a trade business?

Ready to ditch the spreadsheet stack?

We build full-stack CRMs for joinery, construction and trade businesses ready to consolidate quoting, scheduling, time tracking and accounting under one roof.