cd /news/ai-tools/n8n-application-assistant-md · home › topics › ai-tools › article
[ARTICLE · art-155223] src=gist.github.com ↗ pub= topic=ai-tools verified=true sentiment=↑ positive

n8n_application_assistant.md

A developer has published a step-by-step guide to building an "application assistant" in the n8n automation platform, combining a hosted form, chained Gemini AI steps, and email delivery. The workflow takes a pasted job ad, compares it against a short CV, drafts a tailored cover letter opening, and generates the three most likely interview questions, then emails the results as an "application kit" and logs them to a built-in data table tracker. The guide introduces n8n features including Form Trigger, data pinning, list output from AI nodes, and form endings that display results in the browser.

by read22 min views2 publishedOct 21, 2026

Your job radar finds jobs. Now you build the tool that helps you apply to them.

What you build: a form where you paste a job ad. AI then:

  1. Analyzes the ad and compares it with your CV
  2. Writes a tailored cover letter opening
  3. Prepares you for the 3 most likely interview questions

You get everything as one neat email, your "application kit". After that, you add an application tracker and show the results right in the browser.

[Application form] -> My profile -> Analyze job ad (AI) -> Write cover letter (AI)
   -> Interview prep (AI) -> Collect results -┬-> Build email -> Send email -> Show results
                                              └-> Save to tracker
  • New milestones use things you haven't seen yet. They come step by step.
  • Known milestones use things you built with the job radar. You get the goal and a few hints. Try them on your own first.
  • Checkpoint: what you should see before you move on.
  • Stuck? Quick fixes for the usual problems.
  • Solutions are at the end. Only peek once you've really tried.

[drag X] means: drag the field X from the left panel into this spot. Replace the whole [drag X], brackets included.

What's new for you in this project

Concept What it's good for
Form Trigger n8n hosts a form for you. Submitting it starts the workflow.
Pinning data Test without refilling the form or spending AI quota every time
Lists in AI output AI returns real lists, not just single values
Chaining AI steps Several AI steps in a row, each with one clear job
Data tables A small database inside n8n, no Google needed
Form ending Show the result right in the browser
  • Rename a node: click its title at the top of the node panel.
  • Add a node after another: click the**+** on its right side.
  • Insert a node between two nodes: hover over the line between them and click**+** .
  • **Run one node:**Execute step .**Run everything:Execute workflow (bottom of the canvas). Older n8n versions sayTest step /Test workflow .
  • Left panel: the data coming into the node. Data from earlier nodes is there too: scroll down in the left panel, where every earlier node is listed, and expand the one you need.
  • Dragging a field creates an expression with{{ }} . If the preview below the field shows a value, it works. If it shows an error, run the earlier node first.
  • Long prompts: the field is small? Use the expand icon at its bottom right for a bigger editor.

Check that n8n is running: open Docker Desktop and make sure the n8n container is running. 2. Open http://localhost:5678 and sign in. 3. Check your credentials: on theOverview page, open theCredentials tab. You need two:

  • your Gemini credential
  • your SMTP (Gmail) credential Missing one? See Appendix A .
  1. your

Get 3 real job ads you'd actually apply to. The links from your job radar email are perfect. Copy each full ad text into a note. 6. Write a short CV in a note, 8–12 lines: experience, skills, education, languages, what you're looking for. Leave out your address, phone number and birthday, because this text goes to Google's AI.

Checkpoint: n8n is open, both credentials exist, and you have 3 job ads and your CV text ready.

Goal: a form where you paste a job ad, hosted by n8n on your laptop.

