Skip to main content

How to build a HIPAA-compliant patient registration and insurance verification intake in Formaloo

Learn how to build a HIPAA and GDPR-compliant patient registration form in Formaloo, with admin-only PHI fields, automatic anonymization after your retention window, and role-based portal access for front-desk staff at every location.

What you'll build

By the end of this guide, you'll have a patient registration form that captures insurance and ID uploads directly into admin-only fields, so protected health information stays out of view until your front-desk team verifies it. Verification status changes trigger the right email automatically, PHI anonymizes itself after your retention window closes, and each location's front-desk team only ever sees the patients assigned to them.

When to use this

  • Your clinic operates across more than one location and front-desk staff at one site shouldn't see another site's patients

  • You're collecting insurance cards and photo ID digitally but need them hidden from anyone who isn't verifying them

  • You need a retention policy for protected health information instead of keeping every record indefinitely

  • Patients are calling to check on insurance verification instead of getting a status update automatically

  • You're moving off paper intake clipboards and need something that holds up under HIPAA and GDPR scrutiny

Part 1 — Build the intake form

This is the form that becomes your patient database. It captures the patient's details, routes them to the right location, and gates the insurance section behind a simple yes/no question so patients who self-pay never see irrelevant fields. The fastest way to build it is with Magic Create, Formaloo's AI form builder, so you're verifying a generated form rather than dragging in fields one at a time.

💡 Want a fully-built form in seconds instead of dragging fields one by one? Magic Create builds your form, fields, and field IDs from a plain-language prompt. This is the cornerstone article for every workflow that starts with "describe your form to the AI."

1. Open Magic Create: From your Formaloo homepage, click Magic Create.

2. Describe the form: Paste a prompt describing the intake, for example: "A patient registration form for a multi-location clinic. Start with a yes/no consent question for HIPAA and GDPR processing. Then collect full name, date of birth, phone number, email, home address, a dropdown for which clinic location the patient is registering at (options: Downtown clinic, Uptown clinic), reason for visit, and a yes/no for whether the patient has insurance. If yes, show insurance provider, policy or member ID, and file uploads for the front and back of the insurance card. Also collect a file upload for a government ID. Make the insurance card uploads, ID upload, verification status dropdown (Not started, Pending review, Verified, Needs follow-up), an assignee field, and an internal notes field all admin-only."

3. Generate the form: Click Create and let Magic Create build the form.

4. Verify your fields: Your form should look like this, Magic Create will have generated most of it. Verify each field and field ID matches exactly.

Field (question form)

Field ID

Type

Do you consent to Formaloo storing and processing this information under HIPAA and GDPR?

privacy_consent

Yes/No

What's the patient's full name?

patient_full_name

Short text

What's the patient's date of birth?

patient_dob

Date

What's the best phone number to reach the patient?

patient_phone

Short text

What's the patient's email address?

patient_email

Email

What's the patient's home address?

patient_address

Long text

Which location is this registration for?

registration_location

Dropdown

What's the reason for today's visit?

visit_reason

Short text

Does the patient have health insurance?

has_insurance

Yes/No

Who's the insurance provider?

insurance_provider

Short text

What's the insurance policy or member ID?

insurance_policy_id

Short text

Upload a photo of the front of the insurance card

insurance_card_front

File upload (admin-only)

Upload a photo of the back of the insurance card

insurance_card_back

File upload (admin-only)

Upload a government-issued photo ID

patient_id_upload

File upload (admin-only)

What's the verification status?

verification_status

Dropdown (admin-only)

Who's the assigned staff member?

assignee

Assignee field (admin-only)

Internal notes

internal_notes

Long text (admin-only)

📖 First time setting up fields only your team can see? See what admin-only fields are and how they help.

5. Publish the form: Click Publish in the island bar at the top of the editor. Publish is different from Save, Save applies to logic rules, email templates, and PDF templates, not the form itself.

Part 2 — Set up the logic

This is where the form stops being a static list of questions and starts behaving like a real intake process. You'll gate the whole form behind consent, show the insurance section only when it's relevant, and route each new registration to the right location's front-desk team automatically. The fastest way to do this is Magic Logic, which turns a plain-language description into a set of rules you can review before saving.

💡 Want your form to show, hide, skip, or require fields based on what someone just answered? What is logic in Formaloo is the foundational guide, covering what logic is and how it differs from calculation.

1. Open advanced logic: In your form editor, open Advanced logic from the settings panel on the right side, then go to the Logic tab.

