Paper intake forms and emailed PDFs all share the same problem: someone has to read them and type the answers in somewhere else. That is double entry. Double entry is slow, and it is where most front-desk errors come from. A transposed insurance number, a misread date of birth, a phone number that is one digit off.
A Google Form fixes this. The patient fills it out once, on their phone or a tablet at the front desk, and the answers flow straight into a Google Sheet as one tidy row. No retyping. No handwriting to decipher. And because it is a real spreadsheet underneath, you can search it, filter it, and build the rest of your patient workflow on top of it.
This guide walks through exactly what to collect, how to wire the form to a structured sheet, how to auto-send a confirmation, and how to keep it private. If you would rather not build from scratch, you can copy our free patient intake template and adapt it.
What to collect on a patient intake form
Resist the urge to ask for everything. A long form gets abandoned or rushed. Collect what you genuinely need to book, contact, bill, and treat the patient safely. Group the fields so the form reads in a logical order, and mark each one required or optional on purpose.
- Demographics (required): first name, last name, date of birth, and preferred name or pronouns if relevant to your practice. Date of birth is your best deduplication key, so make it required.
- Contact (required): mobile phone, email, and mailing address. Ask which contact method they prefer for appointment reminders.
- Insurance (usually required): carrier or plan name, member ID, group number, and the policy holder if it is not the patient. For a cash or self-pay practice, this whole group can be optional.
- Emergency contact (required): name, relationship, and phone number. Keep it short.
- Reason for visit (required): a short free-text field, plus an optional checklist of common reasons so you can triage and report later.
- Consent and acknowledgments (required): a checkbox confirming they have read your privacy notice and consent to treatment. Use plain language and link to the full policy.
Two practical notes. First, avoid collecting more sensitive health detail than you actually use; the more protected health information you gather, the more you have to safeguard. Second, in Google Forms you can mark any question required and add response validation (for example, force the email field to be a valid email, or the phone field to match a digit pattern). That validation catches bad data before it ever reaches your sheet.
Connect the form to a structured sheet
Wire Form to Sheets
In the Google Forms editor, open the Responses tab and click Link to Sheets. Choose to create a new spreadsheet. From now on, every submission appends a row to a tab named Form Responses 1, with the first column being a timestamp and the rest matching your questions in order.
Treat that responses tab as raw and untouched. Do not sort it, delete rows, or insert columns, because the form writes to it on a fixed schedule and edits can shift your data. Instead, keep two tabs:
- Responses: the linked tab, exactly as Forms writes it. Read-only by convention.
- Patients: a derived tab that pulls from Responses and adds the clean, structured columns you actually work from (full name, normalized phone, an insurance flag, status, and notes).
Keeping the raw and the working copy separate means you never lose the original submission, and your formulas in the Patients tab can recompute safely as new rows arrive.
Clean and structure on arrival
On the Patients tab, use an ARRAYFORMULA in the header row so a single formula fills the whole column as new submissions come in. Say the Responses tab has first name in column B, last name in column C, and insurance carrier in column F. This formula builds a clean full name and flags any row missing insurance, all in one pass.
=ARRAYFORMULA(
IF(
'Responses'!B2:B = "",
,
{
TRIM('Responses'!B2:B & " " & 'Responses'!C2:C),
IF('Responses'!F2:F = "", "MISSING INSURANCE", "OK")
}
)
)
Put this in the first data cell of a two-column block on the Patients tab (for example cell A2, leaving B2 for the formula to spill into). The IF(...="" , , {...}) wrapper leaves rows blank until a real submission exists, so the sheet does not show errors on empty rows. The first column outputs the trimmed full name; the second outputs a plain text flag you can filter or conditionally format red. Swap the column letters to match your own question order.
From here you can layer on whatever you need: a QUERY to list only patients with missing insurance, conditional formatting to highlight today's intakes, or a status dropdown for your front desk.
Automate the confirmation and the record
An automatic confirmation email reassures the patient that their form went through, and it gives you a clean place to write a structured record the moment a submission lands. Apps Script handles both on a single form-submit trigger.
To set it up, open the spreadsheet, go to Extensions, then Apps Script, paste the function below, and add a trigger: in the Apps Script editor click the clock icon (Triggers), choose this function, event source From spreadsheet, event type On form submit. Adjust the column indexes to match your form.
function onIntakeSubmit(e) {
// e.values matches the Responses row, left to right.
// [0] Timestamp, [1] First, [2] Last, [3] Email,
// [4] Phone, [5] Insurance, [6] Reason for visit
const v = e.values;
const first = v[1];
const last = v[2];
const email = v[3];
const phone = v[4];
const insurance = v[5];
const reason = v[6];
// 1. Send the patient a confirmation
if (email) {
GmailApp.sendEmail(
email,
"We received your intake form",
"Hi " + first + ",\n\n"
+ "Thanks, we have your intake details and our "
+ "front desk will be in touch to confirm your "
+ "appointment.\n\nYour clinic team"
);
}
// 2. Write a structured record to the Patients tab
const ss = SpreadsheetApp.getActiveSpreadsheet();
const patients = ss.getSheetByName("Patients");
patients.appendRow([
new Date(), // recorded at
(first + " " + last).trim(), // full name
email,
phone,
insurance ? "OK" : "MISSING INSURANCE",
reason,
"New" // intake status
]);
}
A few things worth knowing. The e object only exists when the function runs from the form-submit trigger, so do not run it manually from the editor (it will fail because e is undefined). The first time it runs, Google asks you to authorize the script to send mail and edit the sheet; that is expected. And if you would rather append to the structured record with formulas instead of script, you can keep just the confirmation email here and let the ARRAYFORMULA above build the Patients tab.
Keep it private and compliant
If your form collects protected health information, privacy is not optional. The good news is that Google Workspace is HIPAA-eligible under a signed Business Associate Agreement (BAA), which covers Gmail, Drive, Sheets, and Forms. The BAA means Google's infrastructure meets the technical safeguard requirements; your practice is still responsible for the administrative side: who has access and how your team handles the data.
Do not collect PHI on a personal Gmail account. A free @gmail.com account is not covered by a BAA, so it is not an appropriate home for patient data. Use a paid Google Workspace edition with the BAA accepted in the admin console.
Beyond the BAA, a short checklist for the front desk:
- Restrict who can see responses. Share the spreadsheet only with the staff who need it, and turn off link sharing. Do not make the responses sheet public.
- Enforce 2-Step Verification for every account that can open the sheet. This is the single highest-value control you can turn on.
- Lock the form to the right audience. For a public intake link, keep it limited to one response setting off so patients are not signed in, but never expose the underlying sheet through that link.
- Limit what you collect. The less sensitive detail you gather, the smaller your risk if something goes wrong.
None of this is heavy lifting, but skipping it is how practices end up with patient data somewhere it should not be. Set the access controls once, turn on 2-Step Verification, and you have a private, structured intake pipeline running entirely inside tools you already pay for. Start from our free patient intake template if you want a head start.