Standardize Request Intakes Using Google Forms and Airtable

CreateACatchAllFormWithRequiredFields

The first time I tried collecting requests from my colleagues using Google Forms, I just started with a blank form. Literally just opened it and started typing fields like “Name,” “What do you need from me?” and “Deadline?” (with a question mark because I was feeling passive-aggressive). But after about a week, I realized I was getting all kinds of incomplete or bizarre submissions — people typing entire project briefs into the “Name” field or leaving the “What do you need” question totally blank.

So here’s the first rule if you’re trying to standardize request intake: lock down the form with required fields and controlled options. Instead of free text for everything, I switched to dropdowns for department and request type. That simple change cut out half of the confusion. I also used the “Response validation” feature on description fields to reject any input with less than 10 characters because—believe it or not—I had people write just “Yes” in the description field 😛

Helpful setup tips:
– Use sections (the two-rectangle icon on the toolbar). If someone selects a certain request type, jump them into a specific section using “Go to section based on answer.”
– Use “Short answer” questions for people’s names and emails but make both required.
– If the request includes a deadline, use the “Date” question type so you don’t get weird formats like “next Thursday maybe.”

Once I finalized the question list, I made a clean, reliable version of the form and shared the live link — and immediately bookmarked it on like five different dashboards around the office because the sheer chaos before that was giving me ulcers.

ConnectGoogleFormResponsesToAirtableAutomatically

Google Forms has no native tool to send data directly to Airtable, which is deeply annoying but not shocking. I ended up using Make (formerly Integromat) first and then later rebuilt the same flow in Zapier because I couldn’t remember my Make login. Yep.

Here’s what most people don’t realize: the form responses actually get stored in a connected Google Sheet (created automatically). That Sheet is the critical link. You connect *that* Sheet to your Airtable using automation. Here’s how I set it up:
1. In Zapier, I created a new Zap: trigger is “New Spreadsheet Row in Google Sheets.”
2. For the action, I connected Airtable and used the “Create Record” action.
3. And here’s the kicker—if your columns in the Google Sheet don’t match the field names in Airtable *exactly*, you’ll spend a lovely afternoon doing guesswork while the Zap throws vague error messages like “Invalid filter formula.”

If you’re confused about how to match field types (i.e., Google Form gives you text but your Airtable field is a single select), you can:
– Change the Airtable field type to “Long text” temporarily while testing
– Or add a “Lookup Table” step in Zapier to map mismatches like “Design request” → “Design”

I also learned the hard way that date fields in Google Forms sometimes pull into Sheets as weird string formats. You can drop a helper formula next to the raw field and format it correctly before the Zap picks it up.

BuildCustomViewsInsideAirtableForEachTeam

Once the intake is flowing in… you’re going to get overwhelmed because everything dumps into one big Airtable base. Trust me, it’s not very helpful when everyone can see everyone else’s request unless that’s the exact situation you’re after (which… usually it isn’t).

To fix this, I created filtered Views so each team sees only their stuff. For example:
– Marketing View: Filter where “Department” = “Marketing,” sort by submission date
– Product View: Filter where “Request Type” includes “Bug” or “Feature Request”

Airtable lets you hide fields too, which came in handy because engineering teams didn’t need to see people’s email addresses or social context. For more sensitive projects, I went one step further and used Interfaces to build mini portals—aka a fake dashboard where people see only what I let them see 🙂

Using colors helped more than I expected. I set up conditionally colored records based on urgency. So any task with a deadline within three days turned bright red. It’s fake-pressure, but it works.

And one tip if you’re dealing with teams who love exporting things constantly: turn on the “Download CSV” permission on the view level, and not at the base level, so they don’t go rogue and ruin your data filters.

AddConditionalLogicToFormsWithoutComplexScripts

One thing that really surprised me—Google Forms actually does have conditional logic, BUT it’s primitive. No code needed, just the “Go to section based on answer” setting. I used that to show different follow-up questions depending on the request type.

Example setup:
– Question 1: What kind of request is this?
→ Design
→ Engineering
→ HR

Each answer routes to its own section. So Design leads to questions like “What’s the output channel—social, print, other?” and Engineering might ask “Is this a new feature or a bug?” Then it flows back to a shared final section that collects contact info and deadline.

