Skip to main content
Routing forms collect visitor data through single-page or multi-step funnels, then route the visitor to a meeting type, external URL, custom page, or contact form based on configurable rules.

Key Concepts

ConceptDescription
Data FieldReusable form input (text, email, select, etc.) scoped to your company
Routing FormContainer for fields, funnel steps, and routing rules
Funnel StepOne page/slide in a multi-step form
QualifierRouting rule with conditions and an action
RecipientPerson who received a one-time form link

Structure Types

TypeDescription
FORM_ONLYSingle-page form
FUNNEL_WITH_FORMMulti-step funnel followed by a final form page
FUNNEL_ONLYMulti-step funnel without a final form

Create a Routing Form

Create a form with inline data fields, funnel steps, and routing rules in a single request:
curl -X POST "https://api.meetergo.com/v4/routing-form" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "x-meetergo-api-user-id: {userId}" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Lead Qualification",
    "structureType": "FUNNEL_WITH_FORM",
    "showProgressBar": true,
    "funnelSteps": [
      {
        "dataFields": [
          {
            "dataField": {
              "label": "Company Size",
              "fieldType": "select",
              "options": [
                { "label": "1-10", "value": "small" },
                { "label": "11-100", "value": "medium" },
                { "label": "100+", "value": "enterprise" }
              ]
            }
          }
        ]
      }
    ],
    "fields": [
      { "dataFieldId": 1, "order": 0 },
      { "dataFieldId": 4, "order": 1 }
    ],
    "qualifiers": [
      {
        "routingAction": "eventRedirect",
        "meetingTypeId": "your-meeting-type-uuid",
        "expression": {
          "operator": "and",
          "operands": [{
            "operator": "equals",
            "target": "attendeeOther",
            "customTarget": "Company Size",
            "value": "enterprise"
          }]
        }
      },
      {
        "routingAction": "customPage",
        "isFallback": true,
        "customPageContent": {
          "en": "Thanks! We will be in touch.",
          "de": "Danke! Wir melden uns bei Ihnen."
        }
      }
    ]
  }'

Cascade Creation

When creating or updating a routing form, data fields can be referenced by ID or created inline:
// Reference an existing data field
{ dataFieldId: 42, order: 0 }

// Create a new data field inline
{
  dataField: {
    label: 'Industry',
    fieldType: 'select',
    options: [
      { label: 'Tech', value: 'tech' },
      { label: 'Finance', value: 'finance' }
    ]
  },
  order: 1
}
This works in both fields (form fields) and funnelSteps[].dataFields (funnel step fields).

Data Fields

Data fields are reusable inputs scoped to your company. Common field types:
TypeDescription
emailEmail with validation
phonePhone number (optional country picker)
text-singleSingle-line text
text-multiMulti-line textarea
numberNumeric input (supports min/max)
selectDropdown
radioRadio buttons
checkbox-singleSingle checkbox
checkbox-multiMultiple checkboxes
slideFunnel page with options
dateDate picker
ratingStar rating
fileFile upload (Growth+)
signatureE-signature
contactComposite contact field

Create Data Field

curl -X POST "https://api.meetergo.com/v4/data-field" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "x-meetergo-api-user-id: {userId}" \
  -H "Content-Type: application/json" \
  -d '{
    "label": "Budget Range",
    "fieldType": "select",
    "required": true,
    "options": [
      { "label": "< $10k", "value": "small" },
      { "label": "$10k-$50k", "value": "medium" },
      { "label": "$50k+", "value": "large" }
    ],
    "locales": [
      { "locale": "de", "label": "Budgetbereich" }
    ]
  }'

Routing Rules (Qualifiers)

Qualifiers determine where a visitor goes after submitting the form. They are evaluated in order; the first match wins.

Routing Actions

ActionDescriptionRequired Field
eventRedirectRedirect to a meeting typemeetingTypeId
customPageShow localized thank-you pagecustomPageContent
externalRedirectRedirect to URLexternalRedirectLink
contactFormShow contact formcontactFormEmail
requestCallbackRequest callback via queuequeueId
instantCallStart instant video call

Condition Expressions