2. Open Magic Logic: Click Magic Logic in the top right corner of the Logic panel.

3. Describe the rules: Paste a prompt describing all four rules at once: "If 'Do you consent to Formaloo storing and processing this information under HIPAA and GDPR?' is No, hide every field below it and show a message that registration can't continue without consent. Default: rest of the form is visible. If 'Does the patient have health insurance?' is Yes, show the insurance provider, policy or member ID, and both insurance card upload fields. Default: those four fields are hidden. On submit, if 'Which location is this registration for?' equals Downtown clinic, assign 'Who's the assigned staff member?' to the Downtown front desk team. If it equals Uptown clinic, assign to the Uptown front desk team. On update, if 'What's the verification status?' is changed to Verified, send the insurance verified email to the patient's email. If it's changed to Needs follow-up, send the needs follow-up email to the patient's email."

4. Generate and review the rules: Click Generate rules. Review the AI's preview of each rule, and approve, redo, or cancel as needed.

5. Make the consent question required: While you're in the form editor, open "Do you consent to Formaloo storing and processing this information under HIPAA and GDPR?" and turn on Required, so nobody can submit without answering it.

6. Save your logic: Once you're satisfied with the generated rules, click Save in the top right corner.

Part 3 — Create the email templates

Four emails carry this workflow from submission through verification: one confirms the registration, one alerts front-desk staff that a new patient is waiting on them, and two follow up on whatever the verification outcome turns out to be.

💡 Want to send branded, personalized emails instead of Formaloo's plain default notification? How to create and send custom email templates is the foundational guide. Reference it any time a step involves creating or selecting an email template.

1. Open email templates: Click your profile icon, go to Apps & integrations, then Email templates.

2. Create the registration received template: Click + Add new template, name it "Registration received." Set the subject to "Your registration at @registration_location is confirmed." Add an AI block and prompt it to write a warm, brief confirmation to @patient_full_name confirming their registration for @visit_reason was received and that staff will verify their insurance before the visit. Save.

3. Create the front-desk alert template: Add another template named "New registration alert." Subject: "New patient registration at @registration_location." Prompt it to write a short, factual internal alert referencing @patient_full_name, @visit_reason, and @registration_location, noting that insurance verification is pending. Save.

4. Create the insurance verified template: Add a template named "Insurance verified." Subject: "Your insurance is verified, @patient_full_name." Prompt it to write a short, reassuring confirmation that insurance is verified ahead of the visit. Save.

5. Create the needs follow-up template: Add a template named "Needs follow-up." Subject: "We need a bit more info before your visit." Prompt it to write a clear, non-alarming message asking the patient to call or reply with missing insurance details. Save.

6. Connect the confirmation and alert emails to submission: Back in Advanced logic, under On submit, add a Send email rule using the "Registration received" template to the patient's email field, and a second Send email rule using the "New registration alert" template to the assigned staff member.

📖 Piping @patient_full_name, @registration_location, and other field values into these templates works through answer piping.

Part 4 — Create the PDF template

Front-desk staff need one document per patient that pulls together identity, insurance, and consent for the chart, not four separate screenshots.

💡 Want every form submission to generate a polished, branded document automatically? How to create PDF templates to turn responses into documents is the foundational guide.

1. Open PDF templates: Click your profile icon, go to Apps & integrations, then PDF templates.

2. Add a new template: Click + Add new template, name it "Patient registration & insurance verification summary."

3. Switch to HTML view: Toggle the editor to HTML and paste your design, using @patient_full_name, @patient_dob, @registration_location, @insurance_provider, @verification_status, and PR-@rowid as the reference number for the header.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Patient Registration &amp; Insurance Verification Summary</title>
<style>
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Playfair+Display:ital@1&display=swap');

* { box-sizing: border-box; }

body {
margin: 0;
padding: 0;
background: #ffffff;
font-family: 'Inter', system-ui, -apple-system, sans-serif;
color: #1a1a1a;
}

.page {
max-width: 760px;
margin: 0 auto;
padding: 60px 72px;
}

.header {
display: flex;
justify-content: space-between;
align-items: flex-start;
border-bottom: 1px solid #eaeaea;
padding-bottom: 24px;
margin-bottom: 36px;
}

.header h1 {
font-size: 22px;
font-weight: 700;
margin: 0 0 6px 0;
letter-spacing: -0.01em;
}

.header .sub {
font-size: 13px;
color: #999;
}

.header .meta {
text-align: right;
font-size: 13px;
color: #666;
}

