Renewals Pipeline Dashboard
Renewals Pipeline Dashboard
The Renewals Pipeline Dashboard gives agents a single place to track every tenancy renewal from initial decision through to completion or end. It is available at /dashboard/renewals and uses a Kanban-style layout consistent with the Offers pipeline.
Accessing the Dashboard
Navigate to Renewals in the main dashboard sidebar. The link appears between Tenancies and Portfolio.
Pipeline Layout
The dashboard is organised into 7 status columns, each representing a distinct stage of the renewal lifecycle.
| Column | Scope | Sorted by |
|---|---|---|
| Decision Required | Renewals with a term end date within the next 90 days | Soonest term end date first |
| Renewal In Progress | Renewals actively being negotiated or processed | Last updated |
| Renewal Confirmed | Renewals agreed and awaiting final completion | Last updated |
| Renewed | Renewals completed in the last 30 days | Completion date |
| Set to End | Tenancies confirmed as ending | Term end date |
| Ended | Tenancies that ended in the last 30 days | End date |
| Action Required | Overdue items flagged for urgent attention | Days overdue |
Summary Bar
Above the pipeline columns, a summary bar shows a filter chip for each bucket with a live count of renewals in that state.
- Click a chip to collapse all other columns and focus on a single stage.
- The total count of active renewals is displayed alongside the chips.
- Click the active chip again (or any other chip) to change the focus or reset to all columns.
Renewal Cards
Each card in the pipeline represents one renewal record and displays:
- Property address — full address of the let property
- Tenant name — primary tenant on the tenancy
- Monthly rent — current rent, with an arrow to the proposed rent if a change has been made
- Urgency badge — colour-coded indicator based on days until the term end date:
- 🔴 Red — overdue, or 7 days or fewer remaining
- 🟡 Amber — 8–30 days remaining
- 🔵 Blue — 31–90 days remaining
- No badge — more than 90 days remaining
- Renewal type badge — one of:
Fixed Term— a new fixed-term tenancy agreementPeriodic— rolling periodic tenancyEnd Tenancy— tenancy will not be renewed
- Term end date — formatted end date of the current term
- Assigned agent — name of the agent managing the renewal
- Last updated — relative time since the renewal record was last modified
Clicking a card navigates to the full tenancy overview page at /dashboard/tenancies/[id].
Action Required Cards
The Action Required column uses red-themed cards to highlight urgency. Each card shows:
- Days overdue
- Property address and tenant name
- Assigned agent
Clicking an Action Required card navigates directly to the tenancy detail page.
Empty States
If a column contains no renewals, an empty state is shown with a link to the Tenancies page for guidance on creating or managing tenancies.
Backend Procedures
The dashboard is powered by three tRPC procedures in the renewals router. All procedures are org-scoped.
renewals.pipelineSummary
Returns aggregated counts for each of the 7 buckets. Rolling-window filtering (90-day for Decision Required; 30-day for Renewed and Ended) is applied server-side.
Response shape (per bucket):
{
decision_required: number;
renewal_in_progress: number;
renewal_confirmed: number;
renewed: number;
set_to_end: number;
ended: number;
action_required: number;
}
renewals.pipelineItems
Returns the full list of renewal records for a given bucket, with joined data from tenancyTerms, tenancies, and agent profiles.
Input:
{
bucket:
| "decision_required"
| "renewal_in_progress"
| "renewal_confirmed"
| "renewed"
| "set_to_end"
| "ended"
| "action_required";
}
Each item includes:
{
id: string;
tenancyId: string | null;
tenancyTermId: string | null;
status: string;
renewalType: "new_fixed_term" | "periodic" | "end_tenancy" | null;
propertyAddress: string | null;
tenantName: string | null;
monthlyRent: string | null;
termEndDate: Date | null;
proposedRent: string | null;
agentName: string | null;
updatedAt: Date;
decisionTriggers: {
within90Days: boolean;
within7Days: boolean;
daysUntilEnd: number;
} | null;
}
renewals.resolveTenancyId
Helper procedure that resolves the tenancy navigation target from a renewal ID. Used internally to build card navigation links.
Input:
{ renewalId: string }
Response:
{ tenancyId: string | null }
Data Sources
The renewals dashboard queries the following existing tables — no schema changes were required for this feature:
renewals— core renewal records and statustenancyTerms— term start/end dates and rent amountstenancies— property and tenant associationsactionRequiredFlags— overdue action flags powering the Action Required column