Click Create workflow and name itApplication assistant (top left). 2. Click Add first step and searchform . Clickn8n Form (the first result, with the arrow), then chooseOn new n8n Form event underTriggers on the next screen. Rename the nodeApplication form . 3. Form Title:Application assistant 4. Form Description:Paste a job ad and get your application kit by email. 5. Under Form Elements , the first element is already there. You need four elements in total. For each one:

  • Fill in Label andElement Type from the list below.
  • Click + Add Attributes and addCustom Field Name andRequired Field . Type the custom field name from the list, and switch Required Field on. The later milestones use these names.
  • Then click + Add Form Element for the next one. The four elements: # Label Element Type Custom Field Name 1 Job title Text Input jobTitle 2 Company Text Input company 3 Job ad Textarea jobAd 4 Language of your application Dropdown language For element 4: once you pick Dropdown, click + Add Field Option twice and typeEnglish andGerman .
  1. Fill in

Click Execute step . Your form opens in a new browser tab. 8. Fill it in with your first job ad and submit. 9. Back in n8n: the output on the right shows your answers.

Now pin your test submission, so you don't have to fill in the form for every test:

  1. In the output panel, click the pin icon (Pin data).

Checkpoint: the output shows your four answers plus submittedAt, and the node shows a pin symbol.

Stuck?

  • Form tab didn't open: your browser blocked the popup. Allow popups for localhost, or copy theTest URL from the top of the node.
  • Nothing arrives in n8n: the test form only works while n8n is waiting for it. ClickExecute step again, then submit.

Keep this in mind for the whole project:

Situation Pins
Building or changing later nodes Pin the form and the AI nodes.Execute workflow then skips the form and doesn't call Gemini again. Fast and free.
Testing with a new job ad Unpin the form and the AI nodes. Otherwise you get old results.
The real form (Milestone 9) Nothing to do. The real form ignores pins automatically.

To unpin, click the pin icon again.

Goal: a node that holds your CV, your name and your email address, so every later step can use them.

Hints:

  • It's the same node type as Search settings in the job radar:Edit Fields (Set) . Name itMy profile .
  • Three String fields:
    • cv : paste your CV text from your note
    • name
    • email : where your application kit goes
  • Turn on Include Other Input Fields (below the fields). This way the form answers travel along, and later nodes can grab everything from one place.
  • Execute step.

Checkpoint: one item with your form answers and cv, name and email.

Goal: AI reads the ad, compares it with your CV, and returns clean, structured results, including real lists.

You used the Information Extractor for the job radar. This time we describe the result with an example instead of attribute by attribute. That's what makes lists possible.

  1. Add an Information Extractor afterMy profile . Rename itAnalyze job ad .
  2. Click into Text . If there's already something in it, delete it. Then build this prompt: type the text, and replace each[drag ...] with the field from the left panel.
Analyze this job ad and compare it with the candidate's CV.
Rate fitScore from 1 (no fit) to 10 (perfect fit). Be honest and strict.
Keep every list item short (max. 10 words).

JOB AD
Job title: [drag jobTitle]
Company: [drag company]
[drag jobAd]

CANDIDATE CV
[drag cv]
  1. Schema Type: Generate From JSON Example
  2. Paste this into JSON Example , exactly as it is: n8n only looks at the
{
  "mustHaves": ["requirement", "requirement"],
  "matchingStrengths": ["strength", "strength"],
  "gaps": ["gap", "gap"],
  "fitScore": 7,
  "fitSummary": "One or two sentences about the overall fit."
}

shape of the example: the names, which ones are lists[ ] , and which are numbers or text. The values themselves don't matter. 5. Close the node panel. On the canvas, below Analyze job ad , click the**+** labeledModel and chooseGoogle Gemini Chat Model . Pick your Gemini credential and a Flash model, then close the panel. 6. Open Analyze job ad again and clickExecute step .

Checkpoint: the output has a field output with mustHaves, matchingStrengths and gaps as lists, plus fitScore and fitSummary. Do they make sense for this job?

Pin this output too.

Stuck?

  • Error 429: Gemini's free quota. Wait a minute and try again. Pinning helps a lot.
  • Lists are way too long: sharpen the instructions in the Text field, e.g. "max. 5 items per list".
  • Error about the schema, or the lists come back empty: check that you pasted the JSON example exactly, including all{ } and[ ] .

