Workflow 0 is triggered manually via an n8n form URL. It accepts a PDF CV upload, extracts text, uploads the CV to Google Drive, and runs two sequential OpenAI agents: one builds a canonical candidate profile, and another generates multiple strategically differentiated profile variants. Each variant is split into a separate Airtable Profile record containing fields such as type, summary, skills, preferences, visa constraints, and locations.
Workflow 1 runs on a scheduled trigger (Monday–Friday at 09:00). It loads active profiles from Airtable, selects one per day using day-of-week rotation, and calls an OpenAI agent to generate two LinkedIn search configurations scoped to the UK, full-time roles, and tech industry IDs 4/5/6 with maxItems=7 each. A subflow validates the generated configs before Apify harvests jobs. The workflow deduplicates fetched jobs by job ID and company, upserts company records, and creates Job records in Airtable with status LISTED.
Workflow 2 receives Airtable webhook events for every job status change. It validates the webhook payload, then re-reads the full job record from Airtable to avoid relying on incomplete webhook content. A Switch node routes to the correct downstream workflow for each active transition: LISTED → DETAILED → SCORED → COMPANY_ENRICHED → CONTACTS_FOUND → TAILORED → READY_TO_APPLY. Each stage workflow begins with a Validate Inputs Code node to enforce preconditions (status and required fields) and throws explicit field-level errors to make failure modes visible in the n8n execution log. Stage workflows call OpenAI and/or Apify as required, write structured text snapshots to Google Drive, create Document records in Airtable, and advance the job status when complete.
OpenAI calls use the Responses API via n8n’s OpenAI/langchain node with json_schema structured outputs (additionalProperties:false and strict:true on schemas). A shared subflow (OpenAI Response Validator & Payload Extractor) unwraps outputs from the expected content path (output[0].content[0].text) and throws if the response status is not completed. Per-job artifacts are organized into Google Drive folders named {Job Title} - {Company} - {Job ID}.
Workflow 8 validates that tailored CV and cover-letter documents exist, merges job metadata (title, company, location, fit score, visa risk, application type), and sends a Slack structured block message including a fit-score label (High/Medium/Low) plus action buttons (Apply, View CV, View Cover Letter). It then sets the job status to READY_TO_APPLY.
A Python 3 sanitization script (scripts/sanitize_n8n_exports.py) is used to strip private identifiers from exported workflow JSON while preserving node structure, routing logic, prompts, and architecture for publishing.