Archive Typeform job applications and screen every resume

By General Input

Every hour, new applications get their resumes and portfolios saved for good, read against the role, and ranked in a Slack digest.

Integrations

  • General Input Storage
  • Typeform
  • Google Sheets
  • Slack Bot

Type

Agentic Task

Categories

  • HR & People
  • Operations

Every hour, pull new submissions from my Typeform job application form, archive every file the candidate uploaded into General Input Storage, and hand me a screening summary. Run this on an hourly cron schedule.

Start by fetching new responses with Typeform's Retrieve Responses on my application form, filtered to submissions since the last successful run. Typeform can take up to about thirty minutes to make a brand new submission available through its API, so query with a two hour lookback window rather than an exact watermark, and then drop any response whose id you have already processed. Keep the processed response ids and the last run timestamp in workflow state so nothing is screened twice and nothing is quietly missed.

Each application carries a resume upload and an optional portfolio upload. For every file upload answer on a response, download the bytes with Typeform's Get Response File, then archive the file with General Input Storage. Ask for a presigned PUT with Presign Upload, passing the real byte size and content type, and send the bytes directly to that URL. The archived copy is the copy of record, because Typeform only holds uploaded files for as long as the form itself lives.

Name each object applications/<role>/<candidate>/<document>.<ext>, for example applications/account-manager/jane-doe/resume.pdf and applications/account-manager/jane-doe/portfolio.pdf. Slugify the role and the candidate name into lowercase hyphenated segments, stripping anything that is not a letter, number, or hyphen. Storage keys allow forward slashes only, with no leading slash, no . or .. segments, and a 1024 character cap, so always build the key from slugified parts rather than from raw form answers. If two candidates slugify to the same name, append the short Typeform response id to the candidate segment so neither file overwrites the other. Keep the original file extension. Each object can be up to 5 GB, which is plenty for a design portfolio.

Then read each resume against the role requirements below and write a short assessment, no more than a short paragraph per candidate, covering three things: the relevant experience they actually have, the obvious gaps against the requirements, and a recommended next step such as phone screen, take home, ask for missing information, or hold for a later role. Give each candidate a rank of strong, promising, or unclear, and say in one line what drove the rank. When a portfolio is attached, factor in what you can tell from it, and say plainly when you cannot open or judge it.

Role requirements: Account Manager. Three or more years managing a book of B2B accounts, ownership of renewals and expansion, clear written communication, and hands on experience with a CRM. Nice to have: agency or SaaS background and comfort with a technical product. Replace this block with the role I am actually hiring for.

Append one row per candidate to my Google Sheets candidate tracker using Append Values. Columns: submission date, candidate name, email, role, rank, one line summary, relevant experience, gaps, recommended next step, resume storage key, portfolio storage key, and the Typeform response id. Write the storage keys as plain text so anyone on the hiring team can pull the original document later, long after the form is gone.

Finish each batch with one digest posted to my hiring channel in Slack using Send a Message, strongest candidates first. Open with how many new applications came in this run, then give a short block per candidate: name, rank, one line on why, the recommended next step, and the storage key for their resume. If the batch has no new responses, post nothing at all rather than an empty update.

One firm rule: never auto-reject anyone and never email a candidate. Do not mark anyone rejected in the tracker and do not phrase the digest as a decision. Rank and summarize only, and leave the call to a person. If a resume is unreadable or a file fails to download, still create the tracker row and still list the candidate in the digest, flagged as needing manual review, rather than dropping them from the batch.

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 engineerA brand asset library your marketing team actually searchesTurn Mailjet email clicks into ranked HubSpot follow-upsClean out the Looker dashboards and Looks nobody opensStop cold emails to anyone with a live deal in PipedriveLiveKit live operations console for room moderationWake up dormant Keap leads with a researched reasoniMessage campaign console with pre-flight checks and delivery board