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. 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. php 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 say Test 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. 1. Check that n8n is running: open Docker Desktop and make sure the n8n container is running. 2. Open http://localhost:5678 http://localhost:5678 and sign in. 3. Check your credentials: on the Overview page, open the Credentials tab. You need two: - your Gemini credential - your SMTP Gmail credential Missing one? See Appendix A . 4. your 5. 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. 1. Click Create workflow and name it Application assistant top left . 2. Click Add first step and search form . Click n8n Form the first result, with the arrow , then choose On new n8n Form event under Triggers on the next screen. Rename the node Application 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 and Element Type from the list below. - Click + Add Attributes and add Custom Field Name and Required 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 type English and German . 6. Fill in 7. 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 the Test URL from the top of the node. - Nothing arrives in n8n: the test form only works while n8n is waiting for it. Click Execute 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 it My 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 after My profile . Rename it Analyze 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 3. Schema Type: Generate From JSON Example 4. 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 + labeled Model and choose Google Gemini Chat Model . Pick your Gemini credential and a Flash model, then close the panel. 6. Open Analyze job ad again and click Execute 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 after Analyze job ad . Rename it Write 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 and matchingStrengths are at the top of the left panel, inside output . - language , jobTitle , company and cv belong to My profile . Scroll down in the left panel to find it. 4. Close the panel. Below the node, click the + at Model Google Gemini Chat Model with your credential. Close it again. 5. Open Write cover letter and click Execute 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 to My 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 own Google Gemini Chat Model below it. Name it Interview 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 and gaps are in Analyze job ad inside output . Everything else is in My 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: an Edit Fields Set node named Collect 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. 3. Open 4. What should come out: exactly ONE item with two fields, html the email and subject 5. 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 after Collect results and name it Build 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 after Build email , named Send email , with your existing SMTP credential - From Email: your Gmail address - To Email: sendTo from Collect results - Subject: subject from Build email - Email Format: HTML. Then HTML: html from Build 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. Unpin Application 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 the Data tables tab. 2. Click Create Data table . It may be hidden in the dropdown arrow next to Create workflow top right . 3. Name it Applications and choose From 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 choose Insert row . Rename it Save to tracker . 3. Data table: Applications 4. Mapping Column Mode: Map Each Column Manually 5. Fill in the columns: - company , jobTitle , fitScore : drag from Collect results - status : type to apply - analyzedAt : drag submittedAt from Application form 6. 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 to sent 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 + after Send email and search n8n Form . Choose Form Ending . Rename it Show results . 2. On n8n Form Submission: Show Text 3. Text: drag html from Build email 4. Open Application form . If you see Respond When , set it to Workflow Finishes . 5. Unpin Application 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 , find Form Path and set it to apply . Don't see it? Click Add option . 2. Click Publish top right . 3. Open http://localhost:5678/form/apply 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 between Analyze job ad and Write cover letter . Condition: drag fitScore Number is greater than or equal to 5 . - true branch: continues as before. - false branch: a Send Email with a short "Probably skip this one" email. Include the fitSummary and gaps . - 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 : table Applications , condition status equals to apply . Turn on Return All . - Aggregate node, set to All 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, since My 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 it Application assistant PDF . - In the copy's form, change Form Path to apply-pdf . Two forms can't share the same path. - Replace the Job ad textarea with a File 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 the Binary tab: use the file's name shown there as Input Binary Field . - In Analyze job ad , replace jobAd with the extracted text . - If jobTitle or company now show errors further down, drag them from Application form directly. Path D: Sound like you prompt engineering, no new nodes AI letters often sound like… AI. - Add a field writingSample to My 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 AI helping 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 https://aistudio.google.com/apikey Create API key . Copy it. 2. In n8n: Overview Credentials Create credential , then search Gemini and pick Google Gemini PaLM Api . 3. Paste the key into API Key . Leave Host as it is. Save. Gmail SMTP 1. Create a Gmail app password, using a personal Gmail account: - Turn on 2-Step Verification at https://myaccount.google.com/security https://myaccount.google.com/security . - Open https://myaccount.google.com/apppasswords https://myaccount.google.com/apppasswords . If that doesn't work, search App passwords in the search bar at https://myaccount.google.com https://myaccount.google.com . - Name it n8n , click Create , and copy the 16-letter password. Google shows it only once. 2. Turn on 2-Step Verification at 3. In n8n: Create credential , then search SMTP . 4. 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: