Form Builder
How to design and publish forms with the Flourish Chronicle Form Builder.
Overview
The Form Builder is where you create and manage your forms. Each form is called a template — it defines the pages, questions, layout, and logic that your end users will see when they fill out a form.
To open the Form Builder, navigate to the Chronicle Form Builder tab in your Salesforce org.
Creating a template
Click + New Template in the top bar, type a name, and press Enter (or click Add). Your new template appears in the list and opens the flow editor.
The flow editor
The flow editor is the first screen you see after selecting a template. It shows your form's page sequence as a visual flowchart, from START to END.
From here you can:
- Add a node — Click any + button to open the insert menu. You can add a Page, a Decision, or (at the end of a path) a Go To.
- Add decisions — Decisions let you branch the form based on field values. For example, show different pages depending on whether someone selected "Yes" or "No" on a previous question. Each decision has one or more named branches plus a Default branch (the "none of the above" path). Every branch is its own column you can drop pages and decisions into.
- Branches merge automatically — After a branch's pages, the flow merges back into the main sequence and continues — just like Salesforce Flow Builder. The whole form funnels down to a single END. Nested decisions merge back into their parent branch, which merges up to the trunk.
- Go To — A Go To is a node that jumps to another page instead of merging back. Use it to send a branch to a shared page, loop back, or skip ahead. It's the only way a path leaves the normal merge — so it can only be added at the end of a branch or the trunk. Click a Go To node to change its target page or remove it.
- Edit or delete a decision — Click a decision diamond to open its editor (rename branches, set their conditions, add/remove branches). The editor also has a Delete decision button, which removes the decision and all its branches after a confirmation.
- Undo / Redo — Use the undo/redo buttons (next to the zoom controls) to step backward and forward through your flow-layout changes. (Changes to the right-side template settings aren't part of undo.)
- Configure the template — The right-side panel lets you set the template name, choose a Salesforce object to bind to (like Contact or Lead), set access (Read/Write, Read Only, or Write Only — see below), choose what happens on finish, pick Generate PDF behavior (see Generating PDFs), and toggle display options like header visibility.
- Write Only is for sensitive forms where you never want to risk showing existing data: the form never loads or displays the record's current values, but users can still submit, and your static/pre-fill values still apply. It's a hard privacy gap, stronger than Read Only.
- Open a page for editing — Click any page card in the flow to open the page editor.
The page editor
The page editor is where you build the actual content of each page. It has three panels:
Left — Cell palette. These are the building blocks you can add to your form. Drag them onto a section, or click one to add it to the selected section.
Available cell types:
- Question — A form input field. When your template is bound to a Salesforce object, the input type is detected automatically from the field (see Question field types).
- Display Text — A rich text block for instructions, descriptions, or any content that doesn't collect input. Supports merge tags like
{!First_Name__c}that are replaced with the form's live field values as the user fills it out (see Merge tags). - Image — Displays an image from a URL.
- Divider — A horizontal line to visually separate content.
- Blank — An empty spacer for layout control.
- Signature — A signature capture pad where users can draw their signature.
- File Upload — Lets users attach files to their submission.
Center — Form preview. Shows how your page will look, with a 12-column grid layout. Click any section or cell to select it and edit its properties.
Right — Properties panel. When you select a section or cell, this panel shows its settings. For question cells, you can set the field binding, display label, help text, column span, and sort order. For other cell types, you'll see type-specific options (like image URL or file upload limits). Some field types add their own options — see Question field types below. With nothing selected, the panel shows the page settings, including its Title — which appears as the form's header while a visitor is on that page. New pages start with the template's name as their title, so give each page a meaningful title if you want the header to change between pages.
The page editor has its own Undo / Redo buttons (top of the preview) that step through changes to this page — adding, moving, and removing sections and cells, as well as their property edits. Undo here only affects the current page, never the flow or other pages. Next to them is the language picker (globe) for translating the form — see Translating your form.
Each section shows a small ✕ in its header to delete it — hover or click to use it; you don't have to select the section first.
Question field types
When a question is bound to a field on your template's object, the form viewer renders the right input for that field's type:
- Text, email, phone, number — standard inputs. URL fields are validated as you submit — an entry that isn't a valid web address is flagged and blocks moving on.
- Date — a friendly text box: the user just types the numbers and the slashes are added automatically (MM/DD/YYYY).
- Date/Time — a date box (same as above) plus a time box; the two are combined into a single date/time value on save.
- Picklist — a dropdown.
- Multi-Select Picklist — choose how it appears with the Display As option in the properties panel:
- Buttons — selectable pills the user taps to toggle on/off.
- Checklist rows — a vertical list with the option label on the left and a large checkbox on the right.
- Checkbox — a single checkbox.
- Lookup — a search-as-you-type box: the user types and matching records appear; picking one fills the field. See Lookup fields.
Field types are detected when you Save. If you change a field binding, save the template so the viewer picks up the correct input.
Lookup fields
When a question is bound to a lookup (or master-detail) field, two extra options appear in its properties panel:
- Search Result Label — by default, search results show the record's Name. To show something else, enter a template using merge tags — for example,
{!FirstName} {!LastName}or{!LastName} Household. Anything in{! }is replaced with that record's field value; the rest is shown as-is. Leave it blank to use Name. - Lookup Filter (in the Conditions modal) — limit which records can be found. See Filtering lookup results.
Merge tags in Display Text
In a Display Text cell you can embed {!Field_API_Name__c} anywhere in the content. When someone fills out the form, each tag is replaced with that field's current value — so the text updates live as they type. Use the field's API name (e.g., {!First_Name__c}, {!Email}). A tag whose field has no value simply shows nothing. Merge tags also resolve in generated PDFs.
Sections
Every page contains one or more sections. Sections group related cells together. New pages start with one section by default. You can add more with the + Add Section button at the bottom of the page preview.
Each section has a label, sort order, and an active toggle. You can also set visibility conditions — for example, only show a section when a certain field has a specific value.
Conditions
Conditions let you control when sections, cells, or flow branches are active. You can set conditions for:
- Visibility — Show or hide a section or cell based on field values.
- Required — Make an answer required only when certain conditions are met. Available on question, Signature, and File Upload cells. (For a Signature, "required" means a signature must be drawn; for File Upload, at least one file must be attached.)
- Read Only — Lock a field based on conditions (question cells only).
To add conditions, select a section or cell, then click the Conditions button in the properties panel. In the modal that opens, toggle on the condition type you want, then choose how it's decided:
- Match conditions — active based on the rules you add.
- Always true — always on (e.g., a field that is always required).
- Always false — always off (e.g., a section that's permanently hidden).
For Match conditions, choose a logic mode (AND, OR, or Custom) and add your rules. Each rule is a field, an operator, and (for most operators) a value. The available operators adapt to the field's type — text fields offer Contains, Starts With, Is Blank, etc.; number fields offer the comparison operators (Is Greater Than, Is Less Than, …); checkboxes offer Is Checked / Is Not Checked. To test whether a field is empty, use Is Blank (or Is Not Blank).
Sections and cells that have an active condition show a small colored icon in the preview, so you can spot configured logic at a glance — a blue eye for Visibility, a red asterisk for Required, and an amber lock for Read Only. (An "Always true" condition shows no icon, since it imposes no real restriction.)
Decision branch conditions work the same way — open a decision from the flow editor and set each branch's conditions in its editor.
Filtering lookup results
On a Lookup question, the Conditions modal includes a Lookup Filter that limits which records can be found in the search box. Its rules run against the looked-up object's fields (e.g., for a Contact lookup, you filter on Contact fields).
Each rule's value can be either:
- a Value you type (a fixed/literal value), or
- a Field — a field from this form, resolved live when the user searches.
The Field option is what makes the filter data-driven. For example, on an Account form with a Contact lookup, filter Contact's AccountId Is Equal To the form's Id field — so only Contacts on the current Account appear in the search results.
Translating your form (multiple languages)
You can offer one form in several languages without building separate templates. The form's structure and logic are shared; you translate only the wording (labels, help text, section/page titles, Display Text, and manually-entered picklist option labels).
In the page editor, the preview toolbar has a language dropdown (next to the undo/redo buttons, marked with a globe):
- The first language is your default — its wording is what you normally type into the page.
- Open the dropdown and choose Add a language to add another (e.g. Spanish (Spain)). You jump straight into editing it.
- Switch languages anytime from the same dropdown. While editing a non-default language, the panel turns violet and shows a "Translating …" banner so you always know which language you're editing.
When editing a translation, each text box shows the default-language wording as a faded placeholder — type your translation over it. Leave a box empty and that piece simply falls back to the default language for that language's visitors (so a partly-translated form still works). The fields that define structure (the field a question is bound to, column span, conditions, etc.) are hidden while translating, because those are shared across every language.
To remove a language, switch to it and click the ✕ next to the dropdown — you'll be asked to confirm, since all of that language's translations are deleted.
Previewing a language: click Launch while editing a language to open the form in that language.
Which language a visitor sees: the form picks the language from the submission's Language (defaulting to the template's Default Language, set in the flow editor's config panel), or from a language passed in the launch link. Anything you haven't translated falls back to the default.
Built-in buttons and messages translate automatically: the form's standard chrome — the Back / Continue / Submit buttons, the "all done" confirmation screen, and prompts like "Please complete…" — is shown in the visitor's language for you. You only translate your own wording (labels, help text, titles, Display Text, picklist labels); you never have to translate these built-in pieces. They currently cover the common languages in the picker — let us know if one needs refining for your market.
Pre-fill and static values
You can have fields start with a value, or always be written a fixed value, without the user touching them. In the flow editor's template config panel (right side), open Pre-fill & Static Values:
- Pre-fill — seeds a field with a starting value the user can still change. Only applied when the field is empty, so existing data is never overwritten.
- Static — always written on save, overriding whatever the user entered. The field doesn't even need to be on the form (e.g., stamp a
Source__c, or a record type).
For each entry pick the field, the mode (Pre-fill / Static), and the value. Builder-entered values support merge tags ({!Field__c}) resolved from the bound record. If you pick RecordTypeId, the mode is locked to Static and you choose from a dropdown of the object's active record types (the record type Id is saved for you).
You can also set a field's default right from its cell in the page editor — the Default value box on a Question cell writes the same list.
These can also be supplied per-link or per-placement without editing the template — see Sharing forms.
Appearance and branding
The template config panel controls how the form looks:
- Border Style — Bordered (default) shows the form as a floating card. Borderless drops the card chrome (shadow, rounded corners, background) so the form blends into the page it's hosted on — useful when embedding in a website or community page.
- Max Width — caps the form's width in both modes. Accepts any CSS length (
620px,90vw,60%); leave it blank for full width. Defaults to the standard width. - Custom branding — turn this on to match your site: Accent color (buttons, highlights, focus), Text color, Form background (the area behind the fields), Font, and Corners. Hover and muted shades are derived automatically, so you only set a few values. Leave it off to use the default theme.
The viewer is mobile-responsive: on phones every field goes full width, controls are touch-sized, and the form fills the screen.
Saving and publishing
Click Save in the top bar to save your template. The save process stores your layout, enriches field metadata from Salesforce, and computes condition dependencies.
To preview your form as an end user would see it, click Launch. This opens the Form Viewer in a new tab. Launch creates a temporary preview submission (so you can fill it out and test save/validation without affecting real data) — preview forms are flagged and automatically cleaned up after 7 days. If you're editing a non-default language at the time (see Translating your form), the preview opens in that language.
Templates can be deactivated by unchecking the Active toggle in the template config panel. To remove a template entirely, click the Delete button — templates with existing submissions will be archived rather than permanently deleted.
Generating PDFs
You can have Chronicle produce a PDF of a submission automatically when a form is completed. In the flow editor's template config panel, set Generate PDF:
- Off — no PDF is generated.
- On first completion — a PDF is created the first time a form is completed.
- On each completion — a PDF is created every time the form is completed (including re-completions).
The generated PDF is attached to the form submission as a Salesforce File (and, when the form is bound to a record, to that record as well). It includes the form's headings, field answers, signatures, and any Display Text (with merge tags resolved). Note: Image cells are not included in the PDF yet.
Read-only forms
When a form is opened in Read Only mode (or a field is locked by a Read Only condition), every input is visibly greyed out and can't be edited — including signatures (the pad is disabled) and file uploads.
Sharing forms
The main way to publish a form for end users is the Export & Publish section of the template's right-hand panel:
- Guest access — turn this on to make the form publicly reachable, then use Rotate key / Generate share key to (re)generate the form's guest share key. The key is shared across all versions of the form, and rotating it instantly deactivates every previously shared link or embed — a quick way to "soft deactivate" a form. Turning Guest access off disables all public links without changing the key.
- Public form URL — copy the shareable link (built from your org's Public Form Site + the guest share key). It always opens whichever version is currently active, and never exposes the internal template ID.
- Website embed — copy a ready-made HTML snippet (an inline iframe) to drop the form onto any external website (uses your Form Embed Site).
Other ways to reach a form:
- On a record page — Place the Form Viewer component on any Salesforce record page and configure the template and record.
- Reopen a specific submission — every submission has its own unguessable Public ID; a link with
c__chronfid=<public id>reopens that exact submission. (A raw Salesforce record Id will not open a form — only the Public ID does.) - Pre-fill / static via link or placement — supply a JSON map of field API name → value as the URL parameter
c__chronprefill(pre-fill) orc__chronstatic(static), or set the Pre-fill Values (JSON) / Static Values (JSON) properties when placing the Form Viewer on a Lightning page. These accept literal values only — merge tags are not honored from a link or placement (only builder-entered defaults are).
Exporting and importing templates
You can move a form between orgs (or keep a backup) with Export and Import. This is separate from the v1 migration tool below.
- Export — open a template and, in the right-hand Export & Publish section, click Copy template JSON.
- Import — on the template list, click Import, paste an exported JSON, and confirm. A brand-new template is created: its name, fields, and layout are restored, but it gets a fresh unique name, a reset version number, and its own share key (nothing is overwritten, and you can safely import the same JSON more than once).
Before importing, Chronicle checks the JSON against this org — if the form is bound to an object or fields that don't exist here, you'll see a warning listing them and can decide whether to import anyway (those fields just won't bind until you fix them). If everything resolves, the import completes immediately.
Migrating from v1
If you have forms built in the previous (v1) version of Chronicle, the Migrate from v1 button on the template list opens the migration tool:
- Pick a template from the list — a badge shows whether it's already Migrated or Not migrated.
- The tool loads an export of that template's v1 configuration. Click Copy to clipboard and hand it to Claude (or your migration helper) along with the v2 migration instructions.
- Paste the returned JSON (it contains a
configand alayout) into the box and click Migrate. The tool validates it and saves it onto the template.
After migrating, open the template in the builder to review it. (Migrating the existing form submissions is a separate step.)
Tips
- Column span controls how wide a cell is within the 12-column grid. A span of 12 takes the full width; a span of 6 takes half.
- Sort order determines the sequence of sections and cells within a page. Lower numbers appear first.
- You can drag and drop cells between sections in the page editor.
- Use the Display Text cell type for instructions, disclaimers, or any non-input content — and personalize it with
{!Field__c}merge tags. - To require a signature or file upload, open the cell's Conditions and set Required to Always true.
- For dependent lookups (e.g., only Contacts on the selected Account), use a Lookup Filter with a Field value pointing at the form's field.
- The form viewer is fully responsive and works on mobile devices.