Indeed Pre-Hackathon Training
Intro 01 / 00
Pre-Hackathon Training

Build your first AI workflow at Indeed.

One hour, three checkpoints, one working workflow. By the end you will have built a job-posting reviewer that talks to Google Sheets, calls an LLM, and DMs you on Slack.

Hands-on Three checkpoints Real integrations Hackathon-ready
Brought to you by
Today's plan

One hour. Three checkpoints. Everyone ships.

Most of the hour is hands-on. You build along with me, on a clean canvas, one checkpoint at a time. Each checkpoint also ships as a downloadable JSON so you can catch up if you fall behind. The first 5 minutes set the stage; the last 10 are open Q&A.

00:00 - 00:05
5m
Intro & setup
What is n8n. What is an AI agent. Clone the sample sheet. Workspace ready.
00:05 - 00:20
15m
Checkpoint 1 · Sheets
Read the jobs sheet, loop over rows, write a placeholder note back.
00:20 - 00:35
15m
Checkpoint 2 · AI
Add the LLM. Paste the recruiter prompt. The AI Note column fills with real reviews.
00:35 - 00:50 Bonus
15m
Checkpoint 3 · Slack
Wire the loop's done branch to a single Slack DM with the run summary.
00:50 - 01:00
10m
Q&A
Open Q&A, hackathon ideas, where this pattern goes next.
A working definition

What is an AI agent?

AI Agents are like your digital coworkers that can learn, reason, and execute tasks on your behalf.

Learn

From the prompt, the data you give them, and the tools they can call.

Reason

Pick which tool to use, when to ask for clarification, how to combine results.

Execute

Read your inbox, update a row, send a Slack message, file a ticket on your behalf.

Where we are headed

Quick demo: the finished workflow.

A manager receives 13 fake job postings in a Google Sheet. The workflow loops over each row, asks an LLM to review it (salary realism, inclusive language, JD improvements), writes the AI's note back to the sheet, and DMs you on Slack with a one-line summary when the whole batch is done. Watch this run end-to-end. Then we wipe the canvas and build it ourselves, three checkpoints at a time.

Finished workflow canvas
Before we touch the canvas

Three things to do, three to avoid.

Indeed's internal guidelines apply to today's training too. Especially the credential-hygiene line.

Do
Avoid
Build inside the Hackathon 2026 project, never your personal folder.
Saving training workflows in your Personal project, where they get lost.
Use the Hackathon 2026 credentials for OpenAI and Slack during this session.
Pasting your personal API key into a shared workshop account.
Use the manual trigger (click to run) for everything you build today.
Publishing this workflow today is not allowed. In production you would switch to a Schedule Trigger.
01

Get your workspace ready

Three minutes. Know what n8n is, clone the sheet, find your project.

If it is your first time here

n8n is a visual builder for the work between your tools.

The name comes from NodeMation: "n" + 8 letters + "n". Drag nodes onto a canvas, wire them together, the workflow runs. Open-source / fair-code, self-hosted at Indeed.

n8n Premium Partner
n8n × Avanai
Before we build

Anatomy of a node.

Every node looks the same. A title and an icon up top. An input dot on the left, an output dot on the right. Click the node to open its settings panel: inputs on the left, configuration in the middle, outputs on the right. Press Escape to close.

Node on the canvas
On the canvas
Node open mode
Open mode · inputs / settings / outputs
Step 1 · One minute

Clone the sample jobs sheet to your Drive.

Step 2 · Two minutes

Open n8n in the right project.

02

Checkpoint 1 · Sheets only

Read jobs from your sheet. Loop one row at a time. Write a placeholder note back. No AI yet.

Checkpoint 1 of 3 · Walkthrough

Five nodes. One full loop iteration.

The placeholder we write back uses an expression that embeds the job title. So every row in the sheet gets a different note, which proves the loop is iterating. Same expression syntax we will use for the LLM prompt in Checkpoint 2, but here you learn it for free.

