Back to BlogIndustry Guides

Patient Intake Software: Digital Forms, Consent and E-Signature

Rupak Amin

Founder & Lead Engineer, RAITHub

13 min read

Patient intake software collects a patient's details, history, consent and insurance before the visit, through digital forms that change based on earlier answers. Off-the-shelf tools start around US$55 a month: IntakeQ's Forms Only plan is US$54.90. Build your own when intake is part of a product you sell, or when your workflow, integrations or audit needs go beyond a form tool.

If you would rather have it built for you, see how RAITHub would build this below.

What should patient intake software do?

Six jobs, and a tool that skips any of them pushes the work back onto reception staff.

FeatureWhat it doesWhat makes it hard
Digital intake formsDemographics, history, medications, allergies, reason for visitMobile-first layouts, save and resume, accessibility for older patients and screen readers
Conditional-logic form builderStaff edit questions and rules ("show this if that") without a developerVersioning: an answer must stay tied to the exact form version the patient saw
Consent capture and e-signatureTreatment, privacy and financial consents, signed and storedProving who signed what text, when, and keeping the record unaltered
Insurance card uploadFront and back photos, member ID, payerImage size and orientation on phones, malware scanning, storing files outside the public web root
Pre-visit remindersSMS or email links to complete intake before the visitKeeping health details out of the message text; patient contact preferences
Audit log of viewsA record of who opened which patient's intake, and whenLogging reads, not only edits, on every screen and export

For the wider health engineering picture (HIPAA, GDPR, FHIR and patient portals), read our guide to building health software.

What do patient intake tools cost?

Form-first tools are cheap; full check-in platforms quote by demo.

ProductPublished priceNotes
IntakeQForms Only US$54.90/month; Practice Management US$84.90/month; low-volume plans from US$29.90 (IntakeQ pricing)E-signatures, form reminders and a BAA on the forms plan; booking, client portal and claims on the practice plan
JotformFree, then US$39, US$49 and US$129/month (Jotform pricing)HIPAA features are listed as available only from the Gold plan and on Enterprise
PhreesiaNot published; demo required (Phreesia)Self check-in, benefits verification, copay collection and scheduling

Prices checked on 2 October 2026; confirm on each vendor's page. Note the Jotform row: a general form builder may need a higher tier before it is suitable for health data, so compare plans on the features you actually need, not the entry price.

Buy, build or hire?

OptionExamplesChoose this whenWatch out for
Off-the-shelf intake toolIntakeQ, Phreesia, or the intake module of your practice management systemYou run a practice and want intake live this monthIntake data sits in another vendor; check exports, API access and how it reaches your records system
No-code form builderJotform on a plan with health featuresYour forms are simple, volumes are low, and staff will maintain themPlan tier, data agreements, and logic that gets brittle as forms grow
Custom buildYour own web app or PWA with a form engine, e-signature and audit logIntake is part of a product you sell, it must write into your own data model, or you need view-level audit and role rules a tool cannot give youYou own security, uptime, form versioning and support

Doing it yourself with a no-code builder: a competent office manager can set up a basic intake form, consent and reminder in 1–3 days. The main risk is not the form; it is where the data goes afterwards, and whether every vendor in that chain has the agreements your adviser requires.

How does a conditional-logic intake form work?

Each question can carry a rule that decides whether it is shown. The same rules must run on the server, because a browser can be bypassed: the server decides which questions were visible, rejects answers to hidden ones, and enforces required fields on the visible ones.

The TypeScript below is a minimal, dependency-free version. Rules may only reference earlier questions, which prevents circular logic and lets the server evaluate the form in one pass.

type Answer = string | number | boolean | string[]

type Condition =
  | { questionId: string; equals: Answer }
  | { all: Condition[] }
  | { any: Condition[] }

interface Question {
  id: string
  label: string
  type: 'text' | 'number' | 'yesno' | 'choice'
  required?: boolean
  options?: string[]      // for 'choice'
  maxLength?: number      // for 'text'
  showIf?: Condition      // may reference earlier questions only
}

interface IntakeForm {
  formId: string
  version: number         // answers are stored against this exact version
  questions: Question[]
}

function matches(cond: Condition, answers: Record<string, Answer>): boolean {
  if ('all' in cond) return cond.all.every((c) => matches(c, answers))
  if ('any' in cond) return cond.any.some((c) => matches(c, answers))
  return answers[cond.questionId] === cond.equals
}

function checkType(q: Question, value: unknown): string | null {
  switch (q.type) {
    case 'text':
      if (typeof value !== 'string') return 'must be text'
      if (q.maxLength !== undefined && value.length > q.maxLength) return 'is too long'
      return null
    case 'number':
      return typeof value === 'number' && Number.isFinite(value) ? null : 'must be a number'
    case 'yesno':
      return typeof value === 'boolean' ? null : 'must be yes or no'
    case 'choice':
      return typeof value === 'string' && (q.options ?? []).includes(value)
        ? null
        : 'is not one of the options'
  }
}

type Result =
  | { ok: true; formId: string; version: number; answers: Record<string, Answer> }
  | { ok: false; errors: Record<string, string> }

// Run on the server for every submission. Never trust the client's view
// of which questions were visible.
export function validateIntake(form: IntakeForm, raw: Record<string, unknown>): Result {
  const clean: Record<string, Answer> = {}
  const errors: Record<string, string> = {}
  const known = new Set(form.questions.map((q) => q.id))

  for (const key of Object.keys(raw)) {
    if (!known.has(key)) errors[key] = 'is not on this form'
  }

  for (const q of form.questions) {
    // Visibility uses only answers already accepted, so a forged answer to a
    // hidden question can never unlock later questions.
    const visible = q.showIf ? matches(q.showIf, clean) : true
    const value = raw[q.id]
    const empty = value === undefined || value === null || value === ''

    if (!visible) {
      if (!empty) errors[q.id] = 'was answered but is hidden'
      continue
    }
    if (empty) {
      if (q.required) errors[q.id] = 'is required'
      continue
    }
    const problem = checkType(q, value)
    if (problem) errors[q.id] = problem
    else clean[q.id] = value as Answer
  }

  return Object.keys(errors).length > 0
    ? { ok: false, errors }
    : { ok: true, formId: form.formId, version: form.version, answers: clean }
}

// Example: the medication question appears only if the patient says yes.
const form: IntakeForm = {
  formId: 'new-patient',
  version: 3,
  questions: [
    { id: 'takesMeds', label: 'Do you take any medication?', type: 'yesno', required: true },
    {
      id: 'medList',
      label: 'Which medications?',
      type: 'text',
      required: true,
      maxLength: 2000,
      showIf: { questionId: 'takesMeds', equals: true },
    },
  ],
}

validateIntake(form, { takesMeds: false, medList: 'x' })
// { ok: false, errors: { medList: 'was answered but is hidden' } }

Three details matter in production. Store the form version with every submission, so a later edit to the form cannot change what a past answer meant. Publish forms as immutable versions rather than editing in place. And if you use a schema library such as Zod for the static parts, test its defaults carefully; our write-up of the Zod 4 partial() default-values bug shows how a validation library can quietly fill in values you did not send.

In the US, generally yes for many records, but the rules depend on the document, the state and the context.

General information; confirm with your adviser. This is not legal advice. Which consents can be signed electronically, and what disclosures you must give first, depends on your jurisdiction and the type of consent. Ask a qualified lawyer.

The federal ESIGN Act says a signature or record relating to a covered transaction "may not be denied legal effect, validity, or enforceability solely because it is in electronic form" (15 U.S.C. 7001). It defines an electronic signature as "an electronic sound, symbol, or process, attached to or logically associated with a contract or other record and executed or adopted by a person with the intent to sign the record" (15 U.S.C. 7006). The same section 7001 sets conditions, including consumer-consent disclosures, where a law requires information to be given to a consumer in writing. State laws, many based on the Uniform Electronic Transactions Act (Uniform Law Commission), add their own rules.

For engineering, that definition points to what to record: evidence of intent to sign, and a firm link between the signature and the exact record. A practical consent record stores:

  • the consent document's ID, version and a hash of its exact text
  • who signed (the patient, or a named guardian or carer acting for them)
  • the signature itself (typed name, drawn image or checkbox), with the time and the authenticated session
  • the action that showed intent, such as a button labelled "Sign and agree"
  • withdrawal, as a new record, never as an edit or delete

Outside the US, e-signature and consent rules differ. Do not assume the ESIGN position transfers to the UK, EU, Australia or elsewhere.

How do you log who viewed a patient's intake?

Write an append-only event for every read, not only every change, from the server, at the point the data is returned. In the US, the HIPAA Security Rule's audit controls standard asks covered entities and business associates to "implement hardware, software, and/or procedural mechanisms that record and examine activity in information systems that contain or use electronic protected health information" (45 CFR 164.312(b)). What exactly you must log and keep is for your compliance adviser; the table is a sensible engineering baseline.

