Upload a job posting (PDF, image, or screenshot) and instantly get a tailored CV section and a matching cover letter – both written in the posting's language and tone, both honest about what you actually have. The workflow scores how well your stored CV matches the posting before and after AI rewriting, so you can see exactly how much keyword surfacing happened. Anything you don't actually have lands in a gaps array – never invented into bullets.
This workflow assumes a populated Master CV Google Sheet. If you haven't run the CV Onboarding (easybits) workflow yet, do that first – it'll extract your CV into the right structure.
On n8n Cloud the easybits Extractor is available out of the box. On self-hosted n8n, install it via Settings → Community Nodes → enter @easybits/n8n-nodes-extractor.
Sign up at easybits.tech for a free API key. Open the easybits: Extract Job Posting node and connect your credential.
The Extractor uses 10 fields to pull structured data from the job posting. Paste each description into the corresponding field's description box:
job_title (string)
The exact job title as written in the posting. If multiple titles are mentioned, return the primary one. Return null if not stated.
company (string)
The hiring company's name. Return null if not stated or if the posting is from a recruiter without naming the company.
seniority (string)
One of: intern, junior, mid, senior, lead, principal, executive. Infer from title and years-of-experience requirements. Return null only if there is no signal at all.
must_have_skills (array)
Skills, tools, or specific qualifications the posting explicitly lists as required, must-have, mandatory, or essential. Return as SHORT noun phrases (1-3 words each). Examples: "Python", "PostgreSQL", "Kafka", "5 years experience", "fluent German". DO NOT return full sentences or full requirements. Break compound requirements into individual atoms – e.g., "Solid understanding of testing, monitoring, and profiling" must be returned as three separate items: "testing", "monitoring", "profiling". DO NOT include soft skills like "problem-solving" or "attention to detail". Return empty array if none are explicitly required.
nice_to_have_skills (array)
Skills listed as preferred, bonus, plus, nice-to-have, or "ideally". Same format as must_have_skills. Return empty array if none.
responsibilities (array)
Concrete duties or tasks the role involves, as short action phrases. Maximum 8 items. Empty array if the posting is purely qualifications-focused.
keywords (array)
Domain-specific terms, technologies, methodologies, or industry vocabulary worth mirroring in a CV. Exclude generic words like "team player". Maximum 15 items.
tone (string)
Writing style of the posting. One of: formal, professional, casual, technical.
language (string)
ISO 639-1 code of the posting's primary language (e.g., "en", "de", "nl").
location (string)
Work location as stated. Include "remote", "hybrid", or city/country. Null if not stated.
The 10-field cap matches the easybits free plan, so anyone can run this workflow as-is.
Open the Load Master CV node and connect your Google Sheets credential. Replace the placeholder document ID with your Master CV sheet's ID and select the Master CV tab.
Open both Gemini nodes (Gemini: Tailor Bullets and Gemini: Cover Letter) and connect your Google AI / Gemini credential. Default model: gemini-2.5-pro.
Open both Create Google Doc and Write to Google Doc nodes, connect your Google Docs credential. In Create Google Doc, pick a Drive and Folder where tailored applications should be saved (a dedicated folder is recommended).
Set the workflow to active, copy the form URL, and upload a real job posting. The completion screen returns the score delta and a link to the generated Google Doc.
Honesty guardrail. Both Gemini prompts forbid inventing experience. Skills the CV genuinely lacks land in a gaps array, surfaced on the completion screen – never faked into bullets or claimed in the cover letter.
Deterministic scoring. The before/after match score is calculated in JavaScript, not by an LLM. The same formula runs against the original CV and the tailored bullets, so the delta reflects real keyword surfacing – not AI claiming it improved things. Must-haves count double in the formula; keywords count single.
Defensive parsing. The toArray() helper in the Score nodes handles three shapes the Extractor may return for array fields: actual arrays, JSON strings, and comma-separated strings. This makes the workflow robust across different Extractor response shapes.
Language and tone. Both come from the Extractor as structured fields, so a German posting yields a German CV section AND a German cover letter – automatically.