Candidate texting desk for your open Greenhouse roles

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.

App
LinqGreenhouseHR & PeopleOperationsData SyncContent Generation
PromptCreate

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.

What does this prompt do?

  • Pick an open role and see every active candidate grouped by hiring stage, each card showing their last text and how long they have been waiting on a reply.
  • Read the whole conversation and reply from your team's work number, with a badge telling you whether it will land as an iMessage or a plain text.
  • Every message is filed back onto the candidate's Greenhouse profile, so the thread is not trapped on somebody's phone.
  • Tap Draft outreach and an assistant reads the candidate's history and writes a stage-appropriate text for you to edit. Nothing sends on its own, and nothing sends outside 8am to 8pm.

What do I need to use this?

  • A Greenhouse account you can connect, with permission to read candidates and jobs and to add notes and move applications
  • A Linq account with at least one phone number assigned to your team for sending. Linq sets these up with you, they are not self-serve
  • Mobile numbers on your candidate profiles in Greenhouse. Candidates without one show as not textable
  • A recruiter or two to assign to each sending line

How can I customize it?

  • Change the quiet hours window from the default 8am to 8pm, or set a single company timezone instead of using each candidate's local time
  • Give every recruiter their own sending number, or run the whole team off one shared line
  • Choose which roles and stages appear on the board, and how long a candidate can wait before their card turns red
  • Adjust the tone and length of the drafted texts, or write different guidance per stage

FAQs

Do candidates need an iPhone for this to work?
No. The app checks each number before you start typing and shows a badge saying whether the message will arrive as an iMessage, an RCS message, or a standard text. It picks the best available option automatically, so anyone with a mobile number can be reached.
Will the texts show up in Greenhouse?
Yes, and that is the point. Every outbound message is filed onto the candidate's profile as it is sent, and the Log to Greenhouse button files a full conversation summary as a single note. Anyone on the hiring team can see the texting history the same way they see emails and phone notes.
Can it accidentally text someone at 2am?
No. Nothing sends outside 8am to 8pm in the candidate's local time. Outside that window the send button is switched off and shows their local time, and you can queue the message to go out as soon as the window opens.
Does the assistant send messages on its own?
Never. Draft outreach reads the candidate's record and history and writes a suggested message into the reply box. A recruiter always reads it, edits it, and presses send.
What happens to candidates with no mobile number?
Their card still shows on the board so you know they exist, but it is greyed out with the reply box switched off and a short note explaining that there is no mobile number on file. Nothing gets sent to a landline.

Related templates

Linq phone line health and deliverability dashboard

See every Linq sending number in one place: how much it sent, how much actually landed, and whether your texts arrive as blue bubbles or green ones.

Linq
Google Sheets
App
Find the customer texts that never made it into your CRM

Open one board each week to see every text conversation with no record in your CRM, then file a clean summary against the right customer in a click.

Linq
HubSpot
App
Compensation workbench for your open Greenhouse requisitions

See every open role's posted pay band next to what the market is actually advertising, with the roles priced furthest below market floating to the top.

JobsPipe
Greenhouse
Google Docs
App
Candidate chase desk that restarts quiet applicants on WhatsApp

See every candidate who has gone silent on your open roles, how long they have been quiet, and restart them on WhatsApp in one click.

Heyy
Greenhouse
App
Hiring debrief room where every rating shows its evidence

See every interviewer's scores next to what the candidate actually said, spot where the panel disagrees, and catch ratings nothing backs up.

Google Meet
Greenhouse
Google Calendar
App
Take-home review desk that runs candidate code in a sandbox

See every take-home waiting on a verdict, read the code in the app, and have it built and tested in a throwaway machine instead of on your laptop.

Daytona
Greenhouse
GitHub
+1
App

Stop running candidate texts off a personal phone.

Give your recruiters one board for every open role, with every message filed straight back onto the candidate record.