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.
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.
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.
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.
Three things to do, three to avoid.
Indeed's internal guidelines apply to today's training too. Especially the credential-hygiene line.
Get your workspace ready
Three minutes. Know what n8n is, clone the sheet, find your project.
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.
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.
Clone the sample jobs sheet to your Drive.
- Open the sample sheet using the link below.
- Click File in the top-left.
- Choose Make a copy.
- Name it
[Your name] Job Reviewerand save to My Drive. - Confirm the AI Note column already exists in your copy.
Open n8n in the right project.
- In n8n, switch to the Hackathon 2026 Training project (top-left).
- Click Create workflow from inside that project (not Personal).
- Name your workflow using the format
Full Name - Jobs Evaluator Workflow. - Add the
hackathon-preptag at the top of the canvas, so the platform team can clean up after.
Hackathon 2026 OpenAI account 20
and Hackathon 2026 Slack Credentials. Both are pre-configured for this
session only.
Checkpoint 1 · Sheets only
Read jobs from your sheet. Loop one row at a time. Write a placeholder note back. No AI yet.
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.
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.
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.
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).
CP1 · Sheets Only
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.
Checkpoint 2 · Add the AI
Drop a Wait node, then a Basic LLM Chain with the recruiter prompt. The placeholder becomes a real review.
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.
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.
CP2 build, screen by screen.
Adding the LLM, the model sub-node, the credential, and the prompt. Use the arrows to step through.
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.
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'] }}
CP2 · Add the AI
Behind on CP1? Import this and you start with a fully-working AI checkpoint. Reconnect Sheets + OpenAI credentials after import.
Structured Output Parser is "ask nicely". Native is constrained.
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.
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.
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.
Find your Slack Member ID, then paste it in.
- Click your avatar (lower-left in Slack) → Profile.
- Click the three dots next to Edit status.
- Choose Copy member ID. It looks like
U03RU3PLYHK. - In the Slack node: Send Message To → User, User → By ID, paste the ID. Set Message Type to Simple Text Message.
2026 Hackathon Training. The Hackathon
2026 Slack credential is pre-configured for the workshop, participants don't have
to create their own app.
CP3 build, screen by screen.
Wiring the done branch, composing the summary, configuring the Slack node. Use the arrows to step through.
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 }}.
{{ $('Limit to First 3 (Demo Cap)').all().length }}
: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.
CP3 · Slack Summary on Done
The complete workflow. Import, reconnect Sheets / OpenAI / Slack credentials, paste your Slack Member ID, point at your sheet. Done.
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.
Where to take it
The pattern, the policy, the 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.
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.
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.
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.