Candidate texting desk for your open Greenhouse roles

By General Input

Open one board each morning to see every candidate by stage, read their full text thread, and reply from your work number instead of your phone.

Integrations

  • Linq
  • Greenhouse

Type

App

Categories

  • HR & People
  • Operations

Build me an internal app my recruiters open every morning to run candidate texting for our open roles in Greenhouse, so nobody is copying phone numbers into their personal phone. It is one main surface: a pipeline board on the left and a conversation pane on the right. Texting runs on Linq, which sends iMessage, RCS, and SMS from phone numbers assigned to our account.

At the top of the board is a job picker populated from Greenhouse List Jobs, limited to open jobs. Picking a job loads its stages with List Job Stages and every active application on that job with List Applications, then groups the applications into a column per stage in pipeline order. For each application, call Get Candidate to pull the profile and phone numbers. Cache the job, stage, and candidate reads for a few minutes so switching roles is fast and we stay inside the Greenhouse rate limit of roughly 50 requests per 10 seconds.

Each card shows the candidate name, the role and current stage, a one line preview of the last message in their text thread with whether it came from us or from them, and how long they have been waiting on a reply, rendered as an age like 2d waiting and colored so anything past 24 hours stands out. Cards also carry a delivery badge reading iMessage, RCS, or SMS, plus a no mobile state. Sort each stage column with the longest wait at the top, because the whole point of the board is that nobody falls through.

Clicking a card opens the conversation on the right. Find the candidate's existing thread by matching their E.164 mobile number against Linq List Chats, then load the full thread with List Messages, oldest at the bottom, showing send time and delivery status on each outbound bubble. Under the thread is a reply box that sends from the recruiter's assigned line: if no chat exists yet use Create Chat with the initial message, and if one does use Send Message. After the recruiter replies or marks the card handled, call Mark Chat Read so the thread stops showing as unread for the rest of the team.

Before the recruiter writes anything, show how the message will land. Run Check iMessage Capability on the candidate's number and render an iMessage badge if it passes, otherwise RCS or SMS. Linq limits capability checks to one per 10 seconds per address, so cache the result per candidate for at least a day and reuse it across the board rather than checking on every render. Only candidates with a mobile number are textable: if Get Candidate returns no mobile phone, the card renders greyed with the reply box disabled and a short note explaining why. Do not hide it, because recruiters still need to know that person is in the pipeline.

Quiet hours are a first class rule, not a warning banner. Nothing sends outside 8am to 8pm in the candidate's local time, inferred from their phone number with the recruiter able to override the timezone per candidate. Outside that window the send button is disabled and shows the candidate's local time, and the recruiter can queue the message to go out when the window opens. Also respect Linq's limit of 30 messages per rolling 60 seconds per sender and recipient pair, and surface a plain language retry message rather than a raw error if a send is throttled.

Every outbound text is logged back to Greenhouse with Add Candidate Note so the thread is never trapped on someone's phone. Log automatically on send with the message body, the sending number, and the timestamp. The Log to Greenhouse button on each card files a fuller conversation summary as a single note: who reached out, what the candidate said, which number it went to, and the next step. Greenhouse writes need an On Behalf Of user, so pull the recruiter list once with List Users and let each person pick their Greenhouse identity in settings, so notes are attributed to a real recruiter.

The second button on each card is Draft outreach, and it kicks off a background agent. The agent reads the candidate record with Get Candidate and their history with Get Candidate Activity Feed, pulls role context with Get Job, and writes a short stage-appropriate text: a first touch on a new application reads differently from a scheduling nudge at onsite or a check in on a quiet finalist. It writes the draft into the reply box for the recruiter to edit and send, and it never sends on its own. Show the card in a drafting state while it runs, drop the result into the reply box when it finishes, and include a one line note on what it based the draft on.

When a candidate confirms interest in the thread, the recruiter should be able to move them without leaving the app. Put an Advance stage control on the card and in the conversation header that calls Advance Application to push the application to the next stage in its pipeline, with a confirmation naming the stage they are moving to, then refresh the board so the card lands in its new column. For skipping ahead or rewinding, offer Move Application to Stage behind a stage picker.

A small settings view holds the setup: pull the account's sending numbers with List Phone Numbers and let an admin assign a line to each recruiter, set the quiet hours window and default timezone behavior, and map each recruiter to their Greenhouse user. Persist the recruiter to line assignments, the capability cache per candidate, the mapping between Greenhouse candidate ids and Linq chat ids, unsent drafts, and which conversations have already been logged so we never file duplicate notes. The board should default to the signed in recruiter's own candidates with a toggle to see the whole team's.

Related prompts

Explore more prompts
Linq phone line health and deliverability dashboardFind the customer texts that never made it into your CRMCompensation workbench for your open Greenhouse requisitionsCandidate chase desk that restarts quiet applicants on WhatsAppHiring debrief room where every rating shows its evidenceTake-home review desk that runs candidate code in a sandboxNew hire paperwork board that shows who is ready for day oneInterview debrief desk that gets feedback written the same dayTalent sourcing workbench for every open Greenhouse roleSourcing bench for each open role, straight into Greenhouse