When Tested
Manual trigger
Read Jobs
Google Sheets
Limit to 3
Demo cap
Loop Over Jobs
SplitInBatches · 1
Compose Placeholder
Set
Write Note Back
Sheets update

Loop has TWO outputs

loop = per-row branch (the one we wire). done = fires once, after every row. Empty for now, we wire it in Checkpoint 3.

Match by Job Title

The Sheet update node matches rows by Job Title column and writes the AI Note into the matching row. Auto-mapped, no JSON.

Pin the Read output

Right-click "Read Jobs" → Pin data. Lets you re-run the loop without re-fetching the sheet. Live-debug friendly.

Checkpoint 1 · Step-by-step

CP1 build, screen by screen.

Use the arrows to step through the build. Same content as the live walkthrough, captured for after-the-session reference.

Paste this expression. Or import the JSON.

The AI Note field on the Compose Placeholder Set node uses this expression. Each row gets a different note because {{ $json['Job Title'] }} and {{ $json.Company }} resolve to the current row.

Set node · AI Note value
Pending AI review for {{ $json['Job Title'] }} at {{ $json.Company }}.

Paste this into the AI Note field of the Set node. Make sure the field type is String and Expression mode is on (the field shows = at the start).

Workflow · Checkpoint 1

CP1 · Sheets Only

CP1-Sheets-Only.json

Stuck or want to skip ahead? Import the full Checkpoint 1 workflow. You will still need to point the Sheets nodes at your cloned sheet.

Download
03

Checkpoint 2 · Add the AI

Drop a Wait node, then a Basic LLM Chain with the recruiter prompt. The placeholder becomes a real review.

Checkpoint 2 of 3 · Walkthrough

Same shape as CP1. Wait + LLM in the loop body.

We add three nodes inside the loop. The Wait node throttles the loop so 300 of us together don't hammer the OpenAI proxy. The Basic LLM Chain calls the model with our recruiter prompt. An OpenAI Chat Model sub-node hangs off it with the Hackathon 2026 credential.

When Tested
Manual
Read Jobs
Sheets
Limit to 3
Demo cap
Loop Over Jobs
SplitInBatches
Wait 2s
Throttle
Review with AI
Basic LLM Chain
Compose AI Note
Set
Write Note Back
Sheets update

Why a Wait node?

300 of us, looping at the same time, on a shared OpenAI proxy. 2 seconds between rows is your good-citizen tax. Skip it and you'll trip rate limits.

The Set node changes too

The AI Note field swaps from the placeholder expression to {{ $json.text }}, the LLM Chain's output.

Credential

On the OpenAI Chat Model sub-node, pick Hackathon 2026 OpenAI account 20. Training-only, swap for your own in production.

Checkpoint 2 · Step-by-step

CP2 build, screen by screen.

Adding the LLM, the model sub-node, the credential, and the prompt. Use the arrows to step through.

Checkpoint 2 of 3 · Copy & ship

Paste the recruiter prompt. Or import the JSON.

Drop this into the Prompt field of the Basic LLM Chain node, with Source for Prompt set to Define below. The LLM gets the full row context via the $('Loop Over Jobs').item.json references.

Basic LLM Chain · Prompt
You are a senior recruiter reviewing a job posting before it goes live on Indeed.
Write a single concise review note (4-7 sentences, plain prose, no bullets, no JSON, no markdown headers)
covering exactly these points in this order:

1. Salary realism. Is the pay range realistic for this role and location? If not, say why and suggest a realistic range.
2. Inclusive language. Flag any discriminatory or non-inclusive wording. Quote the phrase if found. If clean, say "Language looks inclusive."
3. Description quality. Suggest one specific improvement.
4. End with: "Top qualifications: X, Y, Z."

Be direct and constructive. Do not hedge.

