{"title":"Custom forms","slug":"custom-forms-feature","url":"https://support.storeconnect.com/articles/custom-forms-feature","url_markdown":"https://support.storeconnect.com/articles/custom-forms-feature.md","subtitle":null,"summary":"Collect structured customer data at the product, checkout, or post-order stage. Custom forms support 10 question types, Liquid-based conditions and validation, configurable picklist options, and automatic sync of responses to Salesforce objects.","type":"Help_Documentation","video_url":"","keywords":"custom forms, form questions, checkout forms, post-checkout, Liquid, validation, Salesforce, form answers","last_modified":"2026-08-21T07:12:35+0000","body_markdown":"Custom forms let you collect structured information from customers at key points in their journey — adding a product to cart, progressing through checkout, or after completing an order. All responses sync to Salesforce automatically as FormAnswer and FormSubmission records, linked to the customer's Contact record and the order.\n\n## Display modes\n\nEach form has a display mode that determines when and where it appears.\n\n| Mode | When it shows |\n|---|---|\n| **Add to cart** | When the customer adds a specific product to their cart |\n| **In checkout** | At a specific step during the checkout flow |\n| **After checkout** | After the order is completed; the customer completes and submits the form post-purchase |\n\nForms in `in_checkout` mode can have a Liquid condition that controls at which checkout step the form appears — for example, only on the shipping step, or only when a specific product type is in the cart.\n\n## Question types\n\n| Type | Input |\n|---|---|\n| **Text** | Single-line text input |\n| **Text area** | Multi-line text input |\n| **Integer** | Whole number |\n| **Decimal** | Number with decimal places |\n| **Boolean** | Yes/No checkbox |\n| **Date** | Date picker |\n| **Datetime** | Date and time picker |\n| **Picklist** | Single-select dropdown |\n| **Multi-picklist** | Multi-select dropdown (answers stored as semicolon-separated values) |\n| **File** | File upload |\n\n## Default values\n\nQuestions can have default values that pre-fill the field. Default values can be static or evaluated as a Liquid expression at render time.\n\nExamples:\n- Today's date: `'now' | date: '%Y-%m-%d'`\n- Store name: `current_store.name`\n- A derived value: `current_store.name | size | plus: 1`\n\n## Dynamic picklist options\n\nPicklist and multi-picklist questions can generate their option lists from a Liquid expression, allowing options to reflect live store data rather than a fixed list.\n\nExample — populate a picklist with the store's active payment provider names:\n```\nlabel: current_store.payment_providers | pluck: \"name\"\nvalue: current_store.payment_providers | pluck: \"id\"\n```\n\n## Validation\n\nQuestions support Liquid-based validation rules. Each rule is written on its own line in the format `Error message: liquid_condition`. If the condition evaluates to false, the error is shown and the form cannot be submitted.\n\nExample validation rules:\n```\nTerms must be accepted: value == \"true\"\nPlease enter a valid email: value contains \"@\"\nValue must be at least 10: value | plus: 0 \u003e= 10\n```\n\nThe `value` variable holds the customer's current answer for that question. Required fields are validated as a separate flag before Liquid rules are applied.\n\n## Conditional display\n\nForm-level Liquid conditions control whether the entire form is shown at a given checkout step. Individual questions can also be hidden or shown based on conditions, allowing forms to adapt to the customer's context — for example, showing a business registration question only when the customer's account type is commercial.\n\n## Scoping\n\n**Product forms** — a form is attached to one or more products. It appears when any of those products is added to the cart.\n\n**Store forms** — a form is attached to one or more stores. It applies to any checkout on those stores, subject to display mode and conditions. A single form can be reused across multiple stores.\n\n## Post-checkout answering\n\nForms with the `after_checkout` mode create empty, editable answer records when an order is placed. The customer completes the form from their account dashboard after purchase and can update their answers.\n\nThis suits:\n- Enrolment and registration forms that don't need to block checkout\n- Gift message content for gift purchases\n- Additional information required for fulfillment that the customer provides at their convenience\n\nWhen a customer updates an answer, the previous version is marked as stale in Salesforce and the new answer is stored. Both are retained for audit purposes.\n\n## Salesforce records\n\nAll form responses sync to Salesforce automatically.\n\n**FormSubmission** — one record per form submission, linked to the Contact, Order, store, and form.\n\n**FormAnswer** — one record per question answer, linked to its FormSubmission. Fields include: the answer value, the question text as rendered at the time of submission, the question data type, a sensitivity flag for PII classification, an editable flag, a file URL for file upload questions, and a stale flag when the customer has updated their answer.\n\nAll records are standard Salesforce objects, reportable with SOQL and available in Salesforce reports and dashboards.\n\n## Form identifiers and Liquid embedding\n\nEach form has a unique identifier. Forms can be embedded in CMS pages and theme templates using the `custom-form` Liquid tag, referenced by identifier. This allows forms to appear anywhere on the storefront — not only at product or checkout entry points.\n\n## Set this up\n\n- [Create and configure custom forms](custom-forms)"}