Huashu Design
alchaincyf · Skill
Turns a one-line request in your AI agent into a finished design: a launch animation, a clickable app prototype, an editable slide deck, an infographic or a se…
An n8n workflow for an Airtable table where each field’s description is its prompt. Attach a PDF to a row and an OpenAI chat model fills each empty described cell. Change a field and its column fills again.
Airtable columns filled from PDFs by field descriptions is an n8n workflow in the Productivity category, listed by Mindket. It is free. This is version 1, last updated on . Download it on this page or copy its JSON, then import it into an n8n canvas. Nothing runs until you activate it in n8n.
Airtable webhook
It starts when Airtable pings the workflow’s webhook after one of these edits in the watched table:
The described Airtable fields filled in from each row’s PDF, and a whole column filled again when its prompt changes
What you need before you start.
Table and webhooks
Holds the table, pings the workflow when the File field or a field changes, and takes the answers back as record updates.
NeedsA personal access token with four scopes, and a table with a File attachment field
Language model
Answers each field’s prompt from the PDF’s text, one call for each field on each row.
NeedsOpenAI API key, and a model chosen in two nodes
Checked by Mindket on 13 Nov 2026
This n8n workflow lets the people who use an Airtable table decide what to pull out of a PDF, with no change to the workflow. Each field’s description acts as the prompt for that column. When someone attaches a PDF to a row, an OpenAI chat model reads it and fills every described field that is still empty. Add a field or edit its description, and the workflow fills that column for every row with a PDF. Thirty-six nodes run it, beside fourteen sticky notes.
Teams that already keep their records in Airtable and receive documents as PDFs, such as invoices, leases, quotes and résumés. Skip it if your PDFs are scans with no text, if you need exact figures with no review, or if you cannot publish a webhook address that Airtable can reach. The watched table must be the first one in its base.
| Industry | Who uses it | How they use it | Example |
|---|---|---|---|
| Accounting | Bookkeepers | Attach each supplier invoice and describe the fields to read | A bookkeeper adds Total and Due date columns and sees both filled from forty invoices. |
| Property management | Property managers | Attach each lease and ask for its rent and its end date | A manager adds a Notice period field, and the column fills for every lease. |
| Procurement | Buyers | Attach supplier quotes and read their price and lead time | A buyer compares three quotes side by side in one table. |
| Recruitment | Recruiters | Attach résumés and ask for the last employer and the years of experience | A recruiter describes Last employer, and the column fills for each résumé. |
You need some n8n and some Airtable: import a file, add two credentials, publish a webhook and run a setup branch once.
Any n8n that Airtable can reach over the internet, and that can reach OpenAI, will run it. The answers land in the cells of the table you watch.
Download saves a zip with workflow.json and Mindket’s setup notes in your downloads folder. A setup branch inside the workflow creates the Airtable webhooks for you.
| Need | Detail |
|---|---|
| n8n | On n8n Cloud or on a server of your own, with a public address |
| Airtable | A base, a table with an attachment field named File, and a personal access token with the scopes data.records:read, data.records:write, schema.bases:read and webhook:manage |
| OpenAI | An API key, and a model to choose in two nodes |
| PDFs | Files that have text in them, not scans |
workflow.json.OpenAI Chat Model and OpenAI Chat Model1. Choose a model in each.Airtable Webhook, replace YOUR_WEBHOOK_PATH with a long random string. Save, then press Publish.Set Airtable Vars, replace <MY_BASE_ID>, <MY_TABLE_ID> and <MY_WEBHOOK_URL> with your base ID, your table ID and the production address of Airtable Webhook. The brackets go.When clicking ‘Test workflow’. It creates two webhooks on the base.Attach a PDF to a row’s File field. A few moments later, each described cell that was empty holds an answer. To ask a new question, add a field and write the question in its description. That column fills for every row with a PDF.
| To change | Where |
|---|---|
| The questions | The Airtable field descriptions |
| How answers are phrased | The system messages of Generate Field Value and Generate Field Value1 |
| The models | OpenAI Chat Model and OpenAI Chat Model1 |
| The input column | The name File, in Set Airtable Vars, in Fetch Records and in the File[0].url expressions |
| Which rows a field change reaches | The formula in Fetch Records |
A bookkeeper’s table has File, Supplier (described as the company that issued the invoice), Total (the invoice total with its currency) and Due date (the payment due date, as written). All three are single line text fields. She attaches one supplier’s PDF invoice to a new row.
Within moments, Supplier, Total and Due date hold short answers. A month later she adds PO number, described as the purchase order number if there is one. That column fills for every row with a PDF, and shows n/a where an invoice has none. Check the figures against the PDFs before you rely on them.
If you are new. n8n draws a workflow as boxes joined by lines, and each box, a node, does one job. Airtable tells n8n about an edit with a webhook ping that holds no change data, so the workflow asks Airtable what changed. Start with a table of three text fields and one PDF.
For experts. The workflow reads Airtable through the Airtable node and through HTTP requests to its Web API. One Code node decides what kind of event arrived.
| Node | What it does | What to know |
|---|---|---|
Parse Event | Reads the last payload and works out the event, the field and the row | It knows only changed records, created fields and changed fields |
Fields to Update | Lists the described fields whose cell in the row is empty | A row change never overwrites a cell, and a field change does |
Generate Field Value1 | Basic LLM Chain: the PDF’s text, the field’s description and its Airtable type | Its system message asks for n/a and a reason when nothing is found |
Fetch Records | Searches with NOT({File} = ""), all rows | The formula names the column File |
Add Row ID to Payload | Folds one answer per field into one object with the row’s id | Update Record sends it as a single update |
A row edit never overwrites a cell, but a field edit does, and Airtable’s webhooks lapse after a quiet week.
File[0], and only as a PDF. A scan with no text layer gives the model nothingn/a when it finds nothing. That is text, and Airtable can refuse text in a number or date column, since typecast is off. Start with text fieldsParse Event uses the last payload and the first changed record in it, so editing several rows at once fills one of themGet Prompt Fields reads the first table of the base, so watch that onegpt-5-mini by default in n8n’s current source, read on 12 November 2026. OpenAI’s deprecations page gives 11 December 2026 for it and names gpt-5.6-terra as the replacementAn n8n workflow that treats each Airtable field's description as a prompt. When someone attaches a PDF in a row's File
field, a chat model reads it and fills every described field that is still empty. When a field is added or changed, the
same prompt runs again for every row that has a PDF.
workflow.json: the workflow as n8n exports it, fifty nodes: thirty-six that do the work and fourteen sticky notes. ItREADME.md: these notes.Airtable Webhook had its author's own path and webhook ID. The ID is gone and the path is now YOUR_WEBHOOK_PATH.Set Airtable Vars came with the file, and its Code nodes needed no repair.File. The name is written into the formula inFetch Records, into the File[0].url expressions and into Set Airtable Vars, so change it in all of them or none.data.records:read, data.records:write, schema.bases:read andwebhook:manage, and access to that base.workflow.json.Get Table Schema,Get Table Schema1, Get Webhook Payload, Fetch Records, Get Row, Update Row, Update Record,RecordsChanged Webhook and FieldsChanged Webhook.OpenAI Chat Model and OpenAI Chat Model1. Neither names a model, soAirtable Webhook, replace YOUR_WEBHOOK_PATH with a long random string of your own. Save, then press Publish.Set Airtable Vars, replace <MY_BASE_ID>, <MY_TABLE_ID> and <MY_WEBHOOK_URL> with your base ID, your table IDAirtable Webhook. The brackets go. Leave inputField as File.When clicking ‘Test workflow’. It creates two webhooks on the base, one for changes to theFile column and one for fields.Setup, run once:
Set Airtable Vars holds the base ID, the table ID, the webhook address and the input field's name.Get Table Schema1 and Get "Input" Field find the File field. RecordsChanged Webhook asks Airtable to ping whenFieldsChanged Webhook does the same for fields that are addedEach ping:
Airtable Webhook receives it. Get Table Schema and Get Prompt Fields read the table's fields and keep those withGet Webhook Payload asks Airtable what changed, and Parse Event works out the event from the lastrow.updated, field.created or field.updated.Event Type sends a row change one way and a field change the other.Get Row reads the row and Filter Valid Rows keeps it if it has a file. Loop Over Items1 takes oneFields to Update lists the described fields whose cell is empty. ForGenerate Field Value1 sends the PDF's text, the field's description and its type to the chat model.Get Result1 names the answer after the field, Add Row ID to Payload joins the answers with the row's ID andUpdate Record writes them.Filter Valid Fields keeps it if the field has a description. Fetch Records finds every row with aGenerate Field Value answers for that one field, and Update Row writes it.Generate Field Value andGenerate Field Value1, which keep answers short and ask for n/a when nothing is found.File, in the places listed above.Fetch Records.RecordsChanged Webhook and FieldsChanged Webhook.File[0], is read, and Extract from File is set to PDF.Get Prompt Fields reads the fields of the first table that Get Table Schema returns, which is the first table of then/a is text. Airtable can refuse text in a number or date column, because typecast is off in the updateParse Event uses the last payload in Airtable's answer and the first changed record in it, so a bulk edit of severalfromSources set to client, so only edits made in Airtable itself start a run, not theGet Webhook Payload does that on every run. A quiet week stillgpt-5-mini in n8n's current source, read on 12 Novembergpt-5-mini and names gpt-5.6-terra as its replacement.NOTICE.md 636 B README.md 7 KB workflow.json 42 KB
alchaincyf · Skill
Turns a one-line request in your AI agent into a finished design: a launch animation, a clickable app prototype, an editable slide deck, an infographic or a se…
op7418 · Skill
Skill that makes single-file HTML slide decks, slide illustrations and platform covers in two visual styles, with a presenter mode for rehearsal. For speakers…
alirezarezvani · Skill
Adds 411 ready-made skills for Claude Code and other coding agents, grouped by role from engineering and product to marketing, finance and compliance. Installs…
zarazhangrui · Skill
Builds HTML presentations from scratch or from a PowerPoint file and shows visual style previews to pick from, for people who want web slides with no CSS or Ja…
iptv-org · Kit
Collects publicly available live TV channels from many countries into playlists that any video player with live streaming can open. Made for viewers and for de…
uwg · Kit
Holds a set of image upscaling models gathered from the OpenModelDB community, for people who want to enlarge low-resolution pictures with AI on their own comp…