Job Title: {{ $('Loop Over Jobs').item.json['Job Title'] }}
Company: {{ $('Loop Over Jobs').item.json.Company }}
Location: {{ $('Loop Over Jobs').item.json.Location }}
Pay Range: {{ $('Loop Over Jobs').item.json['Pay Range'] }}
Description: {{ $('Loop Over Jobs').item.json['Job Description'] }}
Workflow · Checkpoint 2

CP2 · Add the AI

CP2-Add-the-AI.json

Behind on CP1? Import this and you start with a fully-working AI checkpoint. Reconnect Sheets + OpenAI credentials after import.

Download
Don't use the Structured Output Parser node for the response. See the Indeed wiki for the recommended HTTP Request approach. Hint: see next slide for details.
Why we did NOT use the parser

Structured Output Parser is "ask nicely". Native is constrained.

Structured Output Parser node icon
n8n's Structured Output Parser injects formatting instructions into your prompt and parses the model's text. Auto-fix silently doubles your LLM calls when it fails. Indeed-recommended pattern: HTTP Request against the LLM proxy with a JSON schema, so the model literally cannot produce invalid output.
Parser node: ~90-95% schema compliance, 200-500 prompt tokens of formatting instructions, auto-fix doubles cost on failure with no metric to tell you.
Native via HTTP Request: 100% schema compliance, structurally guaranteed at token generation, zero prompt overhead. Works for OpenAI and Gemini through the Indeed LLM proxy.
Indeed wiki: Extracting structured data from LLM responses in n8n has copy-paste-ready HTTP Request examples for OpenAI, Gemini, and Anthropic.
04

Checkpoint 3 · Slack summary

Wire the loop's done branch to a single Slack DM. One message per run, with the count and a link.

Bonus · we cover this if time allows
Checkpoint 3 of 3 · Walkthrough Bonus

Two new nodes, on the loop's other branch.

The loop has two outputs. So far we have only used the loop branch. Now we wire the done branch (which fires once, after the last row) to a tiny chain: Set builds the summary text, Slack DMs it to you. One DM per run, not 300.

Loop Over Jobs
SplitInBatches
Compose Summary
Set · uses .all().length
DM Summary
Slack · By ID

Why digest, not per-item?

One Slack DM per run is the production pattern. Per-item DMs are demo theater, and with 300 of us, they are also a flood.

Counting rows

Inside the Set node, count the rows that entered the loop with {{ $('Limit to First 3 (Demo Cap)').all().length }}.

Slack credential

On the Slack node, pick Hackathon 2026 Slack Credentials. The DM goes to you, by Member ID. Find yours on the next slide.

Bonus section reminder: if we ran short on time during the live build, all the steps are in the screenshots a couple of slides on, and in the recorded video. Safe to skip.
Checkpoint 3 · Slack setup Bonus

Find your Slack Member ID, then paste it in.

Checkpoint 3 · Step-by-step Bonus

CP3 build, screen by screen.

Wiring the done branch, composing the summary, configuring the Slack node. Use the arrows to step through.

Checkpoint 3 of 3 · Copy & ship Bonus

Paste the summary message. Or import the JSON.

On the Compose Summary Set node, add a string field called summary_message with this expression. The Slack node's Message Text then references {{ $json.summary_message }}.

Set node · reviewed_count
{{ $('Limit to First 3 (Demo Cap)').all().length }}
Set node · summary_message
:white_check_mark: *Job Review Complete*

Reviewed *{{ $('Limit to First 3 (Demo Cap)').all().length }}* job postings. The AI notes have been written back to the sheet.

:link: <https://docs.google.com/spreadsheets/d/1onDtz4TeM0SmJD7-QCV_QzCJXyQptbt4YnAAbwJaew4/edit?gid=921304816|Open the reviewed jobs sheet>

Replace the spreadsheet URL with your cloned sheet's link before running.

Workflow · Checkpoint 3 (final)

CP3 · Slack Summary on Done

CP3-Slack-Summary.json

