← Back to work

Internship project · Instawork

Agentic Outreach Engine

Developed an outreach engine that identifies supply gaps and uses agentic workflows to tap into existing supply and grow supply.

RoleProduct Operations Intern
TimelineJun 2026 – Aug 2026
StackPython, SQL, generative AI APIs
StatusIn production

The problem

Instawork matches hourly professionals to shifts, and the shifts that don't fill are the whole problem. On an ordinary day that's 4,295 unfilled shifts spread across ten markets, far past what anyone can triage by reading a list. Some of them are genuinely urgent and some only look it, and the ones that matter are buried.

The harder part is that the right response is different for each one. A shift starting in four hours needs a text to somebody already nearby and already qualified. A shift thirty days out is an acquisition problem: you have time to run ads and wait for them to convert. Treating those the same wastes either the spend or the shift, and the tooling didn't distinguish them.

What I built

A dispatch board that pulls every unfilled shift across markets, ranks them by fill risk, and then, the part I care about, sizes an outreach plan against the lead time of what's actually open in that market, rather than applying one playbook everywhere.

The risk scoring underneath it is a simple neural network I trained to classify whether a given shift is likely to fill or go unfilled. That is what puts a percentage on a row and decides which shifts are worth intervening on at all, so the board leads with the bookings actually in trouble rather than the ones that merely look urgent.

Ordering the pros for a given shift is deliberately not a model. It ranks on what already predicts turnout well: how many past gigs a pro has worked and their reliability rating. That keeps the targeting explainable, which matters when someone has to justify why one pro got contacted first.

Dispatch board showing 4,295 unfilled shifts, 166 urgent within 24 hours, and 15,523 open slots, with market cards for ten metros each flagged at risk or on track.
The top of the board: global counters, market hotspots, and every market carrying its own unfilled count, requested-worker-only count and risk state. Markets sort themselves; you start where the bleeding is.

Drilling into a market splits its unfilled shifts into lead-time buckets (next 7 days, 8–29 days, 30+ days) and gives each bucket to the channel that can actually reach it in time. Every channel is sized against its own conversion rate, so the plan comes out in the units you'd actually act on: texts to send, dollars to spend, posts to write, invites to ask for.

  • SMS covers shifts under 7 days at a 26.5% conversion rate, the only channel fast enough for the near band.
  • Meta ads take the 30+ day bucket, where a 7.5% conversion rate and a ~$10 CPM still have time to pay off.
  • Reddit and referrals split the 8–29 day middle, at 1% and 3.7% respectively.
  • Each panel ends in the actual launch action, so the plan doesn't stop at a recommendation.

Those actions run the campaign rather than handing you a brief. The Meta panel builds and launches the campaign itself, sized to that market's budget and audience, so nobody opens Ads Manager to translate a recommendation into a live ad. The SMS panel generates the send-ready Juicebox sheet the same way.

Reddit works differently, and it's the piece I find most interesting. Agents write and post to the communities where hourly workers actually spend time, and those posts promote Instawork itself rather than any individual shift. Filling one booking helps one client; bringing new pros onto the platform deepens the pool every market pulls from. So the board does both at once: it closes the specific gaps in front of you, and it keeps growing the supply those gaps get filled from.

Bay Area channel plan splitting 1,353 unfilled shifts into lead-time buckets and sizing SMS, Meta ads, Reddit and referrals against each one.
Bay Area, 1,353 unfilled shifts split 21 / 44 / 35 across the lead-time bands, with each channel sized to the band it can reach.

Below the plan sits the shift level, where the work is triage rather than strategy: filters for position and market, toggles for the requested-worker-only shifts that outreach can't help, and exports that hand off to wherever the follow-up actually happens: an at-risk contact CSV, or the list DM'd to you on Slack.

Filterable shift table listing shift ID, venue, position, start time, hourly rate and fill status, with at-risk rows highlighted and per-shift risk percentages.
Individual shifts with fill status and a risk percentage; the highlighted rows are the ones trending toward going unfilled.

Opening a single shift shows who outreach should reach and in what order. Instawork dispatches in tiers, releasing a shift to progressively wider pools of pros, so the targeting view makes the current level explicit, showing how many pros are eligible right now, how many are still locked, and how reliable each one is, alongside whether anyone has actually contacted them yet.

Single shift view flagged as starting in under four hours with zero fill, beside a pros targeting dashboard showing dispatch level, eligible and locked pools, reliability scores and contact status. Worker identities are redacted.
A shift starting in under four hours with zero fill, at dispatch level 6 of 8, with 11,626 pros eligible, 140 still locked, none contacted. Worker names and contact details are blurred here.

What happened

The board is being deployed at Instawork, where account managers use it to see the unfilled shifts across the accounts they manage and to automate filling the ones the model flags as likely to go unfilled. That is the shift in how the work gets done: instead of an account manager scanning a list and guessing which bookings need attention, the ranking surfaces them and the outreach runs itself.

The change that mattered wasn't visibility, since the unfilled shifts were always countable. It was that the board turns a count into a decision. Lead time became the thing that picks the channel, which means the near-term shifts get the intervention that can still reach them and the far-out ones get spend that has time to convert.