EventRecord
Intake viewedActor ID and role, patient ID, submission ID, time, request ID
Insurance card image opened or downloadedAs above, plus the file ID; signed URLs that expire in minutes
Export or printAs above, plus the format and the number of records
Consent signed or withdrawnConsent version and text hash, signer, relationship to patient
Form version publishedEditor, old and new version, a diff of the rules

Keep the log in a table the application can insert into but never update or delete, and never write the health answers themselves into it, only IDs. Our audit log design guide shows the schema and a tamper-evident hash chain.

What does a custom intake system cost to build?

Knack's market guide puts a basic patient-facing app covering intake forms, scheduling and a simple portal at $40,000–$80,000 (Knack HIPAA app cost guide). That is a third-party figure, not a RAITHub price. The biggest drivers are the form builder (a fixed form is far cheaper than an editor staff can use), the number of consent types, and where intake data has to go: a practice management or EHR integration is usually the largest single line. The MVP cost estimator gives a rough scope.

Why RAITHub for this

  • Health scheduling, built for a client. RAITHub's 8 client projects include a healthcare scheduling app. It has not shipped a regulated health product, and says so.
  • Access control in production. Sundor Skin, a B2B wholesale platform, runs 146 PostgreSQL tables behind row-level security with 88 permission codes and 12 staff roles, the same shape of problem as reception, clinician and billing access to intake.
  • Validation you can trust. This site runs 400+ tests, and its team diagnosed and wrote up the Zod 4 partial() default-values bug. TheSkinProof, the founder's own venture, runs 750+ tests across 217 API endpoints.
  • Data handling inside your controls. We sign NDAs and DPAs and work inside your controls; production and patient data stay in your own covered cloud account, and development uses synthetic data. See the HealthTech page.

When you don't need us

  • You run a practice and need intake forms next week: use your practice management system's intake module or a tool like IntakeQ.
  • Your forms are short and rarely change: a no-code builder on a suitable plan will do.
  • You need a native iOS or Android check-in app. RAITHub builds web apps and installable PWAs, which run on tablets in a waiting room and on patients' phones.
  • You need a vendor to decide what your consents must say. That is your lawyer's job; RAITHub builds what they specify.

How RAITHub would build this

  • Form engine: versioned forms with conditional logic, validated on the server as in the sample above, and a staff editor with preview.
  • Consent and e-signature: versioned consent text, signer and relationship, intent capture and withdrawal records, to the wording your lawyer approves.
  • Uploads and reminders: insurance card upload to private storage with expiring links, and SMS or email reminders that carry a link, not health details.
  • Audit and access: role-based access with row-level security, and an append-only log of every view, download and export.
  • Timeline and handover: a fixed-scope MVP in 4–6 weeks; 6–12 weeks if intake must sync into a practice management or EHR API. You receive automated tests and CI, handover docs and runbooks, and full IP under NDA.

Next step: book the free 15-minute technical audit, then get a written fixed quote, or a plain answer that a bought tool fits better. Please do not send patient data in the first message. The build service is described on the MVP development page.

Frequently asked questions

What is patient intake software?

Software that collects a patient's details, medical history, consents and insurance information before or at check-in, usually through digital forms sent by link or completed on a tablet, replacing paper forms and manual data entry.

How much does patient intake software cost?

IntakeQ's Forms Only plan is US$54.90 a month and its Practice Management plan US$84.90. Jotform lists HIPAA features from its US$129 Gold plan. Check each vendor's pricing page, as prices change.

Are e-signatures valid on patient consent forms?

In the US, the ESIGN Act says a record cannot be denied legal effect solely because it is electronic, and state laws add rules. Some consents and contexts have extra requirements, so confirm with a lawyer for your jurisdiction.

Why validate intake forms on the server if the form already has logic?

Because the browser can be bypassed. The server must decide which questions were visible, reject answers to hidden ones and enforce required fields, or bad and unexpected data reaches the patient record.

Do I need to log who viewed a patient's intake?

For health data it is a sound baseline, and US rules require audit controls for systems holding electronic PHI. Log reads, downloads and exports as well as edits. Your compliance adviser decides the exact scope and retention.

Can patients complete intake on their phones?

Yes. A mobile-first web app or installable PWA works on any phone through a link, with no app-store download. RAITHub builds web apps and PWAs, not native apps.

Should I build my own intake software or buy it?

Buy it if you run a practice with standard forms. Build it when intake is part of a product you sell, must write into your own data model, or needs audit and access rules a tool cannot give you.

HealthTechPatient intake softwareDigital intake formsE-signatureConsent managementForm builderAudit logging

Ready to discuss your project?

Book a free 15-minute technical audit with our engineering team.