Weekly contractor extension push for expiring placements
Every Tuesday, find the placements ending in the next 30 days, rank them by revenue at risk, and DM each recruiter their own call list.
Every Tuesday at 9am, run an extension push on the placements that are about to end, so recruiters get a ranked call list while there is still time to act on it.
Start in Timesheet Portal. Use List Jobs to pull the current placements, and keep only the ones whose end date falls inside the next 30 days. Treat that 30 day window as a setting I can change, since notice periods vary by client.
For each placement that survives the filter, find the matching record in Bullhorn using Search Entities with a Lucene query against Placement. Match on candidate name plus client plus end date, and use Get Entity by ID to pull the detail you need: the owning recruiter, the client contact, and the linked job order. Only accept a match when candidate, client and end date all line up. If there is no confident match, keep the placement in the recruiter message but do not write a note against any Bullhorn record. A note saved on the wrong placement is worse than no note.
Attach the billing evidence with Get Time and Cost Report in Timesheet Portal: hours billed to date on each placement, and the weekly run rate over the recent weeks so the trend is visible rather than a single total. The Timesheet Portal report endpoints are rate limited far more tightly than the entity endpoints, so pull one report covering the whole date range and all the placements at once and split the rows per placement afterwards, rather than calling the report once per placement.
Judge each placement on the evidence rather than treating them all the same. Steady weekly hours running right up to the end date is a likely extension, so say so and give the recruiter the number to lead with. A recent drop off in hours, or an end date that has already been extended once, is at risk and should be called out as such with the reason. Where the hours have effectively stopped or the case is otherwise weak, say plainly that the conversation is probably not worth the call. Do not pad the list to make it look busy. Work out the annualised billings at risk for each placement by projecting the recent weekly billing run rate over a full year.
For every placement with a confident Bullhorn match, write a Note against the Bullhorn placement using Create Entity. Summarise the extension case in a few lines: the end date, hours billed to date, the recent weekly run rate, the direction of travel, your read on whether this one extends, and the annualised billings at risk if it does not.
Then message the recruiters. For each owning recruiter, look up their Slack user from the email on their Bullhorn record, open a direct message, and send them only their own expiring placements. Order the list by annualised billings at risk, highest first, so the most expensive conversation sits at the top. For each placement include the candidate, the client, the end date, hours billed to date, the weekly run rate, your read, and the money at risk. Do not message a recruiter who has nothing expiring this week, and never put one recruiter's placements in another recruiter's message.
Close each message with any placements that could not be confidently matched in Bullhorn, listed separately so someone can fix the underlying record. Keep the 30 day window and the ranking measure easy for me to change.
What does this prompt do?
- Every Tuesday morning, checks which of your live placements are due to end in the next 30 days.
- Pulls the hours actually worked and billed on each one, so you can see at a glance who is still busy and who has gone quiet.
- Writes a short extension summary onto the placement record in your CRM, so the reasoning is there for whoever picks the conversation up.
- Sends each recruiter a direct message covering only their own expiring placements, biggest revenue at risk first, with a straight read on which ones are worth chasing and which are not.
What do I need to use this?
- A Timesheet Portal account where your placements and timesheets are managed
- A Bullhorn login with permission to read placements and add notes
- A Slack workspace for your recruitment team
- Recruiters using the same email address in Slack as on their Bullhorn record, so the right person gets the right list
How can I customize it?
- Change the 30 day window to match the notice period your clients actually work to
- Change the day and time it runs, or move it to fortnightly if your contracts are longer
- Change how the list is ranked, for example by margin or by client rather than by annual billings at risk
FAQs
What happens if a placement does not match a record in Bullhorn?
Does it change anything in Bullhorn?
How does it decide which extensions are worth chasing?
Will it message recruiters who have nothing expiring?
Does it contact the client or the contractor?
Related templates
When someone leaves, we check which shared passwords they used in their final months and post a ranked rotation list to your security channel.
Every Monday, check every S3 bucket for public exposure, missing encryption and weak backup settings, then get the risks ranked in Slack.
Twice every weekday, the conversations from your social inbox land on the right HubSpot contact timelines, with a Slack recap for sales.
Every morning, find the addresses that hard bounced or filed a spam complaint, update the matching HubSpot contacts, and post a short Slack recap.
Every weekday at 4pm, spot the threads that went quiet, stage a ready-to-send nudge in your mailbox, and get a ranked Slack recap.
When you merge a fix in GitHub, this agent checks the matching dead-letter queue, replays the failed messages, and reports back on the pull request and in Slack.
Stop losing extensions because nobody was watching the end dates.
Extension revenue is the cheapest revenue an agency has. This runs the check every week so it never depends on someone remembering.