Skip to main content

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

TypeRenders asNotes
textSingle-line inputMax length from maxLength
emailEmail inputValidated as email format
telPhone inputNo format enforcement
selectDropdownoptions array required
checkboxCheckboxBoolean value
textareaMulti-line inputOptional 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

FieldDescription
nameUnique rule identifier
matchArray 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.tripStatusOnly match against Trips with these statuses
scope.withinDaysOnly look back N days
actionreject (409 with existing Trip ID), link (create but associate), update (update existing Trip)
messageVisitor-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'