Conditions use a nested AND/OR tree:
{
  "expression": {
    "operator": "and",
    "operands": [
      {
        "operator": "equals",
        "target": "attendeeOther",
        "customTarget": "Company Size",
        "value": "enterprise"
      },
      {
        "operator": "or",
        "operands": [
          { "operator": "contains", "target": "attendeeEmail", "value": "@bigcorp.com" },
          { "operator": "equals", "target": "attendeeOther", "customTarget": "Budget", "value": "large" }
        ]
      }
    ]
  }
}
Operators: equals, notEqual, contains, notContains, startsWith, blank, notBlank, lessThan, greaterThan, containsAny, containsNone Targets: attendeeEmail, attendeeFullname, attendeeFirstname, attendeeLastname, attendeePhone, attendeeOther (use customTarget for custom field name)

Fallback Qualifier

If no qualifier has isFallback: true, a default “Thanks for submitting” custom page is auto-created.

Updating with Declarative Sync

When updating via PATCH, nested arrays use different strategies:
  • Qualifiers: Declarative sync — items with id are updated, without id are created, missing items are removed
  • Funnel Steps & Fields: Full replace — the array you send replaces the current set
// Update: keep one qualifier, add another, remove the rest
await fetch(`https://api.meetergo.com/v4/routing-form/${formId}`, {
  method: 'PATCH',
  headers,
  body: JSON.stringify({
    qualifiers: [
      { id: 'existing-qualifier-uuid', routingAction: 'customPage' },
      { routingAction: 'eventRedirect', meetingTypeId: 'new-mt-uuid',
        expression: { operator: 'and', operands: [/*...*/] } }
    ]
  })
});

Sending Forms

Send a routing form to a recipient via email, SMS, or generate a one-time link.

Delivery Methods

MethodDescriptionRequired
email (default)Sends email with one-time linkemail
smsSends SMS with one-time linkphone
linkGenerates one-time link only

Send via Email

curl -X POST "https://api.meetergo.com/v4/routing-form/{formId}/send" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "x-meetergo-api-user-id: {userId}" \
  -H "Content-Type: application/json" \
  -d '{
    "recipientName": "John Smith",
    "email": "john@example.com",
    "message": "Please fill out this form before our meeting.",
    "deliveryMethod": "email"
  }'
const { publicUrl } = await fetch(
  `https://api.meetergo.com/v4/routing-form/${formId}/send`,
  {
    method: 'POST',
    headers,
    body: JSON.stringify({
      recipientName: 'Partner',
      deliveryMethod: 'link'
    })
  }
).then(r => r.json());

// Distribute publicUrl however you like
The response always includes publicUrl regardless of delivery method. For unlimited-access forms, set a slug:
await fetch(`https://api.meetergo.com/v4/routing-form/${formId}`, {
  method: 'PATCH',
  headers,
  body: JSON.stringify({ slug: 'my-lead-form' })
});
// Public URL: https://cal.meetergo.com/f/my-lead-form

One-Time Fill

When sent to a recipient, each link can only be submitted once:
  1. SendPOST /v4/routing-form/:id/send creates a recipient with a unique token
  2. Open — Recipient opens the link, openedAt is recorded
  3. Submit — Recipient submits, completedAt is recorded
  4. Blocked — Re-submission returns 409 Conflict

Track Recipients

const { recipients } = await fetch(
  `https://api.meetergo.com/v4/routing-form/${formId}/recipients`,
  { headers }
).then(r => r.json());

// Each recipient has: status ("sent" | "opened" | "completed"),
// publicUrl, sentAt, openedAt, completedAt

API Reference

MethodEndpointDescription
POST/v4/routing-formCreate routing form
GET/v4/routing-formList routing forms
GET/v4/routing-form/:idGet routing form
PATCH/v4/routing-form/:idUpdate routing form
DELETE/v4/routing-form/:idDelete routing form
POST/v4/routing-form/:id/sendSend to recipient
GET/v4/routing-form/:id/recipientsList recipients
POST/v4/data-fieldCreate data field
GET/v4/data-fieldList data fields
GET/v4/data-field/:idGet data field
PATCH/v4/data-field/:idUpdate data field
DELETE/v4/data-field/:idDelete data field

Next Steps

Routing & Round-Robin

Distribute bookings across team members

Meeting Types

Configure meeting templates