.header .meta strong {
display: block;
color: #1a1a1a;
font-size: 14px;
margin-bottom: 2px;
}

.section {
margin-bottom: 32px;
}

.section-title {
font-size: 10px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.08em;
color: #aaaaaa;
margin-bottom: 14px;
}

.field-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 0 32px;
}

.field {
padding: 10px 0;
border-bottom: 1px solid #f0f0f0;
}

.field.full {
grid-column: 1 / -1;
}

.field-label {
font-size: 11px;
color: #999;
margin-bottom: 4px;
}

.field-value {
font-size: 14px;
color: #1a1a1a;
font-weight: 500;
}

.badge {
display: inline-block;
font-size: 11px;
font-weight: 600;
padding: 4px 10px;
border-radius: 100px;
background: #eef6ee;
color: #2f7a3f;
}

.consent-block {
background: #f9f9f9;
border-left: 3px solid #d0d0d0;
padding: 18px 20px;
font-size: 12.5px;
line-height: 1.6;
color: #555;
border-radius: 4px;
}

.signature-line {
margin-top: 20px;
padding-top: 16px;
border-top: 1px dashed #ddd;
}

.signature-name {
font-family: 'Playfair Display', Georgia, serif;
font-style: italic;
font-size: 22px;
color: #1a1a1a;
margin-bottom: 4px;
}

.signature-caption {
font-size: 11px;
color: #999;
}

.footer {
margin-top: 48px;
padding-top: 20px;
border-top: 1px solid #eaeaea;
display: flex;
justify-content: space-between;
font-size: 11px;
color: #999;
}
</style>
</head>
<body>
<div class="page">

<div class="header">
<div>
<h1>Patient registration &amp; insurance verification</h1>
<div class="sub">Reference PR-@rowid</div>
</div>
<div class="meta">
<strong>@registration_location</strong>
Submitted @created_at
</div>
</div>

<div class="section">
<div class="section-title">Patient information</div>
<div class="field-grid">
<div class="field">
<div class="field-label">Full name</div>
<div class="field-value">@patient_full_name</div>
</div>
<div class="field">
<div class="field-label">Date of birth</div>
<div class="field-value">@patient_dob</div>
</div>
<div class="field">
<div class="field-label">Phone number</div>
<div class="field-value">@patient_phone</div>
</div>
<div class="field">
<div class="field-label">Email address</div>
<div class="field-value">@patient_email</div>
</div>
<div class="field full">
<div class="field-label">Home address</div>
<div class="field-value">@patient_address</div>
</div>
<div class="field full">
<div class="field-label">Reason for visit</div>
<div class="field-value">@visit_reason</div>
</div>
</div>
</div>

<div class="section">
<div class="section-title">Insurance information</div>
<div class="field-grid">
<div class="field">
<div class="field-label">Has insurance</div>
<div class="field-value">@has_insurance</div>
</div>
<div class="field">
<div class="field-label">Verification status</div>
<div class="field-value"><span class="badge">@verification_status</span></div>
</div>
<div class="field">
<div class="field-label">Insurance provider</div>
<div class="field-value">@insurance_provider</div>
</div>
<div class="field">
<div class="field-label">Policy / member ID</div>
<div class="field-value">@insurance_policy_id</div>
</div>
<div class="field">
<div class="field-label">Insurance card, front</div>
<div class="field-value">@insurance_card_front</div>
</div>
<div class="field">
<div class="field-label">Insurance card, back</div>
<div class="field-value">@insurance_card_back</div>
</div>
<div class="field full">
<div class="field-label">Photo ID on file</div>
<div class="field-value">@patient_id_upload</div>
</div>
</div>
</div>

<div class="section">
<div class="section-title">Consent on file</div>
<div class="consent-block">
The patient named above consented to Formaloo collecting, storing, and processing this registration and insurance information in accordance with HIPAA and GDPR requirements. Protected health information is held in admin-only fields until verified by front-desk staff, and is automatically anonymized once the practice's configured retention window has passed.
<div class="signature-line">
<div class="signature-name">@patient_full_name</div>
<div class="signature-caption">Consent acknowledged @created_at</div>
</div>
</div>
</div>

<div class="footer">
<div>Confidential — contains protected health information. Do not distribute.</div>
<div>[Practice name]</div>
</div>

</div>
</body>
</html>

4. Save the template.

5. Generate the PDF automatically: In Advanced logic, under On submit, add a Generate PDF rule using this template. The file appears on the response row for every new registration.

