Under the Hood: How CaseMate Actually Fixes a Councillor's Email
If you've ever spent a Sunday evening hunting for "that email from the resident about the pothole" across two Outlook folders and a phone, you already know the problem. CaseMate's email isn't a thinner. It's a rebuild of the parts that councillors actually use — and the interesting stuff is under the bonnet. Here's a genuinely technical look at what we built and why.
Email that finds your casework itself
The feature our users rave about most isn't clever AI — it's a well-designed convention. Every CaseMate case carries a reference tag, formatted like [Case #123]. When mail arrives, a background worker (casemate:auto-match-emails, run on schedule) parses every subject line through a dedicated CaseReferenceTagService:
- Parse the subject for a case reference.
- Validate it belongs to the right account — no cross-linking, no surprises.
- Link the email to the case, and the resident, automatically.
Invalid or ambiguous tags are logged and skipped rather than guessed at. There's even a --dry-run mode, because nobody should trust an auto-matcher they haven't seen work first. The result: correspondence lands in the case timeline before you've opened it, and "show me everything about this case" has a one-click answer.
Your inbox, plural — as one
CaseMate speaks IMAP, properly — but you start with zero configuration: every CaseMate user gets a @casemate.uk mailbox as standard, provisioned for you and ready the moment your account is, welcome details included. Then you can attach your existing mailboxes on top of it — the council Outlook, a Gmail for the campaign, whatever you have. Credentials are encrypted at rest, per-tenant keys, the whole hygiene. Incoming mail from every account unifies into a single inbox while keeping a clear account badge on every message, so you always know which "you" is replying.
The send-side niceties that add up
The details matter when you're firing off twenty replies between surgeries:
- Templates & snippets. Stored in the database, grouped by type, with
{{variable}}placeholders —{{resident_name}},{{case_reference}}— filled in at send time. Same reply to six residents, six personalised emails, zero retyping. - Scheduled send. Draft at 11pm; it leaves at 9am Tuesday. A scheduler worker (
casemate:send-scheduled-emails) sweeps due messages, logs successes and failures separately, and gives you an undo window for the ones you'd rather unsend. Your constituents don't need to know you work nights. - Signatures per account. Formal for casework replies, campaign-branded for everything else — attached to the account, applied on send.
Filing without filing
You can flag anything for follow-up, snooze it to resurface at a chosen time (8am meetings auto-unsnooze via the scheduler), archive resolved threads out of sight but never out of reach, and soft-delete to a trash bin with one-click restore. Custom folders and rules — sender, subject or recipient conditions with match-any/match-all logic, applied in priority order — sort the predictable post for you. Planning queries in one folder, school run emails in another, and the inbox keeps only what needs a human.
Trust, measured
For anything that genuinely matters — a case decision, a school admission follow-up — you can request a read receipt. When the recipient's client reports back, the timestamp is recorded against the message. Not as a gotcha, but as the answer to "did they get this?" without another email.
Built the boring way (on purpose)
Laravel 12, PostgreSQL, database-per-tenant, everything sensitive encrypted with that tenant's own key. The email features follow the same service-layer discipline as the rest of the platform, and the auto-matcher ships with tests for the tag parser before it shipped to anyone's inbox. Boring architecture is the point: your correspondence deserves predictability, not vibes.
See it on your inbox
All of this is live in CaseMate today. The best way to check it works is to forward this week's casework mail at it — start a trial and watch it organise itself.