That setup took under ten minutes, but it felt like a huge upgrade. It let me avoid showing irrelevant questions to the wrong teams, and it reduced bounces. People actually finished the form.

Still, worth noting:
– You can’t use AND/OR logic natively.
– You can’t trigger external events (like sending different emails) based on answers. For more flexibility, I had to branch things out in Zapier later based on form input.

EmbedClutterFreeSubmissionLinksInWorkflows

Not everyone is going to go hunt down your Google Form link. I learned fast that the form needs to live in places people *already* use. I embedded the submission link in some Slack bookmarks for high-traffic channels, added it to our Confluence nav sidebar, and even inserted it into recurring calendar events for weekly sprint prep.

Here’s a trick to clean it up:
1. Publish the form.
2. Grab the “pre-filled link” option (in the three-dot menu).
3. Pre-fill anything you want to lock in, like Department = “Design,” then shorten that URL using Bit.ly or whatever tracker link you use.

Now your embedded links can act like different versions targeted to each team—even though it’s just one underlying form.

Also: move the Form name and description out of the Google Form UI and into the embed widget, so you avoid that ugly double-header thing. You can use HTML iframe snippets and wrap it in a container with your own styling.

HandleDuplicateOrSpamSubmissionsInAirtable

Here’s the situation: someone fills out the form twice because they were impatient and didn’t see a confirmation. Or they clicked Submit, then hit the Back button and fixed a typo and hit Submit again. Now you have two very similar records in Airtable.

To prevent this, I added two automations:
1. Airtable automation that sends a confirmation email *with the Airtable Record ID embedded*
2. A formula field that combines Name + Email + Request Type + Date and then marks duplicates warning if an identical combo exists

If the same formula value exists more than once, I tag it with a “Potential duplicate” label. On views filtered by that label, I occasionally spot-check and manually mark the correct one using a checkbox field. This isn’t perfect, but it’s less annoying than accidentally working on something twice.

For spam, I just used Google’s native captcha setting, and limited responses to only allow people logged into their work email. Once I locked that, the weird anonymous joke submissions stopped pretty quick 🙂

SendTriageNotificationsUsingFieldBasedRouting

I needed each team to know about new submissions *as they arrived* — but not all teams needed all the data. So I ended up building multi-branch notifications based on the “Team” or “Request Type” field.

Using Zapier:
– Zap starts on new Google Sheet row
– Route based on “Request Type” using a Filter step
– Send a Slack message or an Airtable comment directly to assigned owners

On Slack, each new submission gets dropped into a thread with a short summary:
> New Design Request from Jane Doe
> Context: Social media infographic for Q2 launch
> Due: Next Tuesday

I also included a direct “View in Airtable” link (which uses the record’s unique Airtable URL). If you want to get fancy, generate that by combining the base URL and the Record ID using a formula field.

There’s a funny bug here: sometimes the Slack messages showed `undefined` instead of the name. That was traced back to a missing column header in the Sheets file — I had accidentally typed `Full name` in the Form and then created a column called `fullname` (no space) in the Sheet. Zapier doesn’t know what to do with that mismatch, so it throws silently. Fun.

ManageFieldChangesWithoutBreakingEverything

Let me end with one thing I did wrong—and it snowballed. I renamed a Form field while people were already submitting real requests. Specifically, I changed “Describe what you need” to “Details and context” because it sounded nicer. BUT:
– That changed the Sheets column name
– Which broke my Zap because step 2 was looking for the old column header
– And the next field shifted positions, so the column order changed too

Now the Zap started assigning the “Deadline” value to the “Description” field in Airtable, and the requests were showing up like:
> Description: 2024-07-05
> Deadline: [blank]

😩

I had to go back and:
– Revert the field name
– Manually fix about twenty Airtable records
– Create a test Zap just for new preview data

So if you’re reading this and you haven’t named things yet—name them clearly and never look back. Airtable doesn’t handle schema changes gracefully, and Zapier absolutely does not warn you if a Sheet column name vanishes. Rename at your own risk ¯\_(ツ)_/¯

Leave a Comment