enquiries.yaml reference
enquiries.yaml is the main configuration file for Edge Webforms. It lives at tenants/{tenant}/enquiries.yaml in the configuration repository and controls form fields, branding, dedup rules, scoring, routing, and multi-brand behaviour.
Top-level structure
tenant_id: meridian
feature: edge-enquiries
version: "1.0"
branding:
# Logo, colors, fonts — see Branding below
form:
# Form fields, labels, validation — see Form Fields below
dedup:
# Duplicate submission rules — see Dedup Rules below
intelligence:
# Scoring, tiers, routing (optional) — see Intelligence below
brands:
# Multi-brand overrides — see Brands below
tracker:
# Visitor tracking (optional) — see Tracker below
Branding
Controls the visual appearance of the embeddable form (Option 1). Not used when the customer hosts their own form (Option 2).
branding:
name: Meridian Travel Co.
colors:
primary: '#056F82'
accent: '#F18525'
background: '#FFFFFF'
text: '#333333'
fonts:
heading: 'Georgia, serif'
body: "'Open Sans', sans-serif"
urls:
- 'https://fonts.googleapis.com/css2?family=Open+Sans:wght@300;400;600;700&display=swap'
logo_url: 'https://example.com/logo.png'
powered_by: true
Form fields
Fields are organised into sections (contact and trip). Each field has a key (the name in the JSON payload), a label, a type, and optional validation.
form:
title: Plan Your Journey
subtitle: Tell us about your travel plans
submit_label: Submit Enquiry
success_message: Thank you! We'll be in touch within 24 hours.
fields:
contact:
- { key: firstName, label: "First Name", type: text, required: true }
- { key: lastName, label: "Last Name", type: text, required: true }
- { key: email, label: "Email Address", type: email, required: true }
- { key: phone, label: "Phone Number", type: tel, required: false }
- key: isTradeEnquiry
label: I am a travel agent enquiring on behalf of a client
type: checkbox
required: false
- key: travelAgencyName
label: Travel Agency Name
type: text
required: false
show_when: "isTradeEnquiry == true"
- key: agentAccreditationNumber
label: IATA / Accreditation Number
type: text
required: false
show_when: "isTradeEnquiry == true"
trip:
- key: readyToBook
label: Are you ready to book?
type: select
required: true
options:
- "Yes"
- "Still exploring options"
- key: bestTimeToCall
label: Best time to call
type: select
required: false
# ... additional trip fields
Supported field types
| Type | Renders as | Notes |
|---|---|---|
text | Single-line input | Max length from maxLength |
email | Email input | Validated as email format |
tel | Phone input | No format enforcement |
select | Dropdown | options array required |
checkbox | Checkbox | Boolean value |
textarea | Multi-line input | Optional placeholder |
Conditional visibility
Use show_when to show a field only when a condition is met:
- key: travelYearOther
label: Please specify
type: text
show_when: "travelYear == 'Other'"
Supported operators: ==, != , == true, == false.
Dedup rules
Configurable duplicate-detection rules that query Salesforce before creating a Trip.
dedup:
enabled: true
rules:
- name: same-email-same-tour
match:
- { field: email, operator: exact }
- { field: selectedTourTier, operator: exact }
scope:
tripStatus: [Enquiry, Qualification]
withinDays: 30
action: reject
message: "You've already submitted an enquiry for this tour."
- name: same-email-recent
match:
- { field: email, operator: exact }
scope:
tripStatus: [Enquiry, Qualification]
withinDays: 7
action: link
Rule fields
| Field | Description |
|---|---|
name | Unique rule identifier |
match | Array of conditions. operator: exact (field value must match) or not_empty (field must be non-blank). optional: true skips the condition if the submission field is empty. |
scope.tripStatus | Only match against Trips with these statuses |
scope.withinDays | Only look back N days |
action | reject (409 with existing Trip ID), link (create but associate), update (update existing Trip) |
message | Visitor-facing message returned with a reject action |
Rules are evaluated in order; the first match wins.
Intelligence (scoring and routing)
Optional. When enabled, every submission is scored and assigned a priority tier before the Trip is written to Salesforce.
intelligence:
enabled: true # set to false to disable scoring
scoring:
rules:
- name: ready-to-book-today
when: "readyToBook == 'Yes' && bestTimeToCall.startsWith('Today')"
score: 60
tags: [standard, call-today]
tiers:
- name: Urgent
minScore: 100
requiredTags: [urgent]
- name: Standard
minScore: 0
requiredTags: [standard]
routing:
enabled: true
defaultQueue: "Sales Enquiries"
priorityTours: []
quickQuoteTours: []
rules:
- tier: Urgent
queue: urgent
sla: 1h
taskTemplate: "URGENT — {firstName} {lastName}"
taskPriority: High
writebackFields:
tier: Enquiry_Priority_Tier__c
score: Enquiry_Priority_Score__c
tags: Enquiry_Score_Tags__c
routing_queue: Enquiry_Routing_Queue__c
sla_target: Enquiry_SLA_Target__c
ai:
enabled: false
Ask your Kaptio implementation team for the full scoring model reference if you are implementing custom rules beyond the examples above.
Brands
Multi-brand tenants define per-brand overrides. The originSite field in the submission payload selects the brand.
brands:
brand_uk:
origin_site: BrandUK
channel: UK Direct
brand_us:
origin_site: BrandUS
channel: US Direct
branding:
name: Brand US
colors:
primary: '#1a3a5c'