Senior + team lead · :Different · Proptech
Many channels, one message system per agency
:Different manages $1B+ in property. I led a small engineering team that owned the communications platform end to end: fan-out architecture delivering email, SMS, push, and in-app simultaneously, multi-tenant configuration so each agency sent under its own brand, and weekly company-wide architecture sessions where engineers, architects, and leads worked through real platform problems together.
Role
Senior + team lead
Scale
$35M-funded · $1B+ under management
Team
A small engineering team
Hero outcome
Multi-tenant comms, no per-agency build
Recreated mockup — confidential engagement.
The business problem
Communications were the whole product
Every maintenance request, lease renewal, inspection reminder, and payment notice runs through messaging — so comms isn't a feature at :Different, it's the backbone.
Three things made it hard. “:Different for Agencies” needed each agency to send under its own brand on shared infrastructure. The core pathways carried real legacy debt. And in-app messaging lived apart from the Kustomer CRM the operations team actually worked in, so customer context fell through the gaps between channels.
What I did
One system, many tenants, less debt
The hard part of communications isn’t sending a message. It’s dispatching every message reliably across channels simultaneously, keeping tenants isolated on shared infrastructure, and maintaining a CRM the operations team can’t be pulled out of. The system had to stay up for thousands of daily users while all of that was being extended.
1 · Multi-tenant, white-label comms
Replaced hardcoded templates and configs with a tenant-aware system: each agency configures its own branding, sender identity, and notification schedules over shared infrastructure. Moving from per-agency code to per-agency configuration meant new agency partners could onboard without custom engineering for each one.
Recreated mockup — confidential engagement.
2 · Orchestration over delivery
Email, SMS, and push ran through established third-party providers, so the team owned the orchestration logic — when, what, and to whom — instead of delivery plumbing. I extended the existing GraphQL layer for communication needs rather than bolting on parallel REST, keeping caching, batching, and type safety consistent across the platform.
Recreated mockup — confidential engagement.
3 · Fan-out communications architecture
I designed and built the fan-out architecture that made multi-channel delivery reliable. A single communication event is dispatched across email, SMS, push, and in-app simultaneously. Each channel is handled independently: a failure in one does not block the others, and each can be scaled or replaced without touching the rest. The result is a delivery layer that holds under load and degrades gracefully when it doesn’t.
Recreated mockup — confidential engagement.
4 · CRM integration & modernization
Wired in-app messaging into Kustomer so the operations team saw every customer communication in one place, syncing message state across systems without coupling them. In parallel: surgical migration of legacy pathways to TypeScript — not a rewrite — plus Jest, Sinon, and Mountebank testing that mocks the third-party comms services for integration tests that don’t depend on them being up.
Recreated mockup — confidential engagement.
5 · Company-wide architecture sessions
Beyond my own team, I ran the weekly architecture sessions for the whole engineering organisation. Every week, engineers, architects, and leads picked a real platform problem and worked through solving it together. Running those sessions meant staying across decisions well beyond my own team’s remit. It’s a different kind of technical leadership: less about output and more about how the org thinks.
I came in as senior to extend and modernize an existing platform. Not to rebuild it from scratch. I led the team that owned communications end to end.
The outcome
Scalable, unified, easier to ship
No per-agency build
The multi-tenant architecture let new agency partners onboard through configuration, not bespoke engineering for each one.
One operations view
The CRM integration gave operations a single view of customer communications across every channel, cutting the context-switching that lost support quality.
Less friction to ship
Legacy → TypeScript modernization and the testing infrastructure lowered the cost of shipping each new communication feature.
The volumes stay confidential. What I can say is what changed: agencies onboard without custom work, operations works from one view, and the team ships against less debt.
Built with
- Node.js / TypeScript
- GraphQL (extended)
- Multi-tenant / white-label
- Kustomer CRM integration
- Jest · Sinon · Mountebank
- Terraform / AWS
Next case study
AI that reads case law
1,200+ judgments, 89 categories, ~$30. Published with a frank retrospective.
Leading a team through a system that has to stay up?
Multi-tenant scale, legacy debt, and a roadmap that can’t slow down.