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 people see when they fill out a form.
You reach it through the Flourish Chronicle Hub tab. The Hub is the front door to everything Chronicle does.
The Hub
The Hub opens on a tile for every form in your org. Search across the top narrows the grid.
Click a tile to open that form. Three things are a click away:
| Responses | Everything people have submitted. See Reading responses. |
| Build | The form builder, opened on this form. The rest of this page. |
| Preview | Opens the form in a new tab as a respondent sees it. |
All forms in the breadcrumb takes you back to the tiles. The breadcrumb sits in the top bar and grows as you go deeper, so editing a page reads All forms › your form › the page, and any segment takes you back to it.
Each tile carries a badge naming the Salesforce object the form writes to. Every form on the same object has the same badge color, so you can pick out all the Contact forms at a glance. A form that keeps its answers on the submission has no object, so its badge reads Stored on the form.
Creating a template
On the Hub, click + New Form, type a name, and press Enter or click Add. The new form appears in the grid and opens on the flow editor.
The flow editor
The flow editor is the first screen you see after opening a template in Build. It shows your form's page sequence as a 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 branch the form on field values. For example, show different pages depending on whether someone answered "Yes" or "No" to an earlier question. Each decision has one or more named branches plus a Default branch. The Default branch is taken when no other branch matches. Every branch is its own column you can drop pages and decisions into.
- Branches merge back: After a branch's pages, the flow merges back into the main sequence and continues as it does in Salesforce Flow Builder. The whole form funnels down to a single END. Nested decisions merge back into their parent branch, and the branch merges up to the trunk.
- Go To: A Go To 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 to change its target page or remove it.
- Edit or delete a decision: Click a decision diamond to open its editor. There you can rename branches, set their conditions, and add or remove branches. The editor also has a Delete decision button. It removes the decision and all its branches after you confirm.
- Undo and redo: The undo and redo buttons next to the zoom controls step backward and forward through your changes to the flow. Changes to the template settings on the right aren't part of undo.
- Configure the template: The panel on the right sets the template's name, the Salesforce object it saves to (such as Contact or Lead), its access (Read / Write, Read Only, or Write Only), what happens on finish, whether it makes a PDF (see Generating PDFs), and display options such as hiding the header.
- Write Only is for sensitive forms where you never want to risk showing existing data. The form never loads or shows the record's current values, but people can still submit, and your pre-filled and saved values still apply. It's a stronger gap 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 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 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 such as
{!First_Name__c}. Each one shows the field's live value as the person fills out the form (see Merge tags). - Image: Displays an image from a URL.
- Divider: A horizontal line that separates content.
- Blank: An empty spacer for layout.
- Signature: A pad where people draw their signature.
- Scratchpad: A freehand drawing surface with a pen, an eraser, six colors, and undo. See Scratchpad.
- File Upload: Lets people attach files to their submission. See File upload limits.
- Data Table: A read-only table, filled either from a field holding a list of rows or from a query you define. See Display tables.
- Related Records: Lets someone add as many rows as they need. Each row becomes a related record. See Related Records.
Center: Form preview. Shows how your page will look on a 12-column grid. 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. A question cell has its Field, Display Label, Help Text, Default Value, Width (a third, half, or all of the row), and Sort Order. Other cell types show their own options, such as an image's URL or an upload's limits, and some field types add options of their own (see Question field types). With nothing selected, the panel shows the page settings. The page's Title is 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 its own title if you want the header to change from page to page.
The page editor has its own undo and redo buttons at the top of the preview. They step through changes to this page only: adding, moving, and removing sections and cells, and their property edits. Next to them is the language picker (the globe) for translating the form. See Translating your form.
Each section shows a small ✕ in its header to delete 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 shows the right input for that field's type:
- Text, email, phone, number: Standard inputs. URL fields are checked when the person continues, and an entry that isn't a valid web address is flagged and stops them from moving on.
- Date: A text box that adds the slashes as the person types the numbers (MM/DD/YYYY).
- Date/Time: A date box like the one above plus a time box. The two are saved together as one date and time.
- Picklist: A dropdown.
- Multi-Select Picklist: Choose how it appears with Display As in the properties panel:
- Buttons: Pills the person taps to turn each choice on or off.
- Checklist rows: A list with each choice's label on the left and a large checkbox on the right.
- Checkbox: A single checkbox.
- Lookup: A search-as-you-type box. The person types, matching records appear, and 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 form picks up the right input.
Scratchpad
A Scratchpad cell gives the respondent a blank canvas to draw on. They might sketch where it hurts, draw a diagram, or mark a plan. Its toolbar has Draw, Erase, six colors, Undo, and Clear.
It has two settings in the properties panel.
| Setting | Notes |
|---|---|
| Label | The prompt above the canvas. Translatable like any other label. |
| Canvas Height (px) | How tall the drawing area is. Between 140 and 800, and 260 if left blank. |
A Scratchpad and a Signature are saved differently. A drawing is saved as an ordinary file, so it lands on the submission and on the bound record alongside anything the respondent uploaded. A signature stays on the submission only. Use Signature for consent and Scratchpad for anything the respondent draws to tell you something.
A Scratchpad stores no answer, so it never appears as a question in the answers table. It shows up as an attachment on the submission. You can make one required. Then a drawing has to be saved before the respondent can continue, and it stays saved if they come back to a part-finished form later.
A drawing doesn't print in the completion PDF.
File upload limits
A File Upload cell has three optional settings in its properties panel. Each is checked the moment the respondent picks a file.
| Setting | Notes |
|---|---|
| Accepted Types | Extensions, MIME types, or wildcards separated by commas (.pdf,.docx or image/*). Also filters what the file picker offers. Leave blank to accept anything. |
| Max Files | How many files this cell may hold in total, counting any uploaded on an earlier visit. Leave blank for no limit. |
| Max Size (MB) | Per file. Seven is the most Chronicle allows, so a larger number is lowered to seven. Leave blank and seven applies. |
A rejected file never joins the queue. The reason appears under the cell and names the file. Empty files are always refused.
Respondents can drag files onto the cell as well as clicking it.
A file uploaded in an earlier session still counts. Someone who uploads on page one, closes the browser, and comes back later finds the cell already answered and isn't asked for the same document twice. A respondent can't remove an uploaded file from the form, so one who attaches the wrong file needs it deleted from the submission.
Lookup fields
When a question is bound to a lookup or master-detail field, two more options appear:
- Search Result Label: Search results show each record's Name. To show something else, enter a label made of merge tags, as in
{!FirstName} {!LastName}or{!LastName} Household. Anything in{! }is replaced with that record's field value. The rest shows as written. Leave it blank to use Name. - Lookup Filter (in the Conditions window): Limits which records can be found. See Filtering lookup results.
Merge tags in Display Text
In a Display Text cell you can put {!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 as they type. Use the field's API name ({!First_Name__c} or {!Email}). A tag whose field has no value shows nothing. Merge tags also work in generated PDFs.
A tag is filled in only where you wrote it. If someone types {!Email} into an answer, it shows, saves, and prints exactly as typed.
Pulling values from a related record. A tag can reach up to five levels through relationships, one dot per level: {!Account.Name} or {!Account.Owner.Manager.Name}. This works anywhere merge tags do. That includes the values in Pre-fill and saved values, lookup Search Result Labels, and PDFs. It reads from the record the form is bound to, so a form with no bound record shows nothing for these tags. A Write Only form shows nothing for them either because it never reads the record to show it. A tag naming a relationship or field that doesn't exist shows nothing, and the form still works.
A relationship tag shows a field from a different record than the one being edited. On a public form, that value is visible to whoever opens the link, so check what you're exposing before using one.
Sections
Every page holds one or more sections. Sections group related cells. New pages start with one section. You can add more with the + Add Section button at the bottom of the page preview.
Each section has a Label, a Sort Order, and an Active toggle. You can also give it visibility conditions. For example, show a section only when a certain field has a certain value.
Conditions
Conditions 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, always or only when certain conditions are met. Available on Question, Signature, Scratchpad, and File Upload cells. A Signature or Scratchpad that's required needs something drawn, and a required File Upload needs at least one file.
- Read Only: Lock a field based on conditions. Question cells only.
A condition can test any field on the form's object, and the field doesn't have to be on the form. A formula field is the common case. An age calculated from a date of birth isn't a question anyone answers, but it's exactly what you want to show a section on.
A formula that depends on this form's own answers needs one more step. Salesforce computes a formula when the record is written. With the default Save Mode, Save at the end, nothing is written until the end, so the formula is still empty while the respondent works. If a section depends on an age calculated from a date of birth the respondent is typing now, turn on Save when leaving this page for the page that asks for the date of birth. The record is written as they continue, the formula computes, and the next page sees it. A form bound to a record that already holds those values needs none of this.
Making something required is a condition, too. There is no separate Required checkbox. An always-required question has a Required condition set to Always true.
To add conditions, select a section or cell, then click Conditions in the properties panel. In the window that opens, turn on the kind of condition you want, and then choose how it's decided:
- Match conditions: On or off by the rules you add.
- Always true: Always on. Use it for a field that's always required.
- Always false: Always off. Use it for a section that's hidden for now.
For Match conditions, choose how the rules combine under Match (All (AND), Any (OR), or Custom) and add your rules. Each rule is a field, an operator, and for most operators a value. The operators offered depend on the field's type. Text fields offer Contains, Starts With, Is Blank, and others. Number fields offer comparisons such as Is Greater Than and Is Less Than. Checkboxes offer Is Checked and Is Not Checked. To test whether a field is empty, use Is Blank or Is Not Blank.
Sections and cells with an active condition show a small icon in the preview, so you can spot configured logic at a glance: an eye for Visibility, an asterisk for Required, and a lock for Read Only. An Always true condition shows no icon because it doesn't restrict anything.
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 window includes a Lookup Filter that limits which records the search box can find. Its rules test the looked-up object's fields. For a Contact lookup, you filter on Contact fields.
Each rule's value is one of two kinds:
- Value: Something you type.
- Field: A field on this form. Its value is read when the person searches.
The Field option makes the filter follow the form. On an Account form with a Contact lookup, filter Contact's AccountId Is Equal To the form's Id field, and only Contacts on the current Account appear in the results.
Translating your form (multiple languages)
You can offer one form in several of Chronicle's 31 languages without building separate templates. The form's structure and logic are shared, and you translate only the wording: labels, help text, section and page titles, Display Text, and the labels of answer options you entered yourself.
In the page editor, the preview toolbar has a language dropdown, marked with a globe, next to the undo and redo buttons:
- The first language is your default. Its wording is what you type into the page.
- To add a language, open the dropdown and pick it under Add a language. You go straight to editing it.
- Switch languages at any time from the same dropdown. While you edit another language, the panel shows a Translating banner naming it.
While you translate, each text box shows the default language's wording as a faded placeholder. Type your translation over it. Leave a box empty and that piece falls back to the default language, so a partly translated form still works. The settings that define the form's structure, such as the field a question is bound to, its width, and its conditions, are hidden while you translate because every language shares them.
To remove a language, switch to it and click the ✕ next to the dropdown. You're asked to confirm because all of that language's translations are deleted.
Previewing a language: The Hub's Preview always opens the default language. To see a translation, open the form's public link with c__chronlang set to that language's code. For Spanish (Spain), that's ?c__chronlang=es-es.
Which language a visitor sees: The form uses a language passed in its link first, then the submission's Language, then the template's Default Language. You set the Default Language in the flow editor's Behavior section. Anything you haven't translated falls back to the default.
Built-in buttons and messages translate themselves. The form's own Back, Continue, and Submit buttons, its "all done" screen, and prompts such as "Please complete:" appear in the visitor's language for every language in the picker. You translate only your own wording.
Right-to-left languages such as Arabic flip the whole form: labels, inputs, alignment, and the Back and Continue buttons. The builder's preview flips with them while you edit that language, so you see what a respondent will get.
Translating picklist choices
A picklist that reads its choices from the Salesforce field shows them as the org defines them in every language because they belong to the field and not to the form.
To translate them, the choices have to live on the question instead. Select the picklist cell and use Answer Options in the properties panel:
- In the default language, click Load from field to copy the field's current choices in, then adjust them if you want.
- Switch to another language, and the same cell shows one box per choice for the translation.
- Clear removes the list and goes back to reading the field.
Loading the choices takes a copy. It doesn't follow later changes to the field, so if someone adds a value in Salesforce, load the choices again.
Display table headers translate the same way, per column, from the table cell's properties.
A Related Records cell that uses a form template for its rows takes its translation from that template. Translate the row template into the same language as the parent form, and the rows show translated. Leave it untranslated, and the rows fall back to its own default language.
Pre-fill and saved values
A field can start with a value or be saved with a value the person filling the form never touches. In the flow editor's template panel, open Pre-fill & Saved Values and click + Add field value. Pick the field, the Mode, and the Value.
| Mode | What it does |
|---|---|
| Pre-fill page | The question starts with the value the first time it's on the screen, if the field is still empty, and the respondent can change it. A question the respondent never sees gets nothing, and nothing is saved for it. |
| Pre-fill data | Saved once, on the save that creates the record, and the respondent can't change it. A form opened on an existing record, or one that matched an existing record, never writes it. On a form with no object, it's saved on the form's first save. |
| Save every time | Saved on every save, over whatever the respondent entered. The field doesn't need to be on the form, so you can stamp a Source__c or a record type this way. |
A few things worth knowing:
- A Pre-fill page value waits for its question. It can't decide a condition, a decision, or a merge tag until its question has been on the screen, and a field no question asks for gets nothing. If a value has to be there whether or not the question is shown, use Pre-fill data or Save every time.
- Values can use merge tags (
{!Field__c}). Chronicle fills them in from the bound record. Pre-fill data and Save every time can also use the answers being saved. - A value that comes out blank is skipped. It never clears the field.
- A field with both a Pre-fill data and a Save every time entry takes the Save every time value.
- Record Type is always Save every time. Pick it as the field, and you choose from the object's active record types.
You can also set a field's value from its cell in the page editor. The Default Value button on a Question cell offers the same three modes and writes to the same list.
Values can also come from a link or from where the form is placed, without editing the template. See Sharing forms.
Appearance and branding
The template panel controls how the form looks:
- Border Style: Bordered, the default, shows the form as a floating card. Borderless drops the card's shadow, rounded corners, and background so the form blends into the page that hosts it. That suits a website or an Experience Cloud page.
- Max Width: Caps the form's width in both styles. Takes any CSS length (
620px,90vw, or60%). Leave it blank for full width. - Custom branding: Turn this on to match your site with an Accent color (buttons, highlights, and focus), Text color, Form background (the area behind the fields), Font, and Corners. Hover and muted shades are worked out for you, so you set only a few values. Leave it off to use the default look.
The form works on phones. Every field goes full width, controls are sized for touch, and the form fills the screen.
Saving and publishing
Click Save in the top bar to save your template. Saving stores your layout, reads each field's details from Salesforce, and works out which conditions depend on which fields.
To see your form as a respondent would, click Preview in the Hub's top bar. It opens the form in a new tab and starts a preview submission, so you can fill it in and test saving and validation without touching real data. Preview submissions are marked and cleaned up automatically after seven days. Until then, they're listed on the form's Responses with everything else and marked (preview).
Preview always opens in the form's default language. To check a translation, open the form's public link with the language on it. See Translating your form.
To take a template out of use, turn off its Active toggle in the template panel. To remove it, click Delete in the top bar or the ✕ on its tile on the Hub. A form that already has submissions offers Archive instead. Archiving hides the form and keeps its responses.
Versions
A form can have several versions, so you can work on the next one while people keep filling out the current one.
The top bar carries a version dropdown, + Version, and Make Active:
- + Version creates a new version from the current one. It starts inactive, so nothing changes for anyone filling out the form.
- Make Active makes the version you're viewing the active one. The version that was active steps down. Exactly one version is active at a time.
- The dropdown switches between versions. The Hub's tiles show each form's active version.
Links always follow the active version. A form's public link and its embed snippet belong to the form as a whole, so making a new version active switches everyone over without sending anything again. Rotating or turning off public access applies to every version at once, so an old version can never stay reachable by accident.
Submissions stay with the version they were filled on. A form someone completed last month stays attached to the version that was active then, so its answers still line up with the questions that were asked.
Earlier versions aren't frozen. You can open one and make a small correction without making it active.
Generating PDFs
Chronicle can make a PDF of a submission when a form is completed. In the flow editor's template panel, open Render PDF and set Generate PDF:
- Off: No PDF.
- On first completion: A PDF the first time a form is completed.
- On each completion: A PDF each time the form is completed. That includes when someone completes it again.
The PDF is attached to the submission as a Salesforce File and to the bound record as well when there is one. It prints headings, answers, Display Text with its formatting and merge tags filled in, images, signatures, display tables, dividers, and the rows of a Related Records cell. File Upload cells don't print because uploaded files are kept with the record.
The PDF prints what the respondent saw. A page a decision routed past doesn't print, and neither does a hidden section or cell. Pages come out in the order they were shown, so a Go To reorders the document the same way it reordered the form. Within a page, sections and cells print in the same Sort Order the form uses. Widths carry across too, so a half-width question sits beside its neighbor on the page as it did on screen.
PDF settings
Once Generate PDF is on, the Render PDF section shows these settings.
| Setting | Notes |
|---|---|
| PDF language | The form's default language (the default) or The language it was filled in. The second uses your translations for the language the respondent saw. Anything not translated yet prints in the default language. |
| Related Records questions | Print every question (the default) prints all of each row's questions whether or not the form showed them. Print only the questions shown leaves out a question that's switched off or that its conditions hid in that row. |
| PDF background image | A letterhead or watermark drawn on every page. Give a full https link to a PNG, JPG, or PDF that opens without logging in. |
| Background format | Appears when the link has no file extension. Signed and CDN links often don't have one. Pick the format here, or the background is skipped. |
| Page size | Letter (8.5 x 11 in) (the default) or A4 (8.27 x 11.69 in). |
| Margins (inches) | Top, right, bottom, and left, each set on its own. A blank side uses 0.5 inch. |
| Top margin on later pages (inches) | Only to override the top margin on the pages after the first. Leave it blank and later pages line up with the top margin. |
The language it was filled in is the one the respondent saw. If the form's link asks for one of the form's languages, the submission records that language the first time it saves.
A few things worth knowing before you design a PDF:
- Margins are in inches, and they're how content clears a background. The top margin applies to every page, so a letterhead header stays clear throughout, and the bottom margin keeps room for a footer.
- If opposite margins leave too little room for content, that direction falls back to the default and the PDF still renders. The submission's log records why.
- With a background, Chronicle leaves out its own title because letterhead normally carries the form's title already. Without a background, the template's name prints at the top.
- The background is stretched to fill the page, so match the artwork to the page size you chose.
- A background link Chronicle can't use, such as a relative path, a
data:link, or a Salesforce file link that needs a login, is dropped, and the PDF renders without it.
If a PDF doesn't appear, open the Form record and read the Submissions Log. It records why a render failed. When a large batch of forms completes at once, Chronicle makes PDFs for about the first 33 of them.
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 grayed out and can't be edited. That includes signatures, whose pad is turned off, and file uploads.
Sharing forms
The main way to publish a form is the Export & Publish section of the template panel:
- Guest sharing: Click Generate share key to give the form its guest share key and make it public. An On/Off switch then turns public access off and on again without changing the key. Rotate key replaces the key and at once turns off every link and embed you shared before. It's a quick way to retire them all. The key is shared by every version of the form.
- Public form URL: Copy URL copies the link people use to open the form. The link is built from your org's Public Form Site and the share key. It always opens whichever version is active and never shows the template's internal Id.
- Website embed: Copy snippet copies a script tag that puts the form on any website. It uses your Form Embed Site. See Embedding a form on a website.
Other ways to reach a form:
- On a record page: Place the Chronicle Form Viewer component on any Salesforce record page and set its form and record.
- Reopen one submission: Every submission has its own unguessable Public ID, and a link with
c__chronfid=<public id>reopens that exact submission. A Salesforce record Id won't open a form. Only the Public ID does. - Values from a link or placement: Add a JSON map of field API names to values to the link as
c__chronprefill(filled into empty fields as the form opens) orc__chronstatic(saved on every save). When you place the Form Viewer on a Lightning page, the same maps go in Pre-fill Values (JSON) and Static Values (JSON). These take literal values only, never merge tags. A field the template already pre-fills takes the template's value.
Exporting and importing templates
You can move a form between orgs, or keep a backup, with Export and Import.
- Export: Open a template and, in Export & Publish, click Copy template JSON under Template JSON.
- Import: On the Hub, click Import, paste an exported JSON, and confirm. A brand-new template is created. Its name, fields, and layout are restored, and it gets a fresh unique name, a new version number, and its own share key. Nothing is overwritten, and you can 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 see a warning listing them and can decide whether to import anyway. Those fields won't bind until you fix them. If everything is found, the import completes at once.
You can also write that JSON yourself instead of exporting it from an existing form. Template JSON describes the whole file field by field. It's written so you can hand it to an AI assistant along with your object's field list and get back a form ready to import.
Tips
- Width sets whether a cell takes a third of the row, half of it, or all of it.
- Sort Order sets the order of sections and cells within a page and of what prints in the PDF. Lower numbers come first.
- You can drag and drop cells between sections in the page editor.
- Use Display Text for instructions, disclaimers, or any content that isn't a question, and personalize it with
{!Field__c}merge tags. - To require a signature, drawing, or file upload, open the cell's Conditions and set Required to Always true. That's how you require a question, too.
- For dependent lookups, such as only Contacts on the selected Account, use a Lookup Filter with a Field value pointing at the form's field.