Recruiting analytics dashboard for every open Breezy HR role

By General Input

See every open role, where candidates are stalling, and which sources actually produce hires, then export the numbers to Google Sheets.

Integrations

  • Breezy HR
  • Google Sheets

Type

App

Categories

  • HR & People
  • Operations

Build me an interactive recruiting analytics app on top of Breezy HR that answers the questions Breezy's own reporting cannot: where candidates are stalling, and how each open role is really tracking. The audience is our recruiting lead and head of people. They open it weekly before pipeline reviews and monthly when they need real numbers for an exec deck. This is a dashboard someone explores, not a scheduled report, so nothing should run on a timer or message anyone.

Data loading. Resolve the company once at startup with List Companies, then do all reads in server side handlers. Use List Positions filtered to open roles, List Candidates for Position for each role, and Get Pipeline to get the canonical stage list and its correct order. Every chart and table must order stages the way Get Pipeline defines them, never alphabetically or by count. Breezy's list endpoints return the full array with no cursors, apart from candidate search, so fetch complete sets in the handler and aggregate server side rather than paging in the UI. Keep the request rate under roughly 5 per second, throttle the fan out across positions and candidates, and on a 429 wait for the reset header and retry once. Cache the aggregates for the session and give the user a manual refresh button.

Landing view: every open position. Show the role title, department and location, days open computed from the position creation date, total active candidates, the count sitting in each stage, and a horizontal funnel conversion bar segmented by stage in pipeline order so drop off is visible at a glance. Let the user sort by days open, candidate volume, or number of stalled candidates, and filter by department. Clicking a role opens its detail view.

Role detail view. Show stage by stage conversion, meaning the pass through rate between each pair of consecutive stages plus the cumulative rate from first application, and the average and median time candidates spend in each stage. Important implementation note: time in stage is not a field on the candidate. Derive it from the stage change entries in Get Candidate Stream. For each candidate on the position, pull their stream, keep the stage change events, sort them chronologically, and measure the interval between consecutive changes. For the stage a candidate currently sits in, measure from their most recent stage change to now. Fetch these streams concurrently but rate limited, and show a loading state since this is the slowest part of the app.

Stalled candidates panel inside the role detail view. List every candidate who has been sitting in a single stage longer than a configurable threshold, defaulting to 10 days, showing name, current stage, days in stage, and the date of their last activity from the stream. The threshold is an app setting the user can change, it persists between sessions, and the flagged list recalculates immediately when it changes. Where a candidate has no recorded stage changes, show not enough data rather than zero days.

Source breakdown view. Group candidates across all open roles by their source field and show, per source, total candidates, how far they get as counts by furthest stage reached, hires, and the conversion rate from applicant to hire. The point is to reveal which channels produce hires rather than which produce volume, so sort by hire rate by default and let the user filter to a single position or a date range.

Export. Put an Export button on every view that writes exactly what the user is currently looking at, including their active filters and threshold, to a Google Sheets tab using Append Values. Persist the spreadsheet id and tab name in app settings so repeat exports land in the same place, and if the tab does not exist yet create it first with Batch Update Spreadsheet. Write a header row plus one row per record, stamp every exported row with the export timestamp and the view it came from, and append below existing rows so past exports are preserved. Use the user entered input option so numbers, percentages, and dates arrive as real values a recruiting lead can chart, not as text.

Handle empty states properly throughout: a role with no candidates, a stage nobody has reached, and a stream with no stage changes should all render a clear message instead of a broken chart or a misleading zero.

Related prompts

Explore more prompts
Call overdue Xero customers with an AI collections agentLocal listing health board for every location you manageLet support send one-off Loops emails without an engineerStop cold emails to anyone with a live deal in PipedriveiMessage campaign console with pre-flight checks and delivery boardLinkedIn Ads budget pacing dashboard for every client accountFront desk appointment confirmation board for the next 3 daysGive your team Looker numbers without buying more seatsBuild audience segments from product usage and push to LoopsTurn the people who engage with your posts into Pipedrive leads