Offers Pipeline Dashboard
Offers Pipeline Dashboard
The Offers Pipeline Dashboard provides a Kanban-style view of all rental offers, organised by stage. It supports property-scoped filtering, full-text search, and drill-down to individual offer details.
Accessing the Dashboard
Navigate to /dashboard/offers from the main dashboard sidebar.
Pipeline Stages
Offers move through 9 stages, each colour-coded for quick scanning:
| Stage | Colour |
|---|---|
| Invited | Blue |
| In Progress | Sky |
| With Agent | Indigo |
| Awaiting Amendments | Amber |
| Sent to Landlord | Orange |
| Landlord Reviewed | Purple |
| Accepted | Green |
| Rejected | Red |
| Cancelled | Gray |
Offer Cards
Each card in the pipeline displays:
- Property address (with map-pin icon)
- Applicant name
- Offered rent (monthly)
- Last-updated timestamp (relative, e.g. "3 hours ago")
Clicking a card navigates to the Offer Detail Page at /dashboard/offers/[id].
Filtering & Search
Property Filter
A dropdown above the board lists all active properties. Selecting a property filters the pipeline to show only offers for that property.
The selected property is reflected in the URL as a query parameter:
/dashboard/offers?propertyId=<property-id>
This URL can be bookmarked or shared to land directly on a property-scoped view.
Search
The search bar filters offer cards by applicant name or property address. Search and property filter can be used together.
Offer Detail Page
URL: /dashboard/offers/[id]
The detail page shows the full record for a single offer:
| Field | Description |
|---|---|
| Applicant | Name of the applicant |
| Property | Property address |
| Offered Rent | Monthly rent amount |
| Assigned Agent | Agent assigned to the offer |
| Created | Exact date and time the offer was created |
| Last Updated | How long ago the offer was last updated |
The current pipeline status is displayed as a colour-coded badge at the top of the page (colours match the pipeline stage colours above).
A Back to offers link returns to the pipeline view.
Loading & Error States
- While the offer is loading, a skeleton placeholder is shown
- If the offer cannot be found or an error occurs, an error message is displayed with the back link still accessible
Data & API
Schema
The offers table includes the following fields relevant to the pipeline:
| Column | Type | Description |
|---|---|---|
propertyId | string | References the associated property |
propertyAddress | string | Denormalised address for display and search |
An index (offers_property_idx) is maintained on propertyId for efficient filtering.
tRPC Queries
| Query / Mutation | Description |
|---|---|
offer.list | Returns paginated offers; accepts propertyId filter and text search across applicant name and property address |
offer.pipelineSummary | Returns per-stage counts; accepts propertyId filter |
offer.listProperties | Returns active properties for the filter dropdown |
offer.getById | Returns a single offer by ID |
offer.create | Creates an offer; accepts propertyId and propertyAddress |
offer.update | Updates an offer; accepts propertyId and propertyAddress |
All mutating operations (create, update, status change) emit an audit log entry via logAudit.
Errors are returned as typed TRPCError codes (e.g. NOT_FOUND, BAD_REQUEST) rather than generic exceptions.