Skip to main content
All Docs
FeaturesPurple PepperUpdated April 6, 2026

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.

ColumnScopeSorted by
Decision RequiredRenewals with a term end date within the next 90 daysSoonest term end date first
Renewal In ProgressRenewals actively being negotiated or processedLast updated
Renewal ConfirmedRenewals agreed and awaiting final completionLast updated
RenewedRenewals completed in the last 30 daysCompletion date
Set to EndTenancies confirmed as endingTerm end date
EndedTenancies that ended in the last 30 daysEnd date
Action RequiredOverdue items flagged for urgent attentionDays 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 agreement
    • Periodic — rolling periodic tenancy
    • End 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 status
  • tenancyTerms — term start/end dates and rent amounts
  • tenancies — property and tenant associations
  • actionRequiredFlags — overdue action flags powering the Action Required column