Help & documentation
Everything you need to know to ship your first form and route real work through FormFlo. Use the rail on the left to jump to a topic.
Getting started
FormFlo is a multi-tenant low-code platform: define forms in a UI, attach approval workflows, and route data through your team. This guide walks through every feature an admin or builder needs.
- Create your workspace — sign up at
/signup. You'll receive a 6-digit OTP to verify the workspace email. - Invite teammates — Users → New user. Each user belongs to one org and can be a member of multiple groups.
- Build your first form — Forms → New form, then jump to the Builder.
Form types
Every form has a layout type that controls how it's rendered to users:
- Single — all sections on one page (default). Best for short forms.
- Stepper — one section at a time with a Next/Back navigation. Best for guided data entry where order matters.
- Tabs — sections appear as tabs at the top. Best for forms with parallel concerns (e.g. "Personal", "Address", "Payment").
Stepper and Tabs forms open in a full-page editor (/forms/:id/records/new) instead of a dialog so you get the screen real estate.
Sections
Sections group related fields and give the form structure. From the Builder:
- Open the form's Builder page.
- Click + Section, give it a title and an optional description.
- Drag fields into the section, or set Section in the field editor.
The right-hand panel groups fields under their section as a collapsible tree. Forms without sections show a synthetic "All Fields" bucket.
Fields
17 field types supported: text, textarea, number, decimal, phone, email, date, datetime, dropdown, multiselect, checkbox, radio, toggle, file, image, lookup, table.
Flags (in the field editor): required, unique, read-only, hidden, searchable, sortable, filterable, mobile-only, desktop-only, group default.
Auto-generate value (text/number fields) — generates sequential IDs like PO-001, PO-002. Configure prefix, suffix, padding, start.
Table field — for line items (invoices, packing lists). Columns can be text, textarea, number, date, dropdown. Number columns can auto-sum (Σ) in a totals row.
File / image fields — 5 MB max per file. Images get an inline preview; documents (PDF, Word, Excel, PowerPoint, text, CSV, JSON) get a download chip.
Lookup field — picks a record from another form. In the field editor, scroll to Lookup configuration → pick a target form → pick a Display field (what the user sees) → optionally pick a Stored value field (defaults to record id). The renderer shows a searchable combobox; the value stored on save is the target record id while the cell shows the human-readable label.
Dependent dropdowns — on any dropdown field, scroll to Dependent dropdown → pick a parent dropdown → enter the options that should appear for each parent value. The child stays disabled until the parent is filled; changing the parent value resets the child.
Dependent lookups — on a lookup field, enable Make this a dependent lookup: pick the parent field on THIS form and the column on the TARGET form they should match. The lookup options now filter to only records where the target column equals the parent's value.
Workflows
Approvals route records through one or more steps. From the form Builder, click Workflow:
- Enable the workflow toggle.
- Add steps. Each step has a name and an assignee (a user, a group, or a role).
- Per-step controls: for each field, pick Hide / Read-only / Mandatory / Inherit. For each section, you can flip a single "Hide whole section" toggle which is faster than configuring every field individually.
When a record is submitted, the first-step approvers receive an email with one-click Approve / Reject magic links — no login required. The token is HMAC-signed and expires in 14 days.
Org admins can view the full audit at /workflow-history.
Publishing & sharing
Forms are private by default. To share:
- Internal share — drop into a group's Form Access list. Members get create/read/update/delete based on the auto-generated per-form roles.
- Public link — Builder → Share → enable Public. Optionally set a PIN. Public submissions are gated by a math captcha.
Users, groups, roles
Users — Users → New user. One user belongs to one org.
Groups — Groups → New group. Add members and assigned roles. Both lists have a search box for fast lookup.
Roles — every form auto-generates four system roles: <form_code>_create, _read, _update, _delete, plus an _all wildcard. You can also create custom roles. Deleting a form cascades — its roles, comments, sequences, and group access references are all removed automatically.
Defaults
Pre-fill fields based on who's submitting the record.
- In the field editor, enable the Group default flag.
- Either set group-level default values (Groups → Edit → Default values) or per-form via Access Configs in the Builder.
Precedence (highest wins): user-typed value > per-form access config > group default > field's static default.
Defaults are re-fetched the moment a user clicks "New record", so admin changes take effect without a refresh.
Import / export
Form schema — Builder → Export downloads a JSON bundle of the form (sections, fields, auto-generate, table_columns, options). Import the same JSON into another workspace to bootstrap a clone. Note: lookup-form references are not portable; rewire them after import.
Records — from the records list:
- Excel: includes the main columns; table-type fields get their OWN sheet per field with flattened rows.
- PDF: per-record export renders nested table fields as a heading + a sub-table per row.
Themes
The platform admin defines themes (HSL color tokens + typography). Each user can pick one in their Profile.
Org default: as an org admin, click "Set as org default" on a theme. Every user who hasn't picked one of their own will inherit the org default. Users who explicitly chose a theme keep their preference.
Billing & packs
FormFlo prices in packs. The base pack ships with your subscription; add expansion packs as your team grows.
Each pack adds users / forms / records / GB of storage in fixed multiples. The Billing page shows live usage vs. limits.
Zoho Payments — one-time setup
FormFlo uses Zoho Payments to accept INR online. Setup is a 5-minute, one-time process for the platform admin. Stay in DEMO mode until every step is done — demo mode credits the org instantly without contacting Zoho, perfect for testing.
- Create a Zoho Payments account at zoho.com/in/payments/signup and complete the bank-verification process.
- Note your Account ID from the Zoho Payments dashboard URL — e.g.
payments.zoho.in/app/60123…/dashboard→ Account ID is60123…. - Generate API Key + Signing Key at Zoho Payments → Settings → Developer Space → Authentication Keys.
- Register a Self Client OAuth app at api-console.zoho.in/add?client_type=ORG. Choose "Self Client" → save → note the Client ID and Client Secret.
- Generate an authorization code: open your Self Client → Generate Code tab → scope =
ZohoPay.payments.CREATE,ZohoPay.payments.READ→ Time Duration = 10 minutes → Generate. Copy the code immediately — it's valid for ~1 minute. - Exchange the code for a refresh token from a terminal (substitute your values):
curl -X POST 'https://accounts.zoho.in/oauth/v2/token' \ -d 'grant_type=authorization_code' \ -d 'client_id=YOUR_CLIENT_ID' \ -d 'client_secret=YOUR_CLIENT_SECRET' \ -d 'code=YOUR_AUTH_CODE'
The response containsrefresh_token— copy it. It does not expire unless revoked. - In FormFlo → Platform → Billing settings, paste: Account ID, API Key, Signing Key, OAuth Client ID, OAuth Client Secret, OAuth Refresh Token. Save.
- Switch Demo mode OFF. Try a signup or a pack purchase. The widget should open Zoho's checkout — pay ₹1 with a test card to confirm end-to-end.
FormFlo caches the access token in memory and refreshes it 5 minutes before it expires (1 h lifetime). No further action needed.
Troubleshooting
"My default isn't filling in" — check the field has the Group default flag, and that the value is keyed by field_name (not field_label). Try clicking "New record" again — defaults re-fetch live.