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.

Input Fields

TypeDescription
emailEmail with validation
phonePhone number (optional country picker via style and defaultCountryCode)
text-singleSingle-line text
text-multiMulti-line textarea
numberNumeric input (supports min/max)
urlURL input with validation
dateGeneral date picker
date-of-birthDate of birth picker (max date = today)
timeTime picker (HH:MM)
yes-noBinary yes/no button choice
ratingStar rating (1–max stars, max defaults to 5)
currencyNumeric currency input (placeholder holds the currency symbol, default: €)
locationGeolocation capture (stores "lat,lng" string)

Selection Fields

TypeDescription
selectDropdown (supports displayStyle: default, card-icon, card-image)
radioRadio buttons (supports displayStyle)
checkbox-singleSingle checkbox (e.g. consent)
checkbox-multiMultiple checkboxes (supports displayStyle)
slideFunnel page with visual option cards (requires slideOptions)

Composite Fields

TypeDescriptionOptions
contactConfigurable contact data (name, email, phone, address)contactOptions
bank-detailsSEPA/bank details (IBAN always shown, BIC/account holder/signature configurable)bankDetailsOptions
license-plateVehicle license plate input (all countries or Germany-only)licensePlateOptions

File & Document Fields

TypeDescriptionOptions
fileFile upload (Growth+)fileFieldOptions
imageImage-only upload with optional camera capturefileFieldOptions
signatureCanvas-based e-signature (stored as base64 PNG)requireSignatureOtp
pdf-templatePDF template with drag-and-drop field placement and optional signaturepdfTemplateOptions
file-downloadDisplay-only — shows library files the respondent can downloadfileDownloadOptions

Display-Only Fields

These fields do not collect input. They are used for layout and content within forms.
TypeDescriptionNotes
headingSection headingUses label as text, headingLevel (1–6, default 2)
separatorVisual separator lineNo configuration needed
page-breakSplits form into pagesOptional title via label
info-textRich text block (Markdown/HTML)Uses label as content
info-imageImage blockUses label as the image URL
info-videoVideo embed (YouTube/Vimeo)Uses label as the video URL

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 (optionally meetingTypeUserId to target a specific user)
customPageShow localized thank-you pagecustomPageContent (optionally customFormTitle, showThankYouOnCustomPage)
externalRedirectRedirect to URLexternalRedirectLink
contactFormShow contact formcontactFormEmail
requestCallbackRequest callback via queuequeueId
instantCallStart instant video call
formRedirectRedirect to another routing form

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, lessThanOrEqual, moreThanOrEqual, containsAny, containsNone Targets: attendeeEmail, attendeeFullname, attendeeFirstname, attendeeLastname, attendeePhone, attendeePolicyAccepted, attendeeReceiveReminders, attendeeLanguage, attendeeTimezone, 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