The complete workflow. Import, reconnect Sheets / OpenAI / Slack credentials, paste your Slack Member ID, point at your sheet. Done.

Download

You shipped it!

Real workflow, real LLM, real Slack DM. The pattern you just built generalises to every "document in → structured data out" use case at Indeed.

CP1 ✓ Sheets CP2 ✓ AI CP3 ✓ Slack
05

Where to take it

The pattern, the policy, the hackathon springboard.

Hackathon springboard

Six places this workflow can go next.

You built the spine in an hour. The hackathon is for putting muscle on it. Each of these is a half-day project, pick one, fork your CP3 workflow, ship it.

🔁 Schedule it

Replace the manual trigger with a Schedule Trigger that runs every hour. New jobs in the sheet get reviewed automatically. You will need to publish the workflow, hackathon-only, with platform-team coordination.

📊 Persist results in Google Sheets

You already write back to the source sheet. Add a second sheet ("Reviewed log") for an append-only audit trail. Same Google Sheets node, different operation.

🤖 Smarter prompts

Score each posting on a 1-5 scale, extract a list of red-flag phrases, generate three rewritten versions. Same LLM Chain, richer prompt. Your imagination is the limit.

💬 Slack channel digest

For a real production setup, post to a shared channel instead of DM. Note: this needs a pre-created Slack app with channel:write scope, not something to enable on the fly during the hackathon.

🧠 Pivot the use case

Same shape, different content: support ticket triage, customer-call summariser, doc-quality scorer. Document in → structured data out applies anywhere.

📂 Browse Example Workflows

The auto-shared Example Workflows project has Prompt Registry, Native N8N Nodes, App Integrations, AI Agents and LLMs, MCP. Forks of these are the fastest way to build something new.

For your hackathon work

Reach for Code last, not first.

Most workflows that reach for the Code node could have used Set, IF, or a native integration instead. The test is simple: "is there a built-in node that already does this?" Usually, yes.

Set / Edit Fields: shape data with `{{ $json.field }}` expressions. No JavaScript, anyone on the team can read it. We used it three times today.
IF / Switch: branch based on a condition. Read it like a sentence instead of squinting at code.
Native integrations: Google Sheets, Slack, Gmail, JIRA, Salesforce, OpenAI. Pre-built, credential-managed, and they upgrade themselves.
When Code IS the right answer: binary fan-out, complex array reshaping that no built-in node covers, or talking to a service without a native node. Rare, but real.
Rule of thumb: if you reach for Code, ask "is there a Set, IF, or native integration that already does this?" If yes, use that instead. It saves you and the next person reading your workflow.
Today's workflow uses zero Code nodes. Set covers everything.
Before you ship anything real

Hackathon ≠ production. Three reminders.

Today's workflow is a learning demo. If you take it any further, three guardrails apply.

No real PII

Today we used fake jobs. Never run this on real candidate CVs or applicant data, that triggers Legal/HR/Trust review and EU AI Act considerations (Annex III, employment).

Credentials, not keys

Hackathon 2026 credentials are training-only. For anything beyond the session, switch to a service account, follow the credentials deck, and rotate on ownership change.

AI policy

Indeed's company-wide GenAI guidelines apply to every workflow you build with an AI node. Re-read them before publishing.

Pattern is portable. Use this shape for anything where you need document in → structured data out: scoring job-posting quality, classifying support tickets, summarising sales calls, parsing receipts. None carry the high-risk-AI classification.
n8n Official Premium Partner

Today's host: Avanai.

We help organisations adopt AI and roll out n8n internally. The workflows, the credential patterns, the team enablement, the bits that turn n8n from a tool a few people poke at into a platform a whole company runs on. If anything here resonated, we are the people to talk to.

n8n rollouts AI workflow design Custom integrations Team enablement

avanai.io

10 minutes, open mic

Q&A

Anything about the workflow, the prompt, the credentials, or where to take this in the hackathon. The floor is yours.

01 / 00