Source: https://www.revvly.ai/docs/guides/forms

Guide

# Collect answers with *Forms*.

Build a contact, demo-request or application form, put it on your site or share its link, and have every submission create a lead, tell your team and reply to the person, without anyone copying it across by hand.

## [#](#before)Before you start

Forms is in the sidebar under **Library**, in the Workspace section, next to Documents and Templates. Forms is turned on per workspace; if it is not listed under Library, ask us to enable it. Everyone in a workspace with Forms can build forms and read their submissions.

## [#](#build)Step 1: Build the form

Where: Library > Forms > New form > Build. Add questions from the left, edit each one on the right, and see the form as people will see it in the preview. Changes are saved as you go.

- **Short text, Long text**: Free text, with an optional maximum length.

- **Formatted text**: Bold, italics, links and lists. Stored as sanitised HTML; scripts and styles are removed.

- **Email, Phone, Website**: Checked for shape. A website without https:// gets it added.

- **Number, Date**: A number, or a date as YYYY-MM-DD.

- **Single choice, Dropdown**: One of the options you list. The answer is stored as the option label.

- **Multiple choice**: Any of the options you list.

- **Consent checkbox**: A box to tick, for terms or marketing consent.

- **File upload**: 1 to 5 files of up to 30 MB each, optionally limited to images, PDFs, documents, spreadsheets, presentations or text.

- **Hidden value**: Not shown. Filled from a parameter in the page address, e.g. utm_source, so you know which campaign brought each submission.

- **Heading, Paragraph**: Layout only: titles and explanatory text between questions.

Give the questions that identify the person a **role** (contact email, first name, last name, full name, phone, company name, company website). Steps use roles to find “the email” or “the company” without you wiring each one by hand. Each role can be used by one question per form.

Under form settings you choose the submit button’s label, the thank-you message, and an optional https:// address to send people to afterwards.

## [#](#actions)Step 2: Choose what happens on each submission

Where: Library > Forms > Your form > Actions > Add step. Steps run in order, straight after each submission, in the background: the person filling the form never waits for them.

- **Create a lead**: Adds a lead to the pipeline and stage you choose, with the answers on it. If the email already belongs to a contact, the lead goes on that contact and their company. Otherwise the company is found by the website you collected, or by the email domain (never for Gmail-style addresses), or created, and a new contact is added. Map the first name, last name, company name and company website to any question in the step, or give those questions a role and the step picks them up.

- **Email Revvly users**: Sends the people you pick every answer and a link to the submission. Only current members of your workspace receive it.

- **Send an email**: Sends your own message to the person who filled in the form, to fixed addresses, or both. Send it from Revvly, from your shared mailbox, or from your own connected mailbox.

- **Post to Slack**: Posts the answers to a channel. Any public channel works; for a private channel, invite the Revvly app to it first.

Email and Slack messages can quote answers with tokens, filled in as plain text so nobody can inject formatting, links or mentions:

```
Hi {{field.first_name}},

Thanks for getting in touch about **{{field.company}}**. We will reply within one working day.

The {{form.name}} team
```

{{field.<key>}} is an answer (each question’s key is shown in its settings), {{form.name}} the form’s name, and {{submission.url}} a link to the submission in Revvly.

i

A step that fails is retried automatically over about 45 minutes, and the steps after it wait so they still run in order. If it still fails, its **If this step fails** setting decides: *Carry on with the next step*, or *Stop the remaining steps*. You can retry failed steps from the submission later; steps that already worked are not repeated.

What happens to a submission

1. Published versionThe visitor sees only a published version, never your draft.
2. Visitor submitsSaved with the version it was made on.
3. Steps run in orderIn the background. The visitor never waits.
4. DoneEvery step ran.orA step failsRetried over about 45 minutes, then your setting decides: carry on or stop.

The submission is saved first and the steps run afterwards, so a failing step never costs you the answers.

i

An email to the person who filled in the form goes to whatever address they typed. Quote short answers such as a name or a company in it, not long free text, so the form cannot be used to send someone else a message of the submitter’s choosing.

## [#](#publish)Step 3: Publish

Nobody sees your edits until you press **Publish**. Publishing checks that the form is complete: every step is set up, every token names a real question, the pipeline, stage and people still exist, the mailbox is connected and Revvly can post to the Slack channel. Anything missing is listed so you can fix it.

