n8n / Getting started
Build your first workflow
Build a small, useful workflow from scratch, a contact form that stores every request in a table, and learn to test and publish it.
Beginner 20 min Updated
This walkthrough is for anyone who has n8n open for the first time. You build a contact form that saves every submission in an n8n Data Table. It needs no outside accounts or API keys, and it teaches the full cycle: trigger, transform, store, test and publish.
What you will build
n8n Form Trigger → Edit Fields → Data Table (insert row)
A visitor fills in a form. n8n tidies the answers and adds a timestamp. The result lands as a new row in a table you can view, filter and download.
Before you start
- A running n8n instance. See Get n8n: cloud or self-hosted.
- Ten minutes of quiet. No coding needed.
Step 1: Create the workflow
- Select the create button (the plus) in the top left of the side menu and choose Workflow.
- Click the title at the top and rename it to
Contact form to table.
Step 2: Add the form trigger
- Select Add first step and search for
form. - Choose n8n Form Trigger (listed as “On form submission”).
- Set Form Title to
Contact us. - Add three form elements:
Name(text),Email(email) andMessage(textarea). Make all three required. - Select Execute step. n8n opens the test form in a new tab.
- Fill it in with test data, including an email with a capital letter such as
Jane@Example.com, and submit.
Back in n8n, the node now shows your answers as output.
Tip: Click the pin icon on the output panel to pin this data. From now on, n8n reuses it on every test run, so you do not have to fill in the form again.
Step 3: Tidy the data
-
Click the plus to the right of the form node and add Edit Fields (Set).
-
Add four fields of type String, and set their values with expressions. You can drag fields from the input panel on the left, then adjust:
Field name Value name{{ $json.Name.trim() }}email{{ $json.Email.trim().toLowerCase() }}message{{ $json.Message }}receivedAt{{ $now.toISO() }} -
Select Execute step and check the output. The email should now be in lower case.
Step 4: Create the table
- Open your project overview in a new tab and go to the Data tables tab.
- Create a data table called
Contact requests, starting from scratch. - Add four columns of type String:
name,email,messageandreceivedAt.
Step 5: Store each request
- Back in the workflow, add a Data Table node after Edit Fields.
- Set the resource to Row and the operation to Insert.
- Pick
Contact requestsfrom the list. - Set the mapping mode to Map Automatically. This works because your field names match the column names exactly.
- Select Execute workflow. Open the data table and confirm your test row is there.
Step 6: Publish
- Unpin the test data on the form node if you pinned it. Production runs ignore pinned data, but unpinning keeps things clear.
- Click Publish in the top right and confirm.
- Open the form node and switch to the Production URL. This is the address to share or link from your website.
- Submit the form once through that URL.
- Open the Executions tab of the workflow. You should see one successful run, and a new row in your table.
Note: The test URL only works while you are testing in the editor. Always share the production URL.
Make it your own
Some easy next additions:
- Add a Gmail or Send Email node to notify you of each new request. This needs a credential, see Connect your apps with credentials.
- Add an IF node to flag messages that contain words like “urgent” or “quote”.
- Add an AI step that drafts a reply for you to review. See The AI Agent node explained.
Warning: A public form can attract spam. Before you link it from a live site, consider adding a check for empty or suspicious messages, and keep an eye on the table for the first few days.
Next steps
Still stuck?
Send us what you tried and a screenshot, and we will help you further. For new projects, book a strategic call.
Strategic call