Goal: a second AI step that writes, using the analysis from the first one.

Why a second step? One AI step, one job. Analyzing and writing are different tasks. When you split them up, each prompt stays short and focused, and when something goes wrong, you know exactly where.

For writing, we use a new node: the Basic LLM Chain. It's the simplest AI node: prompt in, text out.

  1. Add a Basic LLM Chain afterAnalyze job ad . Rename itWrite cover letter .
  2. Source for Prompt (User Message): Define below
  3. Build this in Prompt (User Message) :
Write the opening paragraph of a cover letter (4–5 sentences) in [drag language].

Rules:
- Don't start with "I am writing to apply" or "Hiermit bewerbe ich mich".
- Connect 2 of the candidate's strengths to 2 of the must-haves.
- Sound confident and natural, not over the top.
- Only use facts from the CV. Never invent experience.
- Plain text only. No greeting, no sign-off, no placeholders.

Job: [drag jobTitle] at [drag company]
Must-haves: [drag mustHaves]
Matching strengths: [drag matchingStrengths]

Candidate CV:
[drag cv]

Where to find the fields: - mustHaves andmatchingStrengths are at the top of the left panel, insideoutput .

  • language ,jobTitle ,company andcv belong toMy profile . Scroll down in the left panel to find it.
  1. Close the panel. Below the node, click the + atModel >Google Gemini Chat Model with your credential. Close it again.
  2. Open Write cover letter and clickExecute step .

Checkpoint: the output has a field text with your cover letter opening. Read it. Would you send this?

Tune it: change one rule, run again, compare. Try e.g. "more formal", "shorter sentences", or "mention why this company specifically".

Watch out for invented experience. That's why the rule "never invent experience" is in there. AI makes things up when it wants to sound impressive, so you check every letter before it goes out.

Pin the output once you're happy.

Stuck?

  • Error that mentions "paired item": in the prompt, find the expression that points toMy profile and change.item to.first() .

Goal: a third AI step that predicts the 3 most likely interview questions and gives you a tip for each.

Hints:

  • A Basic LLM Chain with its ownGoogle Gemini Chat Model below it. Name itInterview prep .
  • Your prompt should tell the AI:
    • the language
    • the job and company
    • to base the questions on the must-haves and especially your gaps
    • to give a 2–3 sentence tip per question, using real examples from your CV
    • not to invent experience
    • plain text, numbered 1 to 3
  • Where to find the fields: mustHaves andgaps are inAnalyze job ad (insideoutput ). Everything else is inMy profile .
  • Use the prompt from Milestone 4 as a pattern.

Checkpoint: 3 numbered questions, each with a tip that refers to your actual CV. Pin the output.

Solution: Appendix B1.

Goal: one node that gathers everything for the email, with short, clear names.

Hints:

  • Same idea as Job + score in the job radar: anEdit Fields (Set) node namedCollect results .
  • For each row: click Add Field , type the name, choose the type, then drag the value from the node where it was created:
Name Type Drag from
jobTitle String My profile
company String My profile
fitScore Number Analyze job ad > output
fitSummary String Analyze job ad > output
mustHaves Array Analyze job ad > output
strengths Array Analyze job ad > output >matchingStrengths
gaps Array Analyze job ad > output
coverLetter String Write cover letter > text
interviewPrep String Interview prep > text
sendTo String My profile > email
  • New: the lists need the type Array , not String.

Checkpoint: one item with exactly these 10 fields.

Goal: one nicely formatted email with all results.

Part 1: build the email. Like in the job radar, AI writes the code for a Code node. This time, you write the prompt.

Your prompt needs four things:

  1. Where the code runs: n8n, Code node, "Run Once for All Items", JavaScript
  2. What comes in: the exact data, so the AI knows the field names. Easiest way:
  • Open Collect results and look at the output.
  • At the top of the output, switch the view to JSON .
  • Select all of the JSON text, copy it, and paste it into your prompt.
  1. Open
  2. What should come out: exactly ONE item with two fields,html (the email) andsubject
  3. How it should look: which sections, in which order, what's a bullet list, and that line breaks in the long texts must be kept

