> For the complete documentation index, see [llms.txt](https://docs.distro.so/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.distro.so/guides/demo-requests.md).

# Demo request to booked meeting

Qualify a demo request, find the account it belongs to, and book the right rep before the visitor leaves the page.

A demo request is a form where a buyer asks to talk to sales. In Distro, one workflow checks the request, finds the account the person belongs to, opens the right rep's calendar on the same page, and follows up with people who don't book.

## At a glance

| Step       | Workflow step                              | What it does                                                                               |
| ---------- | ------------------------------------------ | ------------------------------------------------------------------------------------------ |
| 1. Capture | **New form submission**, or **API call**   | Starts a run with the form answers.                                                        |
| 2. Qualify | **Branch** and **Enrich Lead**             | Turns away personal email addresses, fills in company details, and checks fit.             |
| 3. Match   | **Match Salesforce Record** on Account     | Finds the account for the person's company.                                                |
| 4. Book    | **Show Scheduler**                         | Matched people book with the account owner. Everyone else books through the event's queue. |
| 5. Record  | **Create Salesforce Record** on **Booked** | Creates the lead with the rep the person booked with as owner.                             |
| 6. Recover | The **Not booked** outcome                 | Follows up with people who leave without booking.                                          |

## Before you start

| You need                                                       | Where                                                                                                               | Why                                                                     |
| -------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- |
| A lead form, or a connected website form, with an email field  | **Forms**. See [Create a lead form](/forms/lead-forms.md) and [Connect an existing form](/forms/existing-forms.md). | The form starts the workflow.                                           |
| Salesforce or HubSpot connected                                | **Settings** › **Integrations**. See [CRM connections and identities](/data-and-integrations/crm.md).               | The match step reads the account and its owner.                         |
| Each rep's CRM user in **Connected identities**                | **Settings** › **Members** › **Identities**                                                                         | Distro turns the account owner into the member whose calendar it shows. |
| A queue of AEs with a routing profile that counts **Meetings** | **Routing** › **Queues** and **Routing profiles**. See [Create and manage a queue](/routing/queues.md).             | The queue picks the rep for people without an account.                  |
| A **Shared event** hosted by the queue                         | **Scheduling** › **Event types**. See [Event types and hosts](/scheduling/event-types.md).                          | The scheduler offers this event's times.                                |
| An enrichment chain                                            | **Field catalog** › **Enrichment chains**. See [Enrichment and chains](/data-and-integrations/enrichment.md).       | **Enrich Lead** uses it.                                                |

## Build the workflow

This example routes a `Request a demo` form with Salesforce. People from an existing account book with the account owner. Everyone else books the `30-minute demo` shared event, hosted by the `Inbound AEs` queue.

{% stepper %}
{% step %}

### Start from the form

Create a workflow and choose **New form submission**. Select `Request a demo`. For requests your own server sends, use **API call** instead; see [API and webhooks](/workflows/api-and-webhooks.md).
{% endstep %}

{% step %}

### Turn away personal email addresses

Add **Branch** with a branch named `Personal email`: the lead's email **Is a personal email or domain**. Connect it to **Redirect** with a page that asks for a work email. Checking first saves enrichment calls.
{% endstep %}

{% step %}

### Enrich and check fit

On **Otherwise**, add **Enrich Lead**. Set **What to enrich** to **Person and company**, pick your chain, and set **Email / Domain** to the lead's email. Add a second **Branch** named `Qualified`, for example where the lead company's **Headcount** is **At least** 50. Send **Otherwise** to a **Redirect** to your resources page.
{% endstep %}

{% step %}

### Find the existing account

On `Qualified`, add **Match Salesforce Record** with **Object** set to `Account`. Under **Matching criteria**, map `Website` to the lead company's **Domain**, and `OwnerId` to `queue:account-executives` so only accounts owned by a current AE match. Under **When several records match, pick**, choose **Highest value of a field** with `NumberOfEmployees`.

{% hint style="warning" %}
Salesforce matching compares values exactly. Keep account websites as bare domains (`acme.com`) or match on a domain field your team maintains. A website saved as `https://www.acme.com` doesn't match.
{% endhint %}
{% endstep %}

{% step %}

### Book matched people with the owner

On **Matched**, add **Show Scheduler** with `30-minute demo`. Set **Hosts** to **Choose hosts here**, **Host source** to **CRM record owner**, and the owner ID to the account's `OwnerId`. Set **Fallback host** to a team lead, so the person still sees times when the owner has none or isn't mapped.
{% endstep %}

{% step %}

### Book everyone else through the queue

On **Not matched**, add a second **Show Scheduler** with `30-minute demo` and **Hosts** set to **Use event hosts**. The event's queue picks the rep with its routing profile.
{% endstep %}

{% step %}

### Record the booking

On each **Booked** outcome, add **Create Salesforce Record** for a `Lead`. Map `Email`, `LastName`, and `Company`, and set `OwnerId` to the meeting's **Host ID**. Under advanced settings, set **Update instead when this field already matches** to `Email` so a repeat request doesn't create a duplicate.
{% endstep %}

{% step %}

### Follow up with people who don't book

On the queue scheduler's **Not booked**, add **Assign from Queue** with `Inbound AEs`, then **Notify in Slack** to the **Earlier assignee**. On the owner scheduler's **Not booked**, post to your leads channel. See [Follow up with a lead who did not book](/guides/unbooked-follow-up.md).
{% endstep %}

{% step %}

### Test and publish

Select **Simulate** with your own work email, review the paths, then **Publish** and turn the workflow **On**. Submit the live form with a test email to see the calendar open. See [Test, publish, and versions](/workflows/test-and-publish.md).
{% endstep %}
{% endstepper %}

{% hint style="info" %}
Keep only the steps that decide the host before **Show Scheduler**, because the visitor waits while they run. Put CRM writes and alerts on **Booked** and **Not booked**.
{% endhint %}

## HubSpot differences

| Step                | Salesforce                                                         | HubSpot                                                                                   |
| ------------------- | ------------------------------------------------------------------ | ----------------------------------------------------------------------------------------- |
| Find the account    | **Match Salesforce Record**, `Account`, `Website`                  | **Match HubSpot Record**, Company, `Company Domain Name` equals the lead company's domain |
| Host on **Matched** | **CRM record owner**, provider Salesforce, the account's `OwnerId` | **CRM record owner**, provider HubSpot, the company owner                                 |
| Record the person   | **Create Salesforce Record**, `Lead`                               | **Match HubSpot Record** for the contact first, then **Create HubSpot Record**            |

## Reduce no-shows

Attach reminders to the event under **Notifications & reminders**, with manage links so guests reschedule instead of skipping. To act on a no-show, see [Follow up after a no-show](/guides/no-show-follow-up.md).

## Check that it worked

* **The run**: open the workflow's **History** and a run. It shows whether the account matched and when the scheduler waited, booked, or continued. See [Logs and troubleshooting](/workflows/logs.md).
* **The queue's pick**: **Routing** › **Assignment log** shows why the queue chose the rep. Owner bookings don't appear, because no queue picked them.
* **The meeting** is listed in **Bookings**, and the lead in Salesforce shows the rep as owner.

## Troubleshoot

| What you see                         | What to check                                                                                             |
| ------------------------------------ | --------------------------------------------------------------------------------------------------------- |
| No calendar after submit             | The workflow is **On**, the submission has an email, and the form's embed or tracker loads with the page. |
| A known account books with the queue | The match took **Not matched**: personal email, or the account's `Website` isn't the bare domain.         |
| The scheduler fails for the owner    | Map the owner under **Connected identities**, or set a member as **Fallback host**.                       |
| The calendar shows no times          | Hosts need connected calendars and open time; queue members can't all be out of office.                   |

Replacing an old router? See [Move a Form Router](/migrate/form-router.md) and complete the migration checklist before switching the live source.


---

# 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 dynamically by asking a question.

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

```
GET https://docs.distro.so/guides/demo-requests.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 `build a script that syncs our docs to a CMS` 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.