📖 See how to send custom PDFs with email notifications if you'd rather attach this PDF to the confirmation email instead of just leaving it on the record.

Part 5 — Turn on automatic PHI anonymization

This is the part that actually satisfies a retention policy instead of just talking about one. Once it's on, any record older than the number of days you set gets its protected health information anonymized automatically, per record, counted from the day it was submitted.

💡 Need to point a client or compliance team to Formaloo's data protection stance? GDPR at Formaloo links out to the Terms, Privacy Policy, and DPA. Link it whenever a workflow handles sensitive personal data.

1. Open privacy and compliance settings: From the island toolbar at the top of the form editor, open the form settings icon and find the Privacy and compliance section.

Note: If this section shows a prompt instead of the settings, your workspace doesn't have the automatic anonymization add-on yet. You'll see a prompt and the option to contact sales support to add it.

2. Turn on automatic anonymization: Enable the toggle for automatic anonymization.

3. Set the retention window: In the Anonymize after (days) field, enter how many days after submission a record should be anonymized, anywhere from 1 to 3,350 days.

4. Choose which fields to anonymize: Under Select fields to anonymize, click Select fields and choose the PHI fields, at minimum the insurance card uploads, ID upload, insurance policy or member ID, and insurance provider.

5. Confirm the warning: Review the confirmation modal, this action can't be undone once a record is anonymized, then save your settings.

📖 Confused about why a feature is gated or what counts toward your plan's usage? Pay only for what you use: Formaloo add-ons and workspace usage explained covers how add-ons like this one work.

Part 6 — Set up role-based portal access by location

Patients never log in anywhere in this workflow, they only fill out the public form. What needs a portal is the internal side: front-desk staff should only see the patients assigned to them, and that assignment already routes by location thanks to the logic rule from Part 2.

💡 Want to give clients, applicants, or teammates their own space to submit and track requests? How to create a portal and manage users' access is the foundational guide to building a portal and controlling who can see it.

1. Activate the portal: Open your project and click the gear icon in the top right corner, then click Activate portal.

2. Keep the intake page public: On the page holding your registration form, set external access to Public, so patients never need to log in to register.

3. Create a team per location: In your workspace member settings, create a team for each clinic location (for example, Downtown front desk and Uptown front desk) and add each location's staff to their team.

📖 See what is a team in Formaloo and how to manage it if you haven't created teams before.

4. Add a shared assigned-patients page: Add a Kanban data block connected to your form, grouped by verification status. This is the one page every front-desk team member opens.

5. Restrict it to assigned records only: Switch the data block to Edit mode, click Options, scroll to Manage access, select the assignee field, and turn on Allow assignees to view only their data. Because the Downtown team is only ever assigned Downtown registrations, each team automatically sees just their own location's patients on this same shared page, no duplicate pages required.

💡 Want incoming submissions to land on the right person's desk automatically, and only theirs? How to automatically assign submissions to the right team member or team, and control what each assignee sees covers this pattern end to end.

6. Restrict the page to internal staff: Click the three-dot menu next to the page in the portal navigation, select Access, and set it to internal workspace team members only, not public or anyone with the link.

7. Give compliance staff full visibility: Add a second Kanban or table page with no assignee restriction, and set its access to a compliance or records-admin team so they can see every location's registrations for auditing.

📖 First time restricting an entire page instead of just filtering data within it? See how to restrict users' access to pages in your portal.

What you now have

Patients register once, from any device, without ever creating an account or seeing a single admin field. Insurance cards and IDs land directly in admin-only fields, invisible until a staff member opens the record to verify them, and both sides get an automatic email the moment verification status changes. Records older than your retention window anonymize themselves without anyone remembering to run a cleanup job. Front-desk staff at every location open the same shared page and only ever see the patients assigned to their site.

Ready-to-use templates

Don't build this from scratch, we've already put it together for you.

  • Patient intake & consent workflow for healthcare — A two-page intake and consent form with conditional insurance logic, AI-powered email templates, a PDF consent document, and an admin Kanban pipeline. Start here and layer in the admin-only PHI fields, anonymization, and location-based access from this guide.

  • Employee request workflow — Routes internal requests by type and notifies the right team automatically. The same location-based assignment pattern from Part 2 applies directly if you'd rather route by department than by clinic.

  • Job applicant tracking workflow — Tracks records across stages with reviewer assignments from one view, a useful reference for the assignee-based access restriction covered in Part 6.

Learn more how-tos

Did this answer your question?