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

End Tenancy Workflow

End Tenancy Workflow

Agents can schedule a tenancy to end on a specific date directly from the tenancy overview screen. The system handles status transitions automatically, creates close-out tasks, and surfaces the tenancy through the renewals dashboard pipeline.

Prerequisites

  • The tenancy must be in Active or Expiring status.
  • The selected end date must be today or in the future.

How to End a Tenancy

  1. Open the tenancy overview for the relevant tenancy.
  2. Click the End Tenancy button.
  3. In the dialog that opens:
    • Select an End Date (defaults to the current term end date, or 30 days from today).
    • Choose a Reason from the dropdown (see options below).
    • Optionally add Notes (up to 2,000 characters).
  4. Read the "What happens next" summary in the dialog.
  5. Check the confirmation checkbox.
  6. Click End Tenancy Now (if today) or Schedule End (if a future date).

End Reason Options

ValueLabel
tenant_noticeTenant gave notice
landlord_noticeLandlord gave notice
mutual_agreementMutual agreement
section_21Section 21 (no-fault eviction)
section_8Section 8 (grounds for possession)
break_clauseBreak clause exercised
end_of_fixed_termEnd of fixed term (not renewing)
otherOther

What Happens After Submission

Immediate (on submit)

  • Tenancy status is set to set_to_end (or immediately ended if the end date is today).
  • The active/periodic tenancy term is updated with the end date and ending status.
  • A renewal record of type end_tenancy is created at set_to_end status and appears in the renewals dashboard.
  • 4 close-out reminder todos are created:
    • Deposit return
    • Check-out inspection
    • Compliance review
    • Landlord notification
  • A tenancy.end_initiated audit event is recorded.
  • A tenancy/end-initiated Inngest event is emitted for downstream processing.

Tenancy Overview Indicators

  • The status badge displays in orange for set_to_end tenancies.
  • An alert banner appears on the tenancy overview showing the scheduled end date.
  • The term detail view shows the term type as ending.

Automatic Transition (daily cron)

A daily background job (end-tenancy-scan) runs at 06:00 UTC and:

  1. Finds all set_to_end tenancies whose end date has passed.
  2. Transitions each matching tenancy to ended.
  3. Transitions all linked tenancy terms to ended.
  4. Transitions linked renewal records from set_to_end to ended.
  5. Logs an audit event for each transition.

Note: If you set the end date to today, the tenancy is transitioned to ended immediately on submission — the cron job is not needed.

Renewals Dashboard Integration

ColumnWhen visible
Set to EndFrom submission until the end date passes
Ended (30-day)For 30 days after the end date, once transitioned by the cron

Status Transition Reference

active / expiring
       │
       ▼  (endTenancy mutation)
   set_to_end  ──────────────────────────────────┐
       │                                          │ (if end date = today)
       │  (daily cron at 06:00 UTC,               │
       │   after end date passes)                 │
       ▼                                          ▼
     ended                                      ended

API Reference

tenancy.endTenancy (tRPC Mutation)

Org-scoped mutation. Requires an authenticated session.

Input

FieldTypeRequiredDescription
tenancyIdstringID of the tenancy to end
endDatestring (YYYY-MM-DD)The date the tenancy should end (today or future)
reasonEndReasonOne of the 8 reason values listed above
notesstringOptional free-text notes (max 2,000 chars)

Validation errors

  • Tenancy not in active or expiring status → mutation rejected.
  • End date is in the past → mutation rejected.

Side effects on success

  • Tenancy status updated.
  • Active tenancy term end date and status updated.
  • Renewal record created (end_tenancy type).
  • 4 close-out todos created.
  • Audit event tenancy.end_initiated emitted.
  • Inngest event tenancy/end-initiated fired.

The following tRPC query caches are invalidated on success:

  • tenancy.getById
  • tenancy.listTerms
  • tenancy.getRenewals
  • tenancy.getTodos
  • tenancy.overviewCounts
  • renewals.pipelineSummary