Each publish is a new version. Submissions keep the version they were made on, so you can rename or remove a question later without losing or mislabelling earlier answers. Archive a form to take it offline; restore it to bring it back.

## [#](#share)Step 4: Share it

Where: Library > Forms > Your form > Share

- **Link**: A page hosted by Revvly. Send it by email, put it in a social post or a QR code. Add parameters for your hidden values, e.g. ?utm_source=newsletter.

- **Embed**: Two lines of HTML for any page of your site. The form sizes itself to its content and picks up the page’s own parameters for hidden values. Its colours, corners and font can match your site.

- **Your own design**: Copy the prompt under “Build it into your own site” into a coding agent (Claude Code, Cursor, Lovable and others). It describes every question and the exact answers Revvly accepts, so the agent can build the form in your site’s own design and post it to Revvly. The reference is in the [Forms API](https://www.revvly.ai/docs/api/forms).

- **From your server**: Submit from your own backend with an API key that can submit forms, for example when your site already posts forms to your server. See [submitForm](https://www.revvly.ai/docs/api/forms#submit-form).

Embed snippet

```
<!-- Copy yours from the form's Share tab: it carries your form's id and address. -->
<div data-revvly-form="Xk2mQ8vT1nR4pLw7Za"></div>
<script src="https://<your-revvly-dashboard>/forms-embed.js" async></script>
```

An embedded form can match your site’s colours, corners and font. See [match the embed to your site](#style-embed).

## [#](#style-embed)Match the embed to your site

By default an embedded form is light, with a mint button. To match your site, add `data-revvly-*` attributes to the same `div`. The form itself is not changed, so every site that embeds it can dress it differently, and a form with no attributes looks exactly as before. Only embedded forms read them; the hosted link keeps Revvly’s look.

A dark form on a black page

```
<div
  data-revvly-form="Xk2mQ8vT1nR4pLw7Za"
  data-revvly-theme="dark"
  data-revvly-background="transparent"
  data-revvly-text="#FFFFFF"
  data-revvly-label="#D1D5DB"
  data-revvly-muted="#9CA3AF"
  data-revvly-input-background="#000000"
  data-revvly-input-border="#374151"
  data-revvly-input-focus-border="#4B5563"
  data-revvly-accent="#3B82F6"
  data-revvly-accent-text="#FFFFFF"
  data-revvly-error="#EF4444"
  data-revvly-radius="6"
  data-revvly-button-radius="24"
></div>
```

`data-revvly-theme` also takes one JSON object, and a separate attribute wins over the same key in it. Use the JSON form when you would rather keep the theme in one place, and a gradient on the button when a flat colour is not enough.

```
<div
  data-revvly-form="Xk2mQ8vT1nR4pLw7Za"
  data-revvly-theme='{"scheme":"dark","background":"transparent","accent":"#3B82F6"}'
  data-revvly-button-background="linear-gradient(90deg, #3B82F6, #8B5CF6)"
></div>
```

- **data-revvly-theme**: dark or light (the default), or a JSON object. Set it to dark whenever the page behind the form is dark.

- **-background, -card**: The page behind the form, and the form’s own surface. Use transparent for the page so the form sits directly on yours. The card is transparent unless you set it.

- **-text, -label, -muted**: The title and answers, the field labels, and help text and placeholders.

- **-input-background, -input-border, -input-focus-border**: The input boxes, at rest and when selected.

- **-accent, -accent-text**: The submit button, focus ring, links and selected options, and the text on the button.

- **-button-background**: A colour or a linear-gradient(…) for the submit button, when it should be more than the accent. Set *-accent-text* with it so the label stays readable.

- **-error**: Error messages and required markers.

- **-radius, -button-radius**: Corner radius of the inputs and of the button, in pixels. A large button radius makes a pill.

- **-font**: A font family the visitor’s device already has, such as Inter, system-ui, sans-serif. The form runs in its own frame and cannot load your site’s font files.

Colours are hex, `rgb()`, `hsl()` or `transparent`. Anything that is not in one of those forms is ignored, so a typo leaves that part of the form on its default rather than breaking it.

### Ask your coding agent to do it

If a coding agent (Claude Code, Cursor, Lovable and others) adds the form to your site, it should ask you before it restyles anything, and it should read your site’s own colours instead of guessing. Copy this prompt, with your form’s id and dashboard address from its Share tab:

Add the form, then offer to style it

```
Add my Revvly form to this website with Revvly's embed snippet, then offer to style it.

1. Put this where the form should appear. Use my form's real id and dashboard address, copied from the form's Share tab in Revvly:

<div data-revvly-form="FORM_ID"></div>
<script src="https://REVVLY_DASHBOARD_ADDRESS/forms-embed.js" async></script>

2. Before you finish, ASK ME this, and wait for my answer:
"The embedded form is light with a mint button by default. Do you want it to match this site (colours, corner radius, dark or light), or keep the default?"
Do not restyle the form unless I say yes, and do not guess at colours.
- If I say keep the default, stop here.
- If I say match the site, read this site's stylesheet or design tokens and find: the page background, the text colour, the input border colour, the accent (primary button) colour, the text colour on that button, the error colour, the corner radius of inputs and of buttons, and the font. Show me what you found as a short list and ask me to confirm or change each value before you use it.

3. Add the confirmed values to the same <div> as data-revvly-* attributes. Only these attributes exist, so do not invent others:
- data-revvly-theme: "dark" or "light" (light is the default). Set it to match the page behind the form.
- data-revvly-background: the page behind the form, or "transparent" so the form sits directly on this site's own background.
- data-revvly-card: the form's own surface. Leave it out for no card.
- data-revvly-text, data-revvly-label, data-revvly-muted: title and answers, field labels, and help text plus placeholders.
- data-revvly-input-background, data-revvly-input-border, data-revvly-input-focus-border.
- data-revvly-accent: the submit button, focus ring, links and selected options. data-revvly-accent-text: the text on the button.
- data-revvly-button-background: use only when the button is not a flat accent, as a colour or a linear-gradient(...) of colour stops.
- data-revvly-error, data-revvly-radius (inputs, in pixels), data-revvly-button-radius (the button, in pixels).
- data-revvly-font: a font family the visitor's device already has, such as "Inter, system-ui, sans-serif". The form runs in its own frame and cannot load this site's font files, so tell me if the site uses a webfont.
Values must be hex, rgb(), hsl() or "transparent" for colours, and plain numbers for radii. Anything else is ignored. Set data-revvly-theme to "dark" whenever the page behind the form is dark, even if I did not mention it.

4. Check the result in a browser: the form has no white box on a dark page, text is readable against its background, error text is visible, and the submit button label is readable. Tell me what you changed and which values came from the site and which from me.
```

For a form that is already on your site, use this shorter one. It asks the same question first and changes only the attributes:

Restyle an embedded form

```
My website already embeds a Revvly form (a <div data-revvly-form="..."> followed by the forms-embed.js script). Help me change how it looks.

First ask me: "Do you want the form to follow this site's colours and corner radius, a specific palette you will give me, or keep the default look?" Wait for the answer. If it is the default, change nothing.

Then set data-revvly-* attributes on that <div>, without touching the script tag or the form itself: data-revvly-theme ("dark" or "light"), data-revvly-background (a colour or "transparent"), data-revvly-text, data-revvly-label, data-revvly-muted, data-revvly-input-background, data-revvly-input-border, data-revvly-input-focus-border, data-revvly-accent, data-revvly-accent-text, data-revvly-button-background (colour or linear-gradient), data-revvly-error, data-revvly-radius, data-revvly-button-radius, data-revvly-font. Show me the values before applying them. If something does not change, check the value is a hex, rgb(), hsl() or "transparent" colour, because anything else is ignored.
```

If you write your own agent instructions, keep the question: whether to keep the default look or match the site is the customer’s choice, and a form that silently takes on guessed colours is harder to undo than one that asked.

## [#](#submissions)Step 5: Read the submissions

Where: Library > Forms > Your form > Submissions. Newest first, searchable by email and filterable by follow-up status. Open one to see the answers, download files, and follow each step.

- **Follow-up status**: *Running* while steps run or wait to retry, *Done* when all ran, *Failed* when a step failed for good (open it to see why, fix the cause and press **Retry failed steps**), and *Skipped* for spam.

- **Export CSV**: Exports what the current search and filter show, up to the newest 10,000, with one column per question across every version of the form. Opens cleanly in Excel and Google Sheets.

- **Ask the Assistant**: The [Revvly Assistant](https://www.revvly.ai/docs/assistant) and [MCP clients](https://www.revvly.ai/docs/api/mcp) can list your forms and read their submissions: “How many demo requests came in this week, and from which companies?”

- **Delete**: Deleting a submission also deletes its uploaded files. Leads, emails and Slack messages it already created stay where they are.

## [#](#client-links)Send a form to a client

Where: Clients > Your client > Forms > Send a form. The same Forms tab is on a prospect. Choose a published form, then Make link.

A form can also collect details from one client or prospect you already know: their billing address, who receives invoices, who signs the contract. You build it like any other form, then send that client a link made for them alone. Their answers come back to the record’s Forms tab, where you decide what to copy onto the record.

- **Client fields**: In the builder, **Add client field** adds a ready-made question, or set **Client field** in a question’s settings: Billing address, Tax ID, Legal name, Legal structure, Company number, the invoice contact’s name, email and phone, or the contract signer’s name, email and phone. Each client field can be used by one question per form.

- **Only through client links**: A form setting. When it is ticked, the public link and the embed stop working, and the form opens only through links made for a client.

- **The link**: Made for that client only, and opens with the client fields filled with what the record holds now. It can be opened as often as they like until they submit, and stops working once answered. Anyone who has it can answer, so send it only to them. **Revoke link** takes back a link that has not been answered.

- **From an email**: In the email composer on a client or prospect, the **Form link** menu inserts a link already sent and still waiting for answers, or makes a new one for any published form. Nothing is sent until you send the email.

- **Status**: *Waiting for answers* until the client submits, with *Not opened yet* or how many times it was opened. Then *1 change to review* (or more) while answers differ from the record, and *Answered* once nothing is left to review. A form the client filled in on your website shows as *Received*.

- **Apply**: Open an answered link to see each answer beside what you hold now, with an **Apply** button for each, or **Apply all**. Nothing is written to the record automatically, and a blank answer never clears what you hold. Answers from a public form are shown but cannot be applied, because anyone can fill one in and name any company.

- **Proposed subscription**: The Plan, Billing period and Subscription start date client fields describe a subscription. For a plan or billing period you choose what each option stands for. The answers show as a **Proposed subscription**, and **Create subscription** opens the usual subscription wizard filled in with them; nothing is created until you confirm it there. A plan option follows the plan, so it always proposes the version on sale today, even after you republish the plan.

## [#](#limits)Spam and limits

1. Every form carries an invisible spam trap. A bot that fills it sees the normal thank-you message, and nothing is stored or sent.
2. Each form takes up to 1,000 submissions a day from its link, embed and your own site, and a separate 10,000 a day through the API, so a flood on the public form cannot block your backend. Past the limit, submissions are refused until the next day (UTC).
3. Each visitor can submit up to 30 times a minute; more is refused for a minute.
4. Uploaded files are checked for their real type and scanned for viruses before they are kept. Files that are never submitted are deleted after a day.
5. Visitors’ IP addresses are never stored, only a keyed fingerprint used to spot abuse.

## [#](#checklist)Before you go live

1. Submit the published form once yourself and check every step in its log.
2. The questions that identify the person have roles, and the email question is required if you create leads or reply to the submitter.
3. The Slack channel and the mailbox you send from are the ones you expect.
4. If you embed the form on a dark or branded page, it is themed to match and you looked at it on a phone. See [match the embed to your site](#style-embed).
5. Links in your campaigns carry the parameters your hidden values read.
6. If you send the form to clients, its client fields are set, you opened a test link yourself and saw it filled with the record’s details, and you chose whether it should open only through client links. See [send a form to a client](#client-links).
7. If you collect personal data, the form has a consent checkbox or a paragraph pointing to your privacy notice.

## Related

- [Forms API reference ›](https://www.revvly.ai/docs/api/forms)
- [Run your sales pipeline ›](https://www.revvly.ai/docs/guides/crm)
- [Configure integration API keys ›](https://www.revvly.ai/docs/guides/api-keys)

