Compliance Help & Regulatory Updates
Compliance Help & Regulatory Updates
The compliance dashboard includes two features designed to keep letting agents informed and guided at the point of action: contextual help articles embedded inside issue cards, and a Regulatory Updates feed that tracks UK letting law changes with per-user read tracking.
Contextual Compliance Help Articles
Where they appear
Help articles appear inline inside expanded issue cards on the Issues tab of the compliance dashboard. When you click an issue card to expand it, the ComplianceHelpInline component is rendered beneath the recommended action text. Each article is matched to the compliance rule that triggered the issue (ruleId).
What each article contains
- Summary — a concise plain-English explanation of the rule
- Full guidance body — expandable detailed guidance
- GOV.UK links — direct links to the authoritative legislation or government guidance page
Articles available at launch
| Rule | Legislation |
|---|---|
| Deposit protection 30-day deadline | Housing Act 2004 s.213 |
| Recording the deposit protection scheme | Housing Act 2004 |
| Deposit cap compliance | Tenant Fees Act 2019 |
| How to Rent guide serving | Deregulation Act 2015 |
| Renters' Rights Act 2024 — periodic tenancy transition | Renters' Rights Act 2024 |
| Section 21 abolition | Renters' Rights Act 2024 |
Data model
Articles are stored in the compliance_help_articles table and are lazily seeded on first access — no manual database seed command is needed after deployment.
Regulatory Updates Feed
Accessing the feed
The compliance dashboard now has two tabs at the top of the page:
- Issues — the existing compliance issues view (stats, portfolio table, open issues)
- Regulatory Updates — the new updates feed
The Regulatory Updates tab displays an unread badge (blue counter) whenever there are updates the current user has not yet read.
Update cards
Each update card shows:
- Title and category (severity-coded)
- Publication date
- Summary text, expandable to full detail
- Read/unread state (per user)
Marking updates as read
- Opening an update card marks it as read for the current user
- The Mark all read button dismisses all unread updates at once
- Read state is tracked per user — one user marking an update read does not affect other users in the same organisation
Pre-seeded updates
Five regulatory updates are included at launch:
- Renters' Rights Act 2024 Royal Assent
- Section 21 abolition — pending commencement order
- Deposit cap threshold confirmation
- How to Rent guide — January 2024 revision
- MEES EPC Rating E enforcement
Data model
| Table | Purpose |
|---|---|
regulatory_updates | Stores each regulatory change announcement |
regulatory_update_reads | Records which users have read which updates |
Updates have a regulatory_update_category enum field for categorisation and severity coding in the UI.
Weekly Notification Cron
A background job (regulatory-updates-notifier) runs automatically every Monday at 08:00 UTC via Inngest.
What it does
- Queries
regulatory_updatesfor any rows wherenotifiedAt IS NULL(i.e. updates that have never been notified) - For each qualifying update, dispatches an in-app notification to every member of every organisation
- Stamps
notifiedAton the update record to prevent duplicate notifications on future runs
Idempotency
The notifiedAt timestamp acts as the idempotency guard. An update will only ever trigger notifications once, regardless of how many times the cron runs.
tRPC API Reference
All compliance help and regulatory update operations go through the complianceHelp tRPC router.
Compliance Help Procedures
complianceHelp.helpForRule
Fetch the help article associated with a specific compliance rule.
const article = await trpc.complianceHelp.helpForRule.query({ ruleId: "deposit-protection-30-day" });
complianceHelp.listArticles
List all available compliance help articles.
const articles = await trpc.complianceHelp.listArticles.query();
complianceHelp.getArticle
Fetch a single article by its ID.
const article = await trpc.complianceHelp.getArticle.query({ id: "..." });
Regulatory Update Procedures
complianceHelp.listUpdates
List regulatory updates for an organisation, including per-user read state.
const updates = await trpc.complianceHelp.listUpdates.query({ orgId });
complianceHelp.unreadUpdateCount
Get the count of unread regulatory updates for the current user.
const { count } = await trpc.complianceHelp.unreadUpdateCount.query({ orgId });
complianceHelp.markUpdateRead
Mark a single update as read for the current user.
await trpc.complianceHelp.markUpdateRead.mutate({ updateId: "..." });
complianceHelp.markAllUpdatesRead
Mark all updates as read for the current user in the given org.
await trpc.complianceHelp.markAllUpdatesRead.mutate({ orgId });
complianceHelp.pushUpdateNotification
Internal procedure used by the Inngest cron. Dispatches an in-app notification for a regulatory update to all org members. Not intended for direct client use.
Components
| Component | Location | Purpose |
|---|---|---|
ComplianceHelpInline | src/app/dashboard/compliance/compliance-help-inline.tsx | Renders the help article panel inside an expanded issue card |
RegulatoryUpdatesPanel | src/app/dashboard/compliance/regulatory-updates-panel.tsx | Full regulatory updates feed with expandable cards and mark-read controls |
ComplianceDashboard | src/app/dashboard/compliance/compliance-dashboard.tsx | Root dashboard component — now includes the Issues / Regulatory Updates tab switcher |