Then:

  1. Add a Code node afterCollect results and name itBuild email .
  2. Delete the example code and paste in the AI's code.
  3. Execute step.
  4. Error? Copy the error message back into the AI chat: "This error appears, please fix it." That's normal, even for developers.

Checkpoint: one item with html and subject.

Prompt example and reference code: Appendix B2.

Part 2: send the email.

Hints:

  • Send Email node afterBuild email , namedSend email , with your existing SMTP credential
  • From Email: your Gmail address
  • To Email:sendTo fromCollect results
  • Subject:subject fromBuild email
  • Email Format: HTML. ThenHTML:html fromBuild email
  • Add option >Append n8n Attribution , and switch it off.

Checkpoint: the application kit lands in your inbox. Check spam if it doesn't show up within a minute.

Time for real data.

  1. UnpinApplication form and the three AI nodes.
  2. Click Execute workflow . The form opens. Submit your first job ad.
  3. Wait for the email.
  4. For the next job ad, click Execute workflow again. The test form only accepts one submission per click.
  5. Wait about a minute between ads, so Gemini's free quota keeps up.

For each email, ask yourself:

  • Does the fit score feel right?
  • Does the cover letter invent anything?
  • Would these interview questions really come up?

Not happy? Tune the prompts. That's the real work in AI automation.

Before you move on: pin Application form and the three AI nodes again. That makes building the next milestones faster and free.

Goal: every job you analyze is saved to a table, so you keep track of your applications.

We use Data tables: a small database built into n8n. No Google account, no setup.

Create the table

  1. Go to the n8n Overview page and open theData tables tab.
  2. Click Create Data table . It may be hidden in the dropdown arrow next toCreate workflow (top right).
  3. Name it Applications and chooseFrom scratch .
  4. Add these columns:
Column Type
company String
jobTitle String
fitScore Number
status String
analyzedAt Date

Save to it from the workflow

One node's output can feed several nodes, no router needed. So we add a second branch after Collect results.

  1. Open your workflow. Drag from the output dot (right side) of Collect results to an empty spot below it and let go. The node search opens.
  2. Search Data table and chooseInsert row . Rename itSave to tracker .
  3. Data table:Applications
  4. Mapping Column Mode: Map Each Column Manually
  5. Fill in the columns:
  • company ,jobTitle ,fitScore : drag fromCollect results
  • status : typeto apply
  • analyzedAt : dragsubmittedAt fromApplication form
  1. Click Execute workflow . With your pins from before, this skips the form and Gemini.

Checkpoint: go to Overview > Data tables > Applications. There's a new row. Your email arrived again too, which is expected.

Use it:

  • When you send an application, change status tosent right in the table. Later:interview ,rejected ,offer .
  • Test rows can be deleted in the table: select them and delete.

Goal: after submitting, the browser shows your application kit right away. Plus a fixed link to your form that you can bookmark.

Part 1: show the results

  1. Click the + afterSend email and searchn8n Form . ChooseForm Ending . Rename itShow results .
  2. On n8n Form Submission: Show Text
  3. Text: draghtml fromBuild email
  4. Open Application form . If you seeRespond When , set it toWorkflow Finishes .
  5. UnpinApplication form and the three AI nodes. The results screen only appears for a real form submission.
  6. Execute workflow and submit a job ad.

Checkpoint: after a short wait, your application kit appears in the form tab and arrives in your inbox.

Part 2: your real form link

So far you've used the test form, which only works while n8n is waiting in the editor. Now let's make it permanent.

  1. In Application form , findForm Path and set it toapply . Don't see it? ClickAdd option .
  2. Click Publish (top right).
  3. Open http://localhost:5678/form/apply and bookmark it.

