Skip to main content

How to build a secure KYC intake with automatic data redaction for financial services in Formaloo

Learn how to build a secure KYC intake in Formaloo with admin-only account fields, automatic data anonymization, and a role-gated compliance review portal.

What you'll build

By the end of this guide, you'll have a multi-page KYC intake form that collects identity documents, a Social Security number or tax ID, and financial account details, all gated behind admin-only internal fields and role-restricted portal pages. Compliance officers get a full Kanban pipeline with every raw identifier visible; everyone else, including leadership, only ever sees aggregate charts or nothing at all. Records anonymize automatically once your retention window closes, so sensitive data never sits exposed indefinitely.

When to use this

  • Your bank, fintech, or lender needs a compliant way to collect government ID and proof of address before opening an account

  • Compliance keeps finding SSNs and account numbers sitting in a shared inbox or spreadsheet with no retention plan

  • You need reviewers to see full applicant records while the rest of the team never touches raw identifiers

  • Records need to disappear automatically once your retention window closes, not whenever someone remembers to delete them

  • Leadership wants visibility into KYC volume and turnaround time without ever opening an individual applicant's file

Step-by-step

Part 1 — Build the KYC intake form

Start with the form itself. Formaloo's Magic Create builds the whole multi-page structure, including the internal fields your compliance team needs, from one plain-language prompt.

1. Create a new project: From your Formaloo homepage, click Create new and choose Form. Form starts you with one form already attached, which is the right starting point here.

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

💡 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." See how to create any form with AI using Magic Create in Formaloo.

3. Describe the form: Paste a prompt describing every section, including which fields should be admin-only:

Build a multi-page KYC verification form for a financial services company with four sections: applicant identity (full legal name, date of birth, email, residential address, country of residence, all short text or date or email fields), identity documents (ID type dropdown with Passport/Driver's license/National ID card, a file upload for the government ID, a required file upload for proof of address), financial account details (Social Security number or tax ID as short text, a Yes/No field asking if they already have an account, an existing account number short text field shown only if yes), and consent (a Yes/No consent to identity verification and data processing under GDPR, required, plus a signature field). Add these admin-only fields: a compliance review status dropdown with options Submitted, In review, Verified, Additional info needed, and Rejected; an Assignee field for the compliance officer; a risk level dropdown with Low, Medium, and High; a short text field for the assigned account number, set once a new account is opened; and a long text field for internal compliance notes.

4. Click Create: Formaloo generates the full multi-page form, its fields, and field IDs.

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

📖 Consent to data processing under GDPR is central to this workflow. See GDPR at Formaloo for Formaloo's data protection stance, including the Terms, Privacy Policy, and DPA.

Public-facing fields

Field (question form)

Field ID

Type

What's your full legal name?

full_legal_name

Short text

What's your date of birth?

date_of_birth

Date

What's your email address?

email

Email

What's your residential address?

residential_address

Long text

What's your country of residence?

country_of_residence

Dropdown

What type of ID are you submitting?

id_type

Dropdown

Upload a photo of your government-issued ID

id_document

File upload

Upload proof of address (utility bill or bank statement, issued within the last 3 months)

proof_of_address_document

File upload

What's your Social Security number or national tax ID?

ssn_tax_id

Short text

Do you already have an account with us?

is_existing_customer

Yes/No

What's your existing account number?

existing_account_number

Short text

Do you consent to identity verification and data processing under GDPR?

data_processing_consent

Yes/No

Please sign to confirm the information provided is accurate

applicant_signature

Signature

Admin-only fields

Field (question form)

Field ID

Type

Compliance review status

review_status

Dropdown (admin-only)

Assigned compliance officer

assigned_officer

Assignee (admin-only)

Risk level

risk_level

Dropdown (admin-only)

Assigned account number

assigned_account_number

Short text (admin-only)

Internal compliance notes

internal_notes

Long text (admin-only)

💡 Want internal fields, like status, assignee, or risk level, invisible to the person filling out the form? Admin-only fields are the mechanism. See what are admin-only fields and how they help.

6. Mark the required fields: Set "Upload a photo of your government-issued ID," "Upload proof of address," and "Please sign to confirm the information provided is accurate" to required.

💡 Want to make sure applicants can't skip a critical document or the signature? This is the foundational guide to marking fields required. See mandate respondent input with Formaloo's required fields feature.

7. Publish the form: From the island bar at the top of the editor, click Publish.

Part 2 — Set up logic and automatic anonymization

This part builds the conditional logic that gates the account number field and blocks submission without consent, then turns on the setting that removes sensitive data automatically once your retention window passes.

1. Open advanced logic: In the form settings panel on the right side of the editor, click Advanced logic and navigate to the Logic tab.

💡 Want your form to show, hide, skip, or require fields based on what someone just answered? This is the foundational guide to logic in Formaloo. See what is logic in Formaloo.

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

3. Describe the rules: Paste this prompt describing every rule at once:

If "Do you already have an account with us?" equals Yes, show "What's your existing account number?" and hide it by default otherwise. If "Do you consent to identity verification and data processing under GDPR?" equals No, show a warning that verification can't proceed without consent and block submission. When the form is submitted, assign "Assigned compliance officer" to the Compliance team. If "Risk level" is changed to High, reassign "Assigned compliance officer" to the Senior Compliance team.

4. Generate and review the rules: Click Generate rules. The AI previews each rule so you can approve, redo, or cancel it.

5. Save the logic: Make any manual adjustments, then click Save in the top right corner.

6. Add the status-driven email rules: Still in the Logic tab, add three On update rules: when "Compliance review status" is changed to Verified, Additional info needed, or Rejected, send the matching email template from Part 3 to @email. Part 3 covers building those templates first if you haven't yet.

💡 Want different emails to go out depending on the answer, like an approval versus a rejection? This guide covers routing email notifications with conditional rules. See how to send and receive conditional email notifications.

7. Turn on automatic data anonymization: From the island bar at the top of the form editor, open the form's settings icon and scroll to the Privacy and compliance section.

8. Set the retention window: In "Anonymize after (days)," enter a window that comfortably covers your KYC review and regulatory retention period, for example 365. This counts days from submission, not from the date a reviewer approves the record.

📖 For the full mechanics of this setting, see how to automatically anonymize records after form submission in Formaloo.

9. Choose which fields anonymize: Under "Select fields to anonymize," select ssn_tax_id, existing_account_number, assigned_account_number, id_document, and proof_of_address_document.

Note: Turning this on shows a "This can't be undone" warning. Once a record's retention window passes, the selected fields are cleared permanently.

💡 Confused about why a feature is gated or what counts toward your plan's usage? This explains how Formaloo's modular add-ons and usage limits work together. See pay only for what you use: Formaloo add-ons and workspace usage explained.

Part 3 — Create the compliance email templates

Six templates cover the full lifecycle: a confirmation to the applicant, an internal notification to compliance, three status-driven outcomes, and a high-risk escalation.

1. Open the email templates panel: Click your profile icon, go to Apps and integrations, find Custom email templates, and click Add new template.

💡 Want to send branded, personalized emails instead of Formaloo's plain default notification? This is the foundational guide to building and sending custom email templates. See how to create and send custom email templates.

2. Build the submission confirmation: Name it "KYC submission received," subject "We've received your verification for @full_legal_name." Clear the body, add an AI block, and prompt it to write a warm, factual confirmation that documents were received and a compliance reviewer will confirm the outcome soon.

3. Build the internal notification: Name it "New KYC submission," subject "New KYC submission: @full_legal_name (Ref KYC-@rowid)." Prompt it to notify the compliance team a new submission arrived and needs review.

4. Build the three status emails: Create "KYC verification approved," "Additional information needed," and "KYC verification unsuccessful," each referencing @review_status and written in a calm, factual tone matching the outcome.

5. Build the escalation email: Create "High-risk KYC case escalated," subject referencing @full_legal_name and @rowid, prompting a short internal notice to the Senior Compliance team.

6. Turn on the submission notifications: From the right sidebar of the form editor, click Notify. Turn on Receive email notification for your own team, then turn on Send email to respondent and select the confirmation template for @email.

📖 See how to dynamically pull form data into custom emails, PDFs, and AI prompts for the full list of variables you can pipe into any template.

Part 4 — Build the compliance PDF record

Every verified KYC submission generates a confidential PDF record, useful as the audit trail a regulator or internal auditor would review.

1. Open the PDF templates panel: Click your profile icon, go to Apps and integrations, find Custom PDF templates, and click Add new template.

💡 Want every form submission to generate a polished, branded document automatically? This is the foundational guide to building a PDF template from a submission. See how to create PDF templates to turn responses into documents.

2. Switch to HTML view: Toggle the editor to HTML and paste the template below. It renders applicant identity, document links, financial account details, compliance review fields, and the applicant's signature in an italic serif style, with a confidentiality banner and footer.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>KYC Verification Record</title>
<style>
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Georgia&display=swap');

* { box-sizing: border-box; margin: 0; padding: 0; }

body {
background: #ffffff;
font-family: 'Inter', system-ui, -apple-system, sans-serif;
color: #1a1a1a;
-webkit-font-smoothing: antialiased;
}

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

/* Header */
.header {
display: flex;
justify-content: space-between;
align-items: flex-start;
border-bottom: 2px solid #1a1a1a;
padding-bottom: 24px;
margin-bottom: 8px;
}

.header .doc-title {
font-size: 22px;
font-weight: 700;
letter-spacing: -0.02em;
}

.header .doc-sub {
font-size: 12px;
color: #999;
margin-top: 4px;
}

.header .doc-meta {
text-align: right;
font-size: 12px;
color: #666;
line-height: 1.6;
}

.confidential-banner {
background: #1a1a1a;
color: #fff;
font-size: 10px;
letter-spacing: 0.12em;
text-transform: uppercase;
text-align: center;
padding: 6px 0;
margin-bottom: 32px;
}

/* Sections */
.section {
margin-bottom: 32px;
}

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

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

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

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

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

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

.field-value a {
color: #1a1a1a;
text-decoration: underline;
}

.badge {
display: inline-block;
font-size: 12px;
font-weight: 600;
padding: 3px 10px;
border-radius: 20px;
background: #f2f2f2;
color: #1a1a1a;
}

/* Consent inset */
.inset {
background: #f9f9f9;
border-left: 3px solid #1a1a1a;
padding: 16px 20px;
font-size: 12px;
color: #555;
line-height: 1.6;
}

/* Signature */
.signature-block {
margin-top: 20px;
display: flex;
justify-content: space-between;
align-items: flex-end;
}

.signature-value {
font-family: Georgia, 'Times New Roman', serif;
font-style: italic;
font-size: 26px;
color: #1a1a1a;
border-bottom: 1px solid #ccc;
padding-bottom: 6px;
min-width: 260px;
}

.signature-date {
font-size: 11px;
color: #999;
text-align: right;
}

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

<div class="header">
<div>
<div class="doc-title">KYC verification record</div>
<div class="doc-sub">Identity &amp; financial account verification, financial services onboarding</div>
</div>
<div class="doc-meta">
Ref: KYC-@rowid<br>
Submitted: @created_at<br>
Status: @review_status
</div>
</div>

<div class="confidential-banner">Confidential &mdash; compliance use only</div>

<div class="section">
<div class="section-title">Applicant identity</div>
<div class="field-grid">
<div class="field">
<div class="field-label">Full legal name</div>
<div class="field-value">@full_legal_name</div>
</div>
<div class="field">
<div class="field-label">Date of birth</div>
<div class="field-value">@date_of_birth</div>
</div>
<div class="field">
<div class="field-label">Email address</div>
<div class="field-value">@email</div>
</div>
<div class="field">
<div class="field-label">Country of residence</div>
<div class="field-value">@country_of_residence</div>
</div>
<div class="field field-full">
<div class="field-label">Residential address</div>
<div class="field-value">@residential_address</div>
</div>
</div>
</div>

<div class="section">
<div class="section-title">Identity verification documents</div>
<div class="field-grid">
<div class="field">
<div class="field-label">ID document type</div>
<div class="field-value">@id_type</div>
</div>
<div class="field">
<div class="field-label">Government-issued ID</div>
<div class="field-value"><a href="@id_document">View uploaded document</a></div>
</div>
<div class="field field-full">
<div class="field-label">Proof of address</div>
<div class="field-value"><a href="@proof_of_address_document">View uploaded document</a></div>
</div>
</div>
</div>

<div class="section">
<div class="section-title">Financial account details</div>
<div class="field-grid">
<div class="field">
<div class="field-label">Social Security number / national tax ID</div>
<div class="field-value">@ssn_tax_id</div>
</div>
<div class="field">
<div class="field-label">Existing customer</div>
<div class="field-value">@is_existing_customer</div>
</div>
<div class="field">
<div class="field-label">Existing account number</div>
<div class="field-value">@existing_account_number</div>
</div>
<div class="field">
<div class="field-label">Assigned account number</div>
<div class="field-value">@assigned_account_number</div>
</div>
</div>
</div>

<div class="section">
<div class="section-title">Compliance review</div>
<div class="field-grid">
<div class="field">
<div class="field-label">Review status</div>
<div class="field-value"><span class="badge">@review_status</span></div>
</div>
<div class="field">
<div class="field-label">Risk level</div>
<div class="field-value">@risk_level</div>
</div>
<div class="field">
<div class="field-label">Assigned compliance officer</div>
<div class="field-value">@assigned_officer</div>
</div>
<div class="field field-full">
<div class="field-label">Internal compliance notes</div>
<div class="field-value">@internal_notes</div>
</div>
</div>
</div>

<div class="section">
<div class="section-title">Consent &amp; signature</div>
<div class="inset">
Applicant confirmed consent to identity verification and data processing under GDPR: <strong>@data_processing_consent</strong>. Records collected through this form are retained only for the period configured in this project's automatic data anonymization setting, after which personal identifiers are removed.
</div>
<div class="signature-block">
<div class="signature-value">@applicant_signature</div>
<div class="signature-date">Signed @created_at</div>
</div>
</div>

<div class="footer">
<div>Confidential &mdash; internal compliance document, not for external distribution</div>
<div>[Your organization name]</div>
</div>

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

3. Name and save the template: Give it a name, like "KYC verification record," and click Save.

4. Generate it automatically: Back in Advanced logic, add an On update rule: when "Compliance review status" is changed to Verified, generate a PDF using this template. The file appears on the response row.

📖 See how to send custom PDFs with email notifications if you also want the record attached to the approval email.

Part 5 — Activate the portal and gate access by role

This part turns the project into a portal with four groups: applicants who submit and track their own status, compliance reviewers who see full records, senior compliance who see only high-risk cases, and leadership who see aggregate charts with no raw identifiers.

1. Activate the portal: Open your project and click the settings (gear) icon. Select Activate Portal, click Manage user, and open the Setup Wizard.

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

2. Connect a user directory: Choose New user directory so applicant sign-ups are saved there, then step through portal settings and connect this KYC form's user profile field.

3. Add the applicant role: In the User directory, click Edit profile fields, scroll to User roles, and add an "Applicant" role.

💡 Want reviewers, approvers, and applicants to each see a different view of the same portal? This guide covers setting up roles so each person only sees what's relevant to them. See how to create and assign user roles in your portal.

4. Build the submission and status pages: Add a "Submit KYC verification" page with the form block, and a "My verification status" table page filtered to the applicant's own submissions.

5. Restrict "My verification status" to each applicant's own record: Switch to Edit mode on that data block, click Options, scroll to Manage access, select the profile field, and turn on Allow users to view only their data.

💡 Want each logged-in user to see only their own submissions, not everyone else's? This is the foundational guide to the "view only their data" access restriction. See how to let users view and edit their own data in your portal.

6. Add compliance officers as workspace members, not portal users: Compliance officers, senior compliance, and leadership are internal staff, so they belong on workspace teams, not in the portal's user directory. In Workspace settings, add them as team members and group them into "Compliance," "Senior compliance," and "Leadership" teams.

Note: The Assignee field only works with workspace members or teams, never external portal users. Internal staff never get a "portal role" through the Setup Wizard, that flow is reserved for applicants signing up without a Formaloo account.

7. Build the compliance pages: Add a Kanban page "All KYC submissions" grouped by review status, a table page "My assigned reviews" filtered to the logged-in officer, a table "Additional info needed" filtered by review status, and a table "Verified records" for the completed audit trail.

8. Restrict every compliance page to the Compliance team: On each page, click the three-dot menu next to the page name, select Access, and under internal users choose Specific teams, then select Compliance.

💡 Want a whole page in your portal visible only to a specific role, not just specific data within a page? This covers page-level access restriction. See how to restrict users' access to pages in your portal.

9. Restrict "My assigned reviews" to each officer's own queue: Switch to Edit mode on that data block, click Options, scroll to Manage access, select the assignee field, and turn on Allow assignees to view only their data.

10. Build and restrict the senior compliance page: Add a table "High-risk cases" filtered to risk level equals High, then restrict its Access to the Senior compliance team only, narrower than the general Compliance group.

11. Build and restrict the leadership pages: Add two chart pages, "Submissions by status" (bar, grouped by review status) and "Volume over time" (line, grouped by month), then restrict Access to the Leadership team. Chart data blocks show aggregates only, so leadership never sees an individual applicant's raw identifiers.

💡 Want a visual, drag-and-drop way to move records through stages, like a pipeline? This is the foundational guide to the Kanban data block. See how to create a Kanban board.

12. Publish and share the portal: From the island bar, publish the project and copy the portal's public URL for applicants.

📖 Custom domains are available on the Business plan or through the Brand removal add-on, so your portal can live at your own URL instead of a formaloo.com address.

What you now have

You now have a single KYC intake form that collects identity documents, an SSN or tax ID, and financial account details, with the truly internal-only data, like the assigned account number and review status, hidden behind admin-only fields. Records anonymize automatically once your retention window closes, so nothing sits exposed indefinitely. Compliance officers work a Kanban pipeline with full visibility, senior compliance only ever sees escalated high-risk cases, and leadership tracks volume through charts that never expose a single applicant's raw data.

Ready-to-use templates

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

  • Patient intake and consent workflow for healthcare — A two-page intake and consent form with conditional logic, AI-powered email templates, a PDF consent document, and an admin Kanban pipeline. The consent and document-collection pattern maps directly onto the identity verification steps in Part 1.

  • Employee request workflow — Internal request routing with status tracking and team-based approvals. Its admin-only status and assignee setup mirrors the compliance review fields in this guide.

  • AI-powered job application pipeline with candidate screening — Collects applications, screens candidates, and routes shortlisted applicants automatically. The document upload and reviewer-pipeline pattern is close to the compliance officer queue in Part 5.

What's next

Learn more how-tos

Did this answer your question?