Tenlord
Full-stack|PropTech / landlord compliance
TLDR
UK landlord SaaS for properties, compliance documents, reminders, and billing. Next.js clients, ASP.NET API on a VPS, serverless functions for async work, Postgres, payment provider, message bus.
Context. Landlords need a reliable place to track legal deadlines, documents, tenants, and payments, including billing edge cases and reminder schedules.
Architecture
System diagram

Component map
As deployed
Landlord / tenant web
Next.js 16
Admin app
Next.js
Tenlord API
ASP.NET Core on Docker / VPS
serverless functions
Payments, email, SMS, timers
message bus
notifications topic
object storage
Documents and media
PostgreSQL
EF Core
payment provider
Subscriptions
LLM provider
Compliance insights
What shipped
- Clean Architecture with Domain, Infrastructure, Shared, API, and Functions projects
- Vertical-slice handlers under api/v1 instead of a thick Application layer
- Landlord-scoped data model: Property to Unit to Occupant / Tenant
- Payment provider freemium plans with idempotent webhook processing
- Email, SMS, and payment side effects moved onto message bus consumers
- Product analytics and feature flags for gradual rollout and behaviour insight
- Monitoring and observability across API, workers, and dependency health
Backend
- REST under api/v1 for auth, properties, units, documents, maintenance, messaging, dashboard, and admin
- JWT roles plus per-handler plan checks for freemium limits
- EF Core and Postgres for subscriptions, compliance cache, audit, and payment event dedupe
- IMemCache today, with a clear path to Redis if the API scales out
- LLM provider compliance analysis cached in the database to avoid repeat spend
- Structured logs, metrics, and traces for latency, failure modes, and queue lag
Request and event flow
- 01Landlord starts payment checkout from the API
- 02Payment provider posts to the payment webhook endpoint
- 03checkout.session.completed is published to the message bus
- 04PaymentProcessor Function applies the subscription in a transaction
- 05Confirmation email is queued and sent by a notification Function
- 06Timers send daily compliance reminders and verification nudges
API domains
- Auth and users
- Properties and units
- Documents and compliance
- Maintenance
- Messaging
- Payments and payment provider webhooks
- Admin
Key decisions
- Next.js for client shells with clear data boundaries; compliance and domain reads stay on the ASP.NET API.
- Keep the HTTP path on the API. Put mail, SMS, and payment apply on serverless functions so retries sit with Azure.
- Verify payment provider webhooks, then process checkout completion through the message bus with processed payment event records for idempotency.
- Cache LLM provider compliance results in Postgres by property and input fingerprint to avoid repeat model calls.
- Use IMemCache for hot landlord reads now, with a clear swap path to Redis if the API scales beyond one instance.
- Run the API in Docker on a VPS for cost control. Keep serverless functions on Azure Flex Consumption for async and scheduled work.
- Ship analytics and feature flags early so product changes can be measured and rolled out safely.
- Treat monitoring and observability as part of the platform: health checks, metrics, and traces on API and workers.