Checkpoint: the bookmarked form works without clicking anything in the editor. You'll find these runs in the Executions tab of your workflow.

Good to know:

  • The real form still needs Docker and the n8n terminal running.
  • Changed something later? Click Publish again. Otherwise the real form keeps using the old version.
  • While you keep building: work with a pinned Application form . If the test form doesn't open anymore after publishing, unpublish (three dots menu, top right) while you build, then publish again.

Pick at least one. Done? Pick another.

Path A: Skip bad fits (new: If node)

Why write a cover letter for a 3/10 job? Save the AI calls.

  • Insert an If node betweenAnalyze job ad andWrite cover letter . Condition: dragfitScore >Number >is greater than or equal to >5 .
  • true branch: continues as before.
  • false branch: aSend Email with a short "Probably skip this one" email. Include thefitSummary andgaps .
  • Did Milestone 9? Add a second Form Ending on the false branch, so the form shows something there too.
  • Bonus: save skipped jobs to the tracker too, with status skipped .

Path B: Friday check-in (new: Aggregate node)

A weekly email with all applications still marked to apply.

  • Add a second trigger to the same workflow: Schedule Trigger , every week on Friday at 15:00. It starts its own branch, not connected to the form.
  • Data table >Get row(s) : tableApplications , conditionstatus equalsto apply . Turn onReturn All .
  • Aggregate node, set toAll Item Data (Into a Single List) . This packs all rows into one item, so the next AI step runs once instead of once per row.
  • Basic LLM Chain with Gemini: "Here are my open applications: [drag data]. Write a short, motivating Friday message: which one should I tackle first and why?"
  • Send Email to yourself. Type your address directly, sinceMy profile isn't part of this branch.
  • Test it: the workflow now has two triggers. If n8n asks which one to start from, choose the schedule.
  • No rows with to apply ? Then nothing happens after the table. That's correct.

Path C: PDF job ads (new: file upload, Extract From File)

Some job ads only exist as PDFs.

  • Duplicate the workflow: three dots menu (top right) > Duplicate . Name itApplication assistant (PDF) .
  • In the copy's form, change Form Path toapply-pdf . Two forms can't share the same path.
  • Replace the Job ad textarea with aFile element. Accepted file types:.pdf .
  • Insert Extract From File >Extract From PDF right after the form. Submit a test PDF, open the form's output, and check theBinary tab: use the file's name shown there asInput Binary Field .
  • In Analyze job ad , replacejobAd with the extractedtext .
  • If jobTitle orcompany now show errors further down, drag them fromApplication form directly.

Path D: Sound like you (prompt engineering, no new nodes)

AI letters often sound like… AI.

  • Add a field writingSample toMy profile : a paragraph you wrote yourself (an old letter, an email, anything).
  • Add to the cover letter prompt: "Match the tone, sentence length and word choice of this writing sample: [drag writingSample]"
  • Run the same job ad before and after. Compare.

Reflection questions:

  1. Why three separate AI steps instead of one big prompt? What was easier because of that?
  2. Where could the AI get it wrong in this workflow? What did you build in to catch it, and what do you still have to check?
  3. You used AI in two different ways: AI inside the workflow (analyzing, writing) and AIhelping you build it (the code). How are they different? Which one runs every time?
  4. Which of your data leaves your laptop in this workflow, and where does it go?

Coming up next: your first chat agent with n8n. Keep this workflow and your Applications table.

Only if a credential is missing.

Gemini

  1. Get a key at https://aistudio.google.com/apikey >Create API key . Copy it.
  2. In n8n: Overview >Credentials >Create credential , then searchGemini and pickGoogle Gemini(PaLM) Api .
  3. Paste the key into API Key . LeaveHost as it is. Save.

Gmail (SMTP)

  1. Create a Gmail app password, using a personal Gmail account:
  1. Turn on 2-Step Verification at
  2. In n8n: Create credential , then searchSMTP .
  3. Fill in:
Field Value
User your Gmail address
Password the app password, exactly as Google shows it, including the spaces
Host smtp.gmail.com
Port 465
SSL/TLS on
  1. Save and wait for Connection tested successfully .

Only peek once you've tried.

Prepare me for a job interview for [drag jobTitle] at [drag company].
Write in [drag language].

Give me the 3 questions I'm most likely to be asked, based on the
must-haves and especially my gaps. For each question, add a short tip
(2–3 sentences) on how to answer it with real examples from my CV.

Rules:
- Only use facts from my CV. Never invent experience.
- Number the questions 1 to 3.
- Plain text only, no symbols like ** or #.

Must-haves: [drag mustHaves]
My gaps: [drag gaps]

My CV:
[drag cv]

Example prompt:

I'm using n8n. Write JavaScript for a Code node in "Run Once for All
Items" mode.

The node gets exactly one item. Here is its data:
[paste the JSON from the Collect results output here]

Build one HTML email from it and return exactly ONE item with two fields:
- html: the email body
- subject: "Application kit: <jobTitle> at <company> (<fitScore>/10)"

The email should have these sections, in this order:
1. Heading with job title and company
2. Fit score and fit summary
3. "What they really want": mustHaves as bullet points
4. "Your matching strengths": strengths as bullet points
5. "Gaps to address": gaps as bullet points
6. "Cover letter opening": coverLetter
7. "Interview prep": interviewPrep

Keep the line breaks in coverLetter and interviewPrep.
Keep the code short and simple, with comments explaining each part.

Reference code (works if your field names match Milestone 6):

// Get the one item that comes in
const d = $input.first().json;

// Turn a list into HTML bullet points
const list = (items) => '<ul>' + (items || []).map(i => `<li>${i}</li>`).join('') + '</ul>';

// Keep the line breaks from the AI texts
const keepLines = (text) => (text || '').replace(/\n/g, '<br>');

// Put the email together, section by section
const html = `
  <h2>${d.jobTitle} at ${d.company}</h2>
  <p><strong>Fit score: ${d.fitScore}/10</strong><br>${d.fitSummary}</p>

  <h3>What they really want</h3>
  ${list(d.mustHaves)}

  <h3>Your matching strengths</h3>
  ${list(d.strengths)}

  <h3>Gaps to address</h3>
  ${list(d.gaps)}

  <h3>Cover letter opening</h3>
  <p>${keepLines(d.coverLetter)}</p>

  <h3>Interview prep</h3>
  <p>${keepLines(d.interviewPrep)}</p>
`;

// The subject line
const subject = `Application kit: ${d.jobTitle} at ${d.company} (${d.fitScore}/10)`;

// Return ONE item with both fields
return [{ json: { html, subject } }];
Problem Fix
Form doesn't open on Execute Allow popups for localhost, or copy the Test URL from the node
Workflow runs with old form data or old AI results Nodes are still pinned. Unpin them (see the pinning cheat sheet).
Gemini error 429 Free quota hit. Wait a minute, and pin AI outputs while building
Error mentioning "paired item" Change .item to.first() in the expression that causes it
Can't find a field in the left panel Scroll down: earlier nodes are listed further down. Run them first if they show no data.
Lists show up as text, or an error in Collect results The field type must be Array , not String
Email arrives, but the formatting is broken Email Format must be HTML
Cover letter invents experience Make the "never invent" rule stronger, and add more detail to your CV
localhost:5678/form/apply doesn't work Workflow not published, or Form Path not set to apply
Real form still shows the old behavior You changed something but didn't publish again
Real form runs don't show in the editor That's normal. Check the Executions tab.
── more in #ai-tools 4 stories · sorted by recency
── more on @n8n 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain — perfect for shipping the agent you just read about.

$git push zahid main
→ Live at https://your-agent.zahid.host ✓
Get free account → Pricing
from €0/mo · no card required
LIVE [news/n8n-application-assi…] indexed:0 read:22min 2026-10-21 · —