> For the complete documentation index, see [llms.txt](https://docs.dapta.ai/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.dapta.ai/dforms/troubleshooting.md).

# Troubleshooting

Symptom, cause and fix for the problems that come up most in dForms: changes that are not live, a missing HubSpot contact, partials held by spam protection, human-check messages, a failed webhook, ema

Each section below names the symptom, explains what causes it and tells you exactly where in the product to check. If your problem is not here, the [FAQ](/dforms/faq.md) covers the "can I do this at all" questions.

***

## My changes are not live

**Symptom:** you edited a question, changed the colors or fixed a typo, the editor says **Saved**, but the public form still shows the old version.

**Cause:** **Saved** and **published** are two different things. Autosave writes a **draft** roughly a second after you stop typing. Respondents keep seeing the last published version until you say so.

**Fix:** look at the top right of the editor. If the dot reads **Unpublished changes**, click **Publish**. You get the confirmation *Changes published. Your form is live.*

<figure><img src="https://3835013762-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCy5rSNtQmtqYCGzJlNEB%2Fuploads%2Fgit-blob-aaa807cdce0817aa049770c40f991c891c2ce005%2Fforms-autosave-and-publishing-03-unpublished-badge.png?alt=media" alt="The editor topbar showing the Unpublished changes dot next to the Publish button"><figcaption><p>The <strong>Unpublished changes</strong> dot means the draft is ahead of the live form. Click <strong>Publish</strong>.</p></figcaption></figure>

Worth knowing:

* When **Publish** is disabled and its tooltip reads **All changes are published**, the live form really is up to date. Reload the public page with a hard refresh before looking further.
* The **Tracking & pixels** IDs on the **Connect** tab are staged with the draft too, so they only start firing after you publish.
* **Spam protection (captcha)** on the **Connect** tab is staged with the draft too: it only applies to the live form after you publish.
* **Connect → Integrations** is the exception: webhook and HubSpot settings save straight to the live form, without publishing.

***

## A HubSpot contact was not created

**Symptom:** the response is in **Submissions**, but no contact shows up in HubSpot.

Work down this list in the form's **Connect** tab, **HubSpot** card.

**Cause 1: the form has no email address to sync.** HubSpot matches a contact by email address, so a submission that carries no address has nothing to identify. The card says so directly.

<figure><img src="https://3835013762-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCy5rSNtQmtqYCGzJlNEB%2Fuploads%2Fgit-blob-9b1b1b678286d760239820115006e4a8ac0ae22b%2Fforms-how-sync-works-02-no-email.png?alt=media" alt="The HubSpot card showing the notice This form has no email address to sync with an explanation of how contacts are matched"><figcaption><p>No email question and no scheduler means no contact. The card explains it before you go looking.</p></figcaption></figure>

**Fix:** click **Add an email question**, or add a **Scheduler** step: Calendly collects the invitee's address when someone books, and that address keys the sync.

**Cause 2: the mapping conflicts with a booking.** On a form where the booking supplies the email, mapping one of your own questions to the `email` property overrides it and breaks the match. The card shows the alert **This mapping stops the sync**.

**Fix:** set that question's **HubSpot property** back to **(none)** and let the booking supply the address.

**Cause 3: the card is switched off, or HubSpot is not connected.** The switch in the top right of the card must read **Enabled**. If the card instead says **Connect HubSpot to map this form**, nobody has connected the account yet: click **Go to Connections** and connect it (an admin or an owner has to do this).

**Cause 4: nothing is mapped to `email`.** Open **Map questions** and check that one question points at the `email` property. **Auto-map** does it for you and reports *Auto-mapped {n} question(s). Review and save.*

**Cause 5: you are looking for something that only complete submissions send.** A partial submission upserts the contact and writes the mapped answers and UTMs. The score, the outcome, static properties, the note and the form submission activity are only written when someone finishes.

**Cause 6: spam protection is on.** With **Spam protection (captcha)** switched on, partial answers are not sent to HubSpot at all: the contact is created or updated when the respondent completes the form. See [Partial answers stopped reaching HubSpot or my webhook](#partial-answers-stopped-reaching-hubspot-or-my-webhook).

**Where to check:** the **HubSpot history** panel at the bottom of the card. Click **View history** to see each delivery, its status pill and, on a failure, the reason and what HubSpot answered.

***

## Partial answers stopped reaching HubSpot or my webhook

**Symptom:** partial responses still appear in **Submissions**, but no contact is created or updated in HubSpot, and no partial delivery reaches your webhook, until someone finishes the form.

**Cause:** **Spam protection (captcha)** is on for the form. With it on, partial answers are saved but not sent anywhere: only complete, verified responses reach your integrations. That is what keeps bots from filling your CRM.

**Where to check:** the form's **Connect** tab. The **HubSpot** card says *Spam protection is on: contacts are created or updated when a respondent completes the form, not from partial answers.* A webhook's partial trigger reads **Paused while spam protection is on**, and a webhook that only listens to partials says *This webhook will not fire: it only listens to partial answers, which are paused while spam protection is on.*

**Fix:** nothing is broken. If you need partial leads in HubSpot or in your webhook, switch spam protection off and publish, knowing that bots can then reach your integrations. See [Spam protection (captcha)](/dforms/connect/spam-protection.md).

***

## A respondent sees a message about being human

**Symptom:** a respondent writes that the form refused to send, with a message about checking that they are human.

| What they see                                                                        | Cause                                                                                                                               | Fix                                                                                |
| ------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- |
| *This form now checks that you're human. Refresh the page and submit again.*         | Spam protection was switched on and published while their tab was open.                                                             | Ask them to reload the page and submit again.                                      |
| *We couldn't verify that you're human. Please try again.*                            | The check did not pass.                                                                                                             | Ask them to try again. A browser extension that blocks scripts can get in the way. |
| *We couldn't complete the security check. Your answers are saved. Please try again.* | The check could not be reached for a moment. Their answers were kept as a partial response, which is not sent to your integrations. | **Try again** sends them again.                                                    |

See [Spam protection (captcha)](/dforms/connect/spam-protection.md).

***

## A webhook shows Failed

**Symptom:** the webhook card shows a red **{n} failed** chip, or a row in **Webhook history** has a **Failed** pill.

**Cause:** the failure is almost always your endpoint's answer, and dForms writes that answer down. Open **View history** and expand the row: **What we sent** holds the exact body, **What came back** holds the status and the response.

<figure><img src="https://3835013762-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCy5rSNtQmtqYCGzJlNEB%2Fuploads%2Fgit-blob-a1ea666cf3be71b75e598d905155be3ca6da93f2%2Fforms-delivery-and-retries-03-failed-row.png?alt=media" alt="The Webhook history dialog with a Failed row expanded, showing 5 attempts, the JSON body under What we sent and the endpoint response under What came back"><figcaption><p>A failed delivery keeps its five attempts, the body that was sent and the answer that came back.</p></figcaption></figure>

**Fix:** match the message to the cause.

| What the message says                                                                                 | What it means                                       | What to do                                                                                                                                  |
| ----------------------------------------------------------------------------------------------------- | --------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| *It does not accept POST on this URL.*                                                                | The endpoint answered 405 or 501.                   | dForms always delivers with `POST` and a JSON body. Point the webhook at a route that accepts POST.                                         |
| *It refused the content type.*                                                                        | 415.                                                | Accept `application/json`.                                                                                                                  |
| *It read the request and rejected the body.*                                                          | Another 4xx.                                        | Compare **What we sent** with what your endpoint expects. See [Payload & headers reference](/dforms/connect/webhooks/payload-reference.md). |
| *It refused the request as unauthorised. Check any token or secret it expects.*                       | 401 or 403.                                         | Your endpoint wants credentials dForms is not sending. Verify the request with the signature instead.                                       |
| *There is nothing at that URL.*                                                                       | 404 or 410.                                         | The path is wrong or the endpoint was removed.                                                                                              |
| *It is rate-limiting us. Try again shortly.*                                                          | 429.                                                | Raise the limit on your side, or accept the retries.                                                                                        |
| *It failed on its side.*                                                                              | 5xx.                                                | Your endpoint crashed on the request. Check its own logs.                                                                                   |
| *It answered with a redirect, which we never follow. Use the final URL directly.*                     | 3xx.                                                | Put the final URL in **Endpoint URL**.                                                                                                      |
| *Blocked before sending: that address is private, reserved, or internal, and we never post to those.* | The host resolves to a private or internal address. | Use a publicly reachable HTTPS URL. Tunnel your local server if you are testing.                                                            |
| *Nothing answered at that URL. Check the host is reachable and not timing out.*                       | Connection refused or timed out.                    | Each attempt is dropped after 10 seconds. Make the endpoint answer faster, and reply before you do the slow work.                           |

Then click **Send test** to confirm the fix. A success shows *Test delivered. Your endpoint accepted it.* If the button says *Save a webhook URL first.*, the **Endpoint URL** field is still empty.

> **💡 Tip:** Failures retry on their own, up to five attempts with a growing gap between them. There is no resend button, so once a delivery is marked **Failed** it stays a log entry: fix the endpoint and the next submission goes through.

***

## Submission emails do not arrive

**Symptom:** someone completed the form and neither you nor the respondent got an email.

Check these in order:

1. **The submission was only partial.** Emails are sent on completed submissions only. Confirm the row says **Completed** in **Submissions**.
2. **The email is switched off.** Open **Connect → Emails** in the form, or **Account settings → Notifications** for the whole workspace, and check that **Send this email** is on for **New submission notice** and **Respondent confirmation**.
3. **The response has no email address in it.** The **Respondent confirmation** is skipped when no answer looks like an email address. There is nobody to write to.
4. **You are checking the wrong inbox.** The **New submission notice** goes to the addresses under **Send to**, set in **Account settings → Notifications** or for one form in **Connect → Emails**. Only when that list is empty does it go to the workspace owner's address. Each address gets its own copy, and its own row in **Email history**.
5. **It landed in spam.** The sending address is set by the deployment and cannot be changed per form, so a first message from it may be filtered. Check spam and promotions, and allow the sender.

**Where to check:** the **Email history** panel in **Connect → Emails** lists the last deliveries with a status pill, the same way webhooks do. A row that is **Delivered** means the message left dForms and the problem is on the receiving side.

> **⚠️ Note:** Editing the account templates requires an admin or an owner. A member sees *Only admins and owners of this workspace can edit its notification emails.*

***

## The Calendly step does not load

**Symptom:** the scheduler shows nothing on the canvas, or respondents see a spinner instead of a calendar.

| What you see                                                 | Cause                                                                                                                                 | Fix                                                                                                                                                                                                                         |
| ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Connect Calendly in Integrations to pick an event type.**  | Calendly is not connected for the workspace.                                                                                          | Click **Go to Integrations** and connect it. Only an admin or an owner can.                                                                                                                                                 |
| **No event type picked yet**                                 | The step exists but no event type is selected.                                                                                        | Open the question settings and pick one under **Event type**.                                                                                                                                                               |
| Your event type is missing from the picker                   | Only active event types are listed, up to 100, sorted by name.                                                                        | Activate the event type in Calendly, then reopen the picker.                                                                                                                                                                |
| The respondent is stuck on **Loading the calendar…**         | The embed could not load in that browser, usually a blocker, a strict privacy extension, or a site policy where the form is embedded. | The step falls back to an **Open the scheduling page** link, which always works. Turn **Required** off in the question settings if you do not want the step to be a dead end: the public form then offers **Skip for now**. |
| The step is right in the editor but missing on the live form | The scheduler was added or changed in the draft.                                                                                      | Click **Publish**.                                                                                                                                                                                                          |

If somebody books but nothing lands in HubSpot, the booking itself still succeeded: the enrichment is what needs the Calendly connection. Check the **HubSpot history** panel and see [Booking sync](/dforms/connect/hubspot/booking-sync.md).

***

## A file will not upload

**Symptom:** the respondent picks a file and the question refuses it, or the upload starts and never finishes.

| What they see                                           | Cause                                                                                       | Fix                                                                                                                                        |
| ------------------------------------------------------- | ------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| *That kind of file is not accepted here.*               | The extension is not in **Accepted files**, or it is one of the types no form ever accepts. | Widen **Accepted files** in the question settings, then **Publish**. Programs and web pages cannot be allowed.                             |
| *That file is bigger than 10 MB.*                       | The file is over the limit for that question.                                               | Raise **Largest file (MB)**, up to the ceiling the hint names, then **Publish**. Ask for a smaller file if you are already at the ceiling. |
| *That upload did not finish.*                           | The connection dropped mid-upload, or the upload address expired on a very slow link.       | **Try again** gets a fresh address. A repeat on the same file usually means the connection, not the file.                                  |
| The whole submission fails after the file uploaded fine | The file's contents do not match its extension, for example a program renamed to `.pdf`.    | Ask for the real file. This check cannot be turned off.                                                                                    |

**Where to check:** the question's own **File upload** section in **Question settings** holds both rules, and the line under **Choose a file** on the live form shows respondents exactly what they are. If they disagree, the form has unpublished changes: click **Publish**.

***

## An uploaded file will not open

**Symptom:** clicking a filename in **Submissions** shows *The preview could not load.*

Links to uploaded files live a few minutes. A dialog left open longer than that fails on its next load, which is what this message means. Click **Try again**: it fetches a new link rather than retrying the dead one.

Two other behaviours are not faults. A file type that no browser can draw, such as a spreadsheet or an archive, downloads instead of opening a dialog. So does any file over 25 MB. See [Uploaded files](/dforms/results/uploaded-files.md).

***

## Submissions shows fewer responses than I expect

**Symptom:** the **Responses** table or **Summary** shows fewer responses than you expect, or you are looking for the **All**, **Completed** and **Partial** buttons.

**Cause:** a filter is on. Filters live in the column headings, and they are part of the page's address, so a bookmark or a link from a teammate can open with filters already applied. The **Status** heading replaced the old buttons.

**Fix:** look at the bar above the table. Each chip names one filter and its x removes it, the count reads *11 of 27 responses*, and **Clear all** removes every filter. See [Filter & sort responses](/dforms/results/filter-and-sort.md).

***

## A shared response link opens nothing

**Symptom:** a teammate sends you a link to a response, and the **Submissions** page opens without the response panel.

**Cause:** the link opens the response only while it is on that page of the table. New responses push older ones to later pages, and a deleted response is gone for good.

**Fix:** find the response again, for example by filtering the date column to the day it came in, or by searching one of its answers in **Summary**, and click it. See [Submissions](/dforms/results/submissions.md).

***

## Dates or daily numbers look shifted

**Symptom:** a response sent in the evening shows the next day's date, or **Today** in **Analytics** misses responses you saw arrive.

**Cause:** the workspace timezone is not set, so dates are read in UTC, or it is set to another zone.

**Fix:** an owner or an admin picks the right zone in **Account settings → Workspaces** → the workspace → **Workspace timezone**, or in the same field next to the responses table. Dates, **Analytics** days and the CSV follow straight away. See [Workspaces](/dforms/account/workspaces.md#workspace-timezone).

***

## I cannot see a workspace

**Symptom:** a colleague says you were added, but the workspace is not in your switcher or in **Account settings → Workspaces**.

**Causes and fixes:**

* **The invitation has not been accepted.** An invited workspace shows with an **Invited** badge. Accepting means opening it: click **Open** on the card and you are in.
* **You are signed in with a different account.** Workspaces follow your Dapta account. Check the email under the profile button in the rail footer and sign in with the account the invitation went to.
* **The invitation went to another address.** Ask an admin of that workspace to open **Account settings → Workspaces**, pick it, and use **Add a member** with the right address. Pending invites live on the **Invitations** tab, where **Resend** sends the email again.
* **You opened a link to a workspace you are not in.** The page answers *That workspace is not among yours.* Nothing is wrong with your account: you simply are not a member.
* **You have a lot of workspaces.** From six upwards the switcher shows a **Find a workspace** search box. Type part of the name.

***

## I cannot create a workspace

**Symptom:** **New workspace** does not create anything and the dialog shows a message.

| Message                                              | Why                                                  | What to do                                                            |
| ---------------------------------------------------- | ---------------------------------------------------- | --------------------------------------------------------------------- |
| **Give the workspace a name (up to 80 characters).** | The name is empty or too long.                       | Type a shorter name.                                                  |
| **Your account cannot create workspaces.**           | Your Dapta account is not allowed to create one.     | Ask the owner of your Dapta account, or create it from the Dapta app. |
| A message from Dapta, for example about your plan    | Dapta refused the new workspace and gave its reason. | Follow what it says in the Dapta app.                                 |
| **Could not create the workspace. Try again.**       | Something failed along the way.                      | Wait a moment and try again.                                          |

***

## I cannot change an owner

**Symptom:** the kebab menu on a member row is missing, or an action comes back with an error.

| Message                                                            | Why                                                                          | What to do                                                                                                                                    |
| ------------------------------------------------------------------ | ---------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| No **Member actions** menu on that row                             | Only an owner can act on another owner, and nobody can act on their own row. | Ask an owner of the workspace to make the change.                                                                                             |
| *A workspace must keep at least one owner.*                        | You are demoting, deactivating or removing the last active owner.            | Promote somebody to owner first, in the Dapta app, then repeat the change.                                                                    |
| *Ownership is transferred from the Dapta app.*                     | Ownership is not something dForms hands over.                                | Do it in the Dapta app. The change shows here the next time the workspace loads.                                                              |
| *You do not have permission to do that.*                           | You are a member, or an admin acting on an owner.                            | Admins can invite, promote, demote, activate and deactivate everyone except owners. Removing somebody who has already accepted is owner only. |
| *Only admins and owners of this workspace can manage its members.* | You are a member on the workspace detail page.                               | Ask an admin or an owner.                                                                                                                     |

Removing a member never deletes their forms or the responses those forms collected: the work stays in the workspace.

***

## The public link shows a 404

**Symptom:** you open the public URL and get a not found page.

**Cause 1: the link was typed or pasted wrong.** A form's address is `app.dforms.ai/{account code}/f/{form slug}`. Every link the product handed out keeps working, including links from before you used **Edit link** and older links that carry a handle, so a 404 usually means a typo. **Fix:** never retype the URL. Use **Copy link** in the editor topbar, or the copy icon on the form's row in the **Forms** list.

**Cause 2: the form was deleted.** Deleting a form removes its public page along with its submissions, and the link cannot be restored.

**Cause 3: you are looking at a public page, not a form.** The address `app.dforms.ai/{account code}/{handle}` is your personal page, and it stays a 404 until you turn it on. **Fix:** open **Account settings → Public page**, switch **Published** on and save. You also need a handle: without one the page says *You need a handle before this page can have a URL.*

> **💡 Tip:** Your account code keeps working forever, including after you claim a vanity slug, so links you shared in the past never break.

A form you have never published does not give a 404: its link opens and shows the live version of the form, which for a brand new form reads *This form has no steps yet.* Click **Publish** to put your questions live.

***

## The editor says the form was saved from somewhere else

**Symptom:** a banner reads **This form was saved from somewhere else**, and your latest edits are not saved yet.

**Cause:** another person, or another tab of yours, saved the same form while you were editing. dForms stops rather than let one version silently overwrite the other.

**Fix:** **See saved version** loads what was saved elsewhere; your edits from this tab are not lost, the **Unsaved changes recovered** banner offers them back. **Keep mine** saves your version over it. Check with your teammate before you pick.

***

## Where each thing is checked

| Problem                                                  | Where to look                                                                                                    |
| -------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
| Changes not live                                         | Editor topbar: the save status pill and the **Unpublished changes** dot                                          |
| HubSpot contact missing                                  | Form → **Connect** → **HubSpot** card, then **HubSpot history**                                                  |
| Partials not reaching integrations, human-check messages | Form → **Connect** → **Spam protection (captcha)**                                                               |
| Webhook failing                                          | Form → **Connect** → **Webhook** card → **View history**, or the **Webhooks** table on the **Integrations** page |
| Emails missing                                           | Form → **Connect** → **Emails** → **Email history**, and **Account settings → Notifications**                    |
| Scheduler not loading                                    | The scheduler question's settings, and the **Connections** page for Calendly                                     |
| File refused or not opening                              | The question's **File upload** settings, and the line under **Choose a file** on the live form                   |
| Fewer responses than expected                            | The filter bar above the responses table                                                                         |
| Dates shifted                                            | **Account settings → Workspaces** → the workspace → **Workspace timezone**                                       |
| Workspace missing                                        | Rail workspace switcher, and **Account settings → Workspaces**                                                   |
| Workspace not created                                    | The **New workspace** dialog, and the Dapta app                                                                  |
| Roles and owners                                         | **Account settings → Workspaces** → the workspace → **Members**                                                  |
| Public link 404                                          | Editor **Copy link**, and **Account settings → Public page**                                                     |
| Form saved from somewhere else                           | The banner at the top of the editor                                                                              |

***

## What's next

* [FAQ](/dforms/faq.md): the questions people ask before they hit a problem.
* [Delivery, retries & history](/dforms/connect/delivery-and-retries.md): how a delivery is attempted, retried and logged.
* [How the sync works & troubleshooting](/dforms/connect/hubspot/how-sync-works.md): the HubSpot matching rules in detail.
* [Autosave, drafts & publishing](/dforms/builder/autosave-and-publishing.md): the full draft to live lifecycle.
* [Members & roles](/dforms/account/members-and-roles.md): who is allowed to do what.
* [File upload](/dforms/builder/question-types/file-upload.md): the accepted types and the size limit in full.
* [Spam protection (captcha)](/dforms/connect/spam-protection.md): what the check does and why it holds partial answers.
* [Filter & sort responses](/dforms/results/filter-and-sort.md): every filter of the responses table.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.dapta.ai/dforms/troubleshooting.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
