Open navigation

Outbound Data Connector - Advanced Guide

The Outbound Data Connector (ODC) pushes structured JSON payloads to an external system or API whenever a trigger fires (for example, a workflow step, status change, or scheduled event). Each JSON value can be static or dynamic — dynamic values are resolved at send-time using Liquid template tags pulled from the triggering record. This guide covers the complete filter library, conditional logic, available data objects, best practices, and a full tag reference.

Liquid templating — core concepts

Liquid is an open-source templating language used to embed dynamic values into text, emails, and data payloads. The JSON payload is a template: Liquid tags act as placeholders replaced with real record data before the payload is transmitted. One connector configuration serves thousands of records.

ConstructSyntaxPurpose
Output tag{{ variable }}Renders the value of a field or expression into the output
Tag block{% logic %}Executes logic (if/else, loops, assignments) — produces no output on its own
Filter{{ variable | filter }}Transforms the output value before rendering — chained with the pipe character

Available data objects

The following top-level objects expose fields via dot notation inside your payload.

Note: Not all objects are available in every trigger context. A loan-triggered connector has loan.* fields; a contact-triggered connector may not. Verify which objects are in scope for your workflow trigger before mapping fields.

ObjectDescriptionExample
contactContact record that triggered the event{{contact.f_name}}
ownerThe user (loan officer) who owns the contact or loan{{owner.email}}
loanThe loan record associated with the trigger{{loan.amount}}
brand_*Organization-level branding variables{{brand_company_name}}
contact.enriched.rateEnriched rate/market data on the contact{{contact.enriched.rate.loan_rate}}
contact.enriched.equityEnriched equity/property data on the contact{{contact.enriched.equity.estimated_ltv}}
contact.enriched.debtEnriched debt/credit profile data on the contact{{contact.enriched.debt.credit_score}}
leadThe lead record associated with the trigger event{{lead.stage}}

Filter library

Filters transform a field value before it is output. Append them to a variable using the pipe character (|) and chain multiple filters left to right. Test each filter in your environment before relying on it in production, as platform implementations may support a subset.

String case filters

Pattern / use caseLiquid syntaxPopulated → outputEmpty → output
Uppercase all characters{{contact.state | upcase}}texas → TEXAS(empty string)
Lowercase all characters{{contact.email | downcase}}John@BANK.com → john@bank.com(empty string)
Capitalize first letter only{{contact.f_name | capitalize}}john → John(empty string)

Number and math filters

Pattern / use caseLiquid syntaxPopulated → outputEmpty → output
Format number (no decimals){{loan.amount | formatNumber: 0}}450000.75 → 450,001(empty string)
Format number (2 decimals){{loan.rate | formatNumber: 2}}6.7 → 6.70(empty string)
Round to nearest integer{{loan.amount | round}}450000.75 → 450001(empty string)
Round to N decimal places{{loan.rate | round: 3}}6.7456 → 6.746(empty string)

Default value filter

Note: The default filter is concise but does not handle all edge cases (for example, "false" or "0" may be treated as falsy by some engines). The {% if %}...{% else %} pattern is more explicit and reliable for critical fields.

Pattern / use caseLiquid syntaxPopulated → outputEmpty → output
Static string fallback if empty{{owner.f_name | default: 'N/A'}}Field = "John" → JohnField empty → N/A
Default to another field value{{owner.ai_email | default: owner.email}}ai_email = "x@b.com" → x@b.comai_email empty → value of owner.email
Default to empty string (suppress null){{contact.address_2 | default: ''}}Field = "Apt 4" → Apt 4Field null → (empty string, not null)

Date filters

Pattern / use caseLiquid syntaxPopulated → outputEmpty → output
Format a date field{{contact.close_date | date: '%B %d, %Y'}}2024-03-15 → March 15, 2024(empty string)
Short date format{{contact.close_date | date: '%m/%d/%Y'}}2024-03-15 → 03/15/2024(empty string)
ISO 8601 format{{contact.close_date | date: '%Y-%m-%d'}}March 15 2024 → 2024-03-15(empty string)
Year only{{contact.close_date | date: '%Y'}}2024-03-15 → 2024(empty string)
Month name only{{contact.close_date | date: '%B'}}2024-03-15 → March(empty string)
Current timestamp{{'now' | date: '%Y-%m-%dT%H:%M:%S'}}Renders current datetime at send-timeN/A — always renders
Today's date{{'today' | date: '%m/%d/%Y'}}Renders today's date at send-timeN/A — always renders

Date format code reference:

CodeMeaningExample output
%Y4-digit year2024
%y2-digit year24
%mMonth as 2-digit number03
%BFull month nameMarch
%bAbbreviated month nameMar
%dDay of month (zero-padded)05
%eDay of month (space-padded) 5
%HHour in 24h format14
%IHour in 12h format02
%MMinutes30
%SSeconds00
%pAM/PMPM
%AFull weekday nameFriday
%aAbbreviated weekdayFri

Conditional logic tags

Unlike filters, conditional tags control which value or content is output based on a test. They use the {% %} block syntax and must always be closed.

Note: All block tags in Liquid must be explicitly closed: {% if %} requires {% endif %}, {% unless %} requires {% endunless %}, and {% capture %} requires {% endcapture %}. Failing to include the closing tag will cause ODC payload transmission to fail.

Basic if / else

Checks if a field has a truthy value (non-null, non-empty, non-false):

"field": "{% if owner.ai_preferred_name_first %}{{owner.ai_preferred_name_first}}{% else %}{{owner.f_name}}{% endif %}"

Note: When the condition is false and no {% else %} branch is provided, the field renders as a blank string — not null. Always include an {% else %} clause for required fields to ensure a value is always sent.

Pattern / use caseLiquid syntaxPopulated → outputEmpty → output
Field A if present, else Field B{% if owner.ai_preferred_name_first %}{{owner.ai_preferred_name_first}}{% else %}{{owner.f_name}}{% endif %}ai field = "Mike" → Mikeai field empty → value of owner.f_name
Phone fallback{% if owner.ai_transfer_phone_number %}{{owner.ai_transfer_phone_number}}{% else %}{{owner.phone_cell}}{% endif %}ai field = "555-0100" → 555-0100ai field empty → value of owner.phone_cell

If / elsif / else (triple fallback)

Chain multiple conditions with elsif — evaluates top to bottom and uses the first match:

"field": "{% if owner.field_a %}{{owner.field_a}}{% elsif owner.field_b %}{{owner.field_b}}{% else %}{{owner.field_c}}{% endif %}"

Comparison operators

Note: Numeric comparisons (>, <, >=) require the field to be stored as a numeric type, not a string. Fields like loan.amount may be stored as a decimal string (for example, "480000.00"), which can cause numeric comparisons to return blank. If a comparison returns blank unexpectedly, the field may be string-typed. Use the default filter as a fallback and test in your environment before relying on comparisons in production.

OperatorMeaningExampleNotes
==Equals{% if owner.cost_center == 2 %}String and number comparison
!=Does not equal{% if owner.cost_center != 2 %}Most common for branch routing
>Greater than{% if loan.amount > 500000 %}Numeric comparison
<Less than{% if loan.amount < 100000 %}Numeric comparison
>=Greater than or equal to{% if loan.term >= 30 %}Numeric comparison
<=Less than or equal to{% if loan.rate <= 6.5 %}Numeric comparison
containsString contains substring{% if contact.state contains 'TX' %}String match — case sensitive

Boolean operators (and / or)

Combine multiple conditions in a single {% if %} using and / or:

"field": "{% if contact.state == 'TX' and loan.amount > 200000 %}Eligible{% else %}Not Eligible{% endif %}"

Unless (negative condition)

unless is the inverse of if — the block renders when the condition is false. Useful for "render this unless the field is populated":

"field": "{% unless owner.ai_preferred_name_first %}{{owner.f_name}}{% endunless %}"

Full reference payload

The following is a production-ready reference template incorporating conditional fallbacks, filters, and static values. It is designed for a contact-triggered connector with loan officer owner fields and enriched rate data. Copy this payload into your connector's Request Body field. Remove enriched.rate.* fields if your trigger context does not include rate enrichment, and verify all field names against your platform instance.

{
  "prospect_id": "{{contact.id}}",
  "owner_id": "{{contact.owner_id}}",
  "email": "{{contact.email | downcase}}",
  "phone_number": "{{contact.phone_cell}}",
  "phone_number_2": "{{contact.phone}}",
  "phone_number_3": "{{contact.phone_home}}",
  "phone_number_4": "{{contact.phone_office}}",
  "first_name": "{{contact.f_name | capitalize}}",
  "last_name": "{{contact.l_name | capitalize}}",
  "state": "{{contact.state | upcase}}",
  "zip_code": "{{contact.zip}}",
  "property_city": "{{contact.city}}",
  "loan_close_date": "{{contact.close_date | date: '%m/%d/%Y'}}",
  "created_at": "{{contact.creation_date}}",
  "lead_type": "",
  "transfer_phone_number": "{% if owner.ai_transfer_phone_number %}{{owner.ai_transfer_phone_number}}{% else %}{{owner.phone_cell}}{% endif %}",
  "transfer_first_name": "{% if owner.ai_transfer_name_first %}{{owner.ai_transfer_name_first}}{% else %}{{owner.f_name}}{% endif %}",
  "transfer_last_name": "{% if owner.ai_transfer_name_last %}{{owner.ai_transfer_name_last}}{% else %}{{owner.l_name}}{% endif %}",
  "loan_officer_first_name_phonetic": "{{owner.ai_phonetic_spelling_first}}",
  "loan_officer_last_name_phonetic": "{{owner.ai_phonetic_spelling_last}}",
  "te_loan_officer_email": "{% if owner.ai_appointment_schedule_email %}{{owner.ai_appointment_schedule_email | downcase}}{% else %}{{owner.email | downcase}}{% endif %}",
  "te_loan_officer__phone_cell": "{{owner.phone_cell}}",
  "te_loan_officer__phone_office": "{{owner.phone_office}}",
  "te_loan_officer__first_name": "{% if owner.ai_preferred_name_first %}{{owner.ai_preferred_name_first}}{% else %}{{owner.f_name}}{% endif %}",
  "te_loan_officer__last_name": "{% if owner.ai_preferred_name_last %}{{owner.ai_preferred_name_last}}{% else %}{{owner.l_name}}{% endif %}",
  "te_loan_officer__ms_booking_service_page_url": "{% if owner.ai_appointment_scheduling_link %}{{owner.ai_appointment_scheduling_link}}{% else %}{{owner.appointment_scheduling_url}}{% endif %}",
  "entity_type": "CONTACT",
  "Brand_Info": {
    "Brand_Data": "comarketer",
    "company_name": "{{ brand_company_name }}"
  },
  "loan_amount": "{{contact.enriched.rate.loan_amount | formatNumber: 0}}",
  "loan_rate": "{{contact.enriched.rate.loan_rate | formatNumber: 3 | append: '%'}}",
  "new_monthly_savings": "{{contact.enriched.rate.estimated_monthly_savings | formatNumber: 0}}",
  "new_property_value": "{{contact.enriched.rate.estimated_home_value | formatNumber: 0}}",
  "min_reengagement_days": 14
}

Best practices

Use conditional fallbacks for all owner AI fields

Do:

{% if owner.ai_preferred_name_first %}{{owner.ai_preferred_name_first}}{% else %}{{owner.f_name}}{% endif %}

Don't:

"{{owner.ai_preferred_name_first}} OR {{owner.f_name}}"  ← Sends the literal word OR in the payload

Note: This fallback pattern is not limited to AI Agent fields. Use it any time a field may be unpopulated — for example, {% if contact.phone_cell %}{{contact.phone_cell}}{% else %}{{contact.phone}}{% endif %}. This ensures the payload always contains a value even when the primary field is empty.

Match JSON data types

Note: To determine a field's data type, refer to the field descriptions in the Complete Liquid Tag Library section — Boolean fields are noted explicitly. When a field's type is unclear, treat it as a string and quote it. Use | formatNumber or arithmetic filters only after confirming the field is numeric.

  • Numbers unquoted: 14 not "14"
  • Booleans unquoted: true / false not "true"
  • Strings always quoted: "CONTACT" not CONTACT

Normalize data with filters

Note: To strip unwanted characters from phone numbers, chain multiple | remove filters: {{contact.phone_cell | remove: '-' | remove: '(' | remove: ')' | remove: ' ' | remove: '/'}}. Each character must be removed separately. This produces a digits-only string such as 5125551234.

  • Email fields: | downcase to normalize casing
  • State codes: | upcase to ensure consistent format
  • Names: | capitalize if data entry is inconsistent
  • Dollar amounts: | formatNumber: 0 to remove decimals and add commas

Validate JSON structure before saving

Liquid tags inside JSON can obscure structural errors. Paste your payload (with Liquid tags intact as strings) into a JSON linter before saving. Ensure brackets, commas, and quotes are all balanced.

Test with sparse records

The most common failure mode is the record where every AI-specific field is empty. Always test with an owner that has no ai_* fields populated to confirm fallback values render correctly.

Troubleshooting

SymptomLikely causeFix
Field sends literal "OR" between valuesUsed plain OR text instead of {% if %} logicReplace with {% if field_a %}...{% else %}...{% endif %}
Number arrives as string at destinationValue wrapped in quotes in JSONRemove quotes: use 14 not "14"
Filter has no effectFilter not supported by platform's Liquid engineTest with a simpler filter first; consult platform docs
Empty string instead of expected valueWrong field name or object not in scope for triggerVerify field name and that the object is available in this trigger context
Payload rejected by connectorLiquid tag broke JSON structurePaste into JSON linter; look for unclosed brackets or mismatched quotes
Fallback never renders{% if %} block missing {% endif %}Ensure every {% if %} has a matching {% endif %}
Date renders in wrong formatFormat string uses wrong codesReference the date format code table above
Chained filters produce unexpected resultFilter order matters — executes left to rightRe-order filters; test intermediate steps individually
Brand fields render emptybrand_* variables not set at org levelVerify brand variables are configured in organization settings

Quick reference card

PatternSyntax
Simple output{{object.field}}
Uppercase{{object.field | upcase}}
Lowercase{{object.field | downcase}}
Capitalize{{object.field | capitalize}}
Format number (no decimals){{object.field | formatNumber: 0}}
Format number (2 decimals){{object.field | formatNumber: 2}}
Append string{{object.field | append: '%'}}
Prepend string{{object.field | prepend: '+1'}}
Remove characters{{object.field | remove: '-'}}
Replace characters{{object.field | replace: '-', ''}}
Truncate to N chars{{object.field | truncate: 50}}
Default fallback (string){{object.field | default: 'N/A'}}
Default fallback (field){{object.field_a | default: object.field_b}}
Format date{{object.date_field | date: '%m/%d/%Y'}}
Today's date{{'today' | date: '%m/%d/%Y'}}
Conditional: field A or field B{% if obj.field_a %}{{obj.field_a}}{% else %}{{obj.field_b}}{% endif %}
Conditional: A or B or C{% if obj.a %}{{obj.a}}{% elsif obj.b %}{{obj.b}}{% else %}{{obj.c}}{% endif %}
Conditional static (equals){% if obj.field == 'X' %}Static A{% else %}Static B{% endif %}
Conditional static (not equals){% if obj.field != 2 %}Value A{% else %}Value B{% endif %}
Conditional (greater than){% if loan.amount > 500000 %}jumbo{% else %}conforming{% endif %}
Unless (render when empty){% unless obj.field %}fallback value{% endunless %}
Assign variable{% assign var = obj.field | upcase %} then {{var}}
Capture block{% capture var %}{{obj.f_name}} {{obj.l_name}}{% endcapture %}
Chain: divide + format{{loan.amount | divided_by: 12 | formatNumber: 0}}
Chain: default + upcase{{contact.state | default: 'N/A' | upcase}}

Complete Liquid tag library

This section provides a comprehensive reference of every available Liquid tag for use within a Total Expert Outbound Data Connector payload. Tags are organized by object and sub-object. Tag availability depends on the ODC trigger context and enabled features. Scenarios 2 and 3 of rate_quote fields (suffixed _2 and _3) follow identical patterns to Scenario 1 — substitute the scenario number.

contact — core contact fields

Available in Contact ODCs. May also be available in Loan ODCs via the primary borrower.

Liquid tagDescription
{{contact.id}}Unique internal TE identifier for the contact record.
{{contact.assigned_to}}User ID of the TE user currently assigned to this contact.
{{contact.external_id}}External/integration identifier used to match the contact in a third-party system.
{{contact.salutation}}Courtesy title (e.g., Mr., Mrs., Dr.) stored on the contact.
{{contact.title}}Professional title or job title of the contact.
{{contact.f_name}}Contact's first name.
{{contact.l_name}}Contact's last name.
{{contact.full_name}}Contact's full name as a single combined string.
{{contact.m_name}}Contact's middle name.
{{contact.m_initial}}Contact's middle initial.
{{contact.suffix}}Name suffix (e.g., Jr., Sr., III) of the contact.
{{contact.nickname}}Preferred informal name or nickname for the contact.
{{contact.email}}Primary email address for the contact.
{{contact.email_work}}Work/secondary email address for the contact.
{{contact.ok_to_email}}Boolean — contact has consented to email communications.
{{contact.address}}Primary street address line 1.
{{contact.address_2}}Street address line 2 (suite, apt, unit).
{{contact.city}}City of the contact's primary address.
{{contact.state}}State abbreviation of the contact's primary address.
{{contact.zip}}ZIP/postal code of the contact's primary address.
{{contact.ok_to_mail}}Boolean — contact has consented to direct mail.
{{contact.phone}}Primary phone number.
{{contact.phone_cell}}Cell/mobile phone number.
{{contact.phone_home}}Home phone number.
{{contact.phone_office}}Office/work phone number.
{{contact.ok_to_call}}Boolean — contact has consented to phone outreach.
{{contact.employer}}Name of the contact's current employer.
{{contact.employer_address}}Street address of the contact's employer.
{{contact.employer_city}}City where the contact's employer is located.
{{contact.employer_state}}State where the contact's employer is located.
{{contact.employer_zip}}ZIP code of the contact's employer location.
{{contact.lead_source}}Marketing or referral source that originated this contact.
{{contact.classification}}Contact classification or segment tag (e.g., Prospect, Past Client).
{{contact.creation_date}}Date and time the contact record was created in TE.
{{contact.last_modified}}Date and time the contact record was last updated.
{{contact.birthday}}Contact's date of birth.
{{contact.close_date}}Date the associated loan or transaction is expected to close or did close.
{{contact.follow_up_date}}Scheduled follow-up date set for the contact in TE.
{{contact.referred_by}}Name or source from whom this contact was referred.
{{contact.spouse_f_name}}First name of the contact's spouse.
{{contact.spouse_l_name}}Last name of the contact's spouse.
{{contact.spouse_email}}Email address of the contact's spouse.
{{contact.spouse_phone_cell}}Cell phone number of the contact's spouse.
{{contact.credit_score}}Credit score on file for the contact.
{{contact.owner_id}}TE user ID of the loan officer who owns this contact.
{{contact.owner_email}}Email address of the loan officer who owns this contact.

contact.custom — custom contact fields

Custom fields follow the pattern {{contact.custom.field_name}}. Field names must match exactly as configured in your TE instance.

contact.enriched.equity — Customer Intelligence equity fields

Populated by the Customer Intelligence (CI) feature. Requires CI to be enabled and available public records data.

Liquid tagDescription
{{contact.enriched.equity.estimated_loan_to_value}}Estimated current loan-to-value (LTV) ratio. Requires Customer Intelligence.
{{contact.enriched.equity.estimated_property_value}}Estimated current market value of the contact's property. Requires Customer Intelligence.
{{contact.enriched.equity.estimated_remaining_balance}}Estimated remaining mortgage balance. Requires Customer Intelligence.
{{contact.enriched.equity.estimated_equity_dollars}}Estimated dollar amount of equity. Requires Customer Intelligence.
{{contact.enriched.equity.estimated_equity_percentage}}Estimated equity as a percentage of property value. Requires Customer Intelligence.
{{contact.enriched.equity.change_in_ltv}}Measure of how much the contact's LTV ratio has changed over time. Requires Customer Intelligence.

contact.enriched.rate — CI Rate Alert fields

Populated by the CI Rate Alert feature. Requires Customer Intelligence and reflects mortgage monitoring data.

Liquid tagDescription
{{contact.enriched.rate.loan_rate}}Interest rate on the contact's current mortgage loan.
{{contact.enriched.rate.loan_amount | formatNumber: 0}}Original loan amount of the contact's current mortgage (formatted).
{{contact.enriched.rate.loan_monthly_payment | formatNumber: 0}}Current monthly P&I payment (formatted).
{{contact.enriched.rate.current_market_rate}}Current market interest rate for a comparable loan, per MMI data.
{{contact.enriched.rate.rate_reduction}}Estimated rate reduction the contact could achieve by refinancing.
{{contact.enriched.rate.estimated_new_monthly_payment | formatNumber: 0}}Estimated new monthly payment if the contact refinanced (formatted).
{{contact.enriched.rate.estimated_monthly_savings | formatNumber: 0}}Estimated monthly savings if the contact refinanced (formatted).
{{contact.enriched.rate.estimated_3_year_savings | formatNumber: 0}}Estimated total savings over 3 years if refinanced (formatted).
{{contact.enriched.rate.estimated_5_year_savings | formatNumber: 0}}Estimated total savings over 5 years if refinanced (formatted).
{{contact.enriched.rate.estimated_home_value | formatNumber: 0}}Estimated current home value used in CI rate calculations (formatted).
{{contact.enriched.rate.estimated_ltv}}Estimated LTV ratio of the contact's current mortgage.

contact.enriched.debt — Debt Enrichment fields

Requires Debt Enrichment. Use | formatNumber: 0 for dollar amounts and | formatNumber: 2 for rates.

Liquid tagDescription
{{contact.enriched.debt.credit_score}}Credit score from debt enrichment data.
{{contact.enriched.debt.income_est}}Estimated annual income for the contact.
{{contact.enriched.debt.dti_ratio}}Estimated debt-to-income (DTI) ratio.
{{contact.enriched.debt.auto_bal}}Current outstanding auto loan balance.
{{contact.enriched.debt.ttl_bal_open_trds}}Total balance across all open tradelines.
{{contact.enriched.debt.ttl_bal_open_rev_trds}}Total balance across all open revolving tradelines (including HELOCs).
{{contact.enriched.debt.ttl_bal_open_rev_trds_no_heloc}}Total balance across open revolving tradelines excluding HELOCs.
{{contact.enriched.debt.ttl_bal_open_stuloan_trds}}Total balance across open student loan tradelines.
{{contact.enriched.debt.mtg_curr_bal}}Current outstanding balance on the contact's mortgage.
{{contact.enriched.debt.mtg_rate}}Interest rate on the contact's existing mortgage.
{{contact.enriched.debt.ttl_bal_open_mtg_trds}}Total balance across all open mortgage tradelines.
{{contact.enriched.debt.ttl_mon_payment_open_mtg_trds}}Total monthly payment across all open mortgage tradelines.

owner — loan officer / user fields

Available across Contact, Loan, and User ODCs.

Liquid tagDescription
{{owner.email}}Primary email address of the loan officer.
{{owner.username}}TE username/login of the loan officer.
{{owner.user_id}}Unique TE internal identifier for the loan officer.
{{owner.f_name}}First name of the loan officer.
{{owner.l_name}}Last name of the loan officer.
{{owner.phone_cell}}Cell/mobile phone number.
{{owner.phone_office}}Office phone number.
{{owner.company}}Company/organization name the loan officer is associated with.
{{owner.address}}Street address line 1 of the loan officer.
{{owner.city}}City of the loan officer's address.
{{owner.state}}State of the loan officer's address.
{{owner.zipcode}}ZIP code of the loan officer's address.
{{owner.cost_center}}Cost center code associated with the loan officer.
{{owner.location_id}}Branch or location identifier assigned to the loan officer.
{{owner.application_url}}URL to the loan officer's online loan application.
{{owner.appointment_scheduling_url}}URL to the loan officer's appointment scheduling page.
{{owner.profile_image}}URL to the loan officer's profile/headshot image.
{{owner.agent_bio}}Biographical text for the loan officer.
{{owner.disclaimer}}Legal disclaimer text associated with the loan officer's profile.
{{owner.team_name}}Name of the team the loan officer belongs to.
{{owner.role_name}}TE role name assigned to the loan officer.
{{owner.social_facebook}}URL to the loan officer's Facebook profile or page.
{{owner.social_linkedin}}URL to the loan officer's LinkedIn profile.
{{owner.reviews_google}}URL to the loan officer's Google reviews page.
{{owner.reviews_zillow}}URL to the loan officer's Zillow reviews page.

owner.ai_* — AI Agent fields

Populated only when the loan officer has the AI Agent feature enabled in TE. Always use conditional fallback logic when referencing these fields.

Liquid tagDescription
{{owner.ai_preferred_name_first}}AI Agent preferred first name.
{{owner.ai_preferred_name_last}}AI Agent preferred last name.
{{owner.ai_phonetic_spelling_first}}Phonetic spelling of the loan officer's first name used by the AI agent.
{{owner.ai_phonetic_spelling_last}}Phonetic spelling of the loan officer's last name used by the AI agent.
{{owner.ai_transfer_name_first}}First name of the person calls should be transferred to by the AI agent.
{{owner.ai_transfer_name_last}}Last name of the person calls should be transferred to by the AI agent.
{{owner.ai_transfer_phone_number}}Primary phone number for AI agent call transfers.
{{owner.ai_transfer_phone_number_2}}Secondary/backup phone number for AI agent call transfers.
{{owner.ai_appointment_scheduling_link}}Scheduling link used by the AI agent for booking appointments.
{{owner.ai_appointment_schedule_email}}Email address the AI agent uses for appointment scheduling confirmations.
{{owner.ai_timezone}}Timezone used by the AI agent for scheduling and time-aware responses.

loan — core loan fields

Available in Loan ODCs. Exposes data from the loan record that triggered the event.

Liquid tagDescription
{{loan.external_id}}External/integration identifier for the loan record (e.g., LOS loan number).
{{loan.loan_number}}Lender or LOS-assigned loan number.
{{loan.amount}}Total loan amount (principal).
{{loan.rate}}Interest rate of the loan.
{{loan.term}}Loan term in months or years.
{{loan.loan_purpose}}Purpose of the loan (Purchase, Refinance, Cash-Out Refinance, and so on).
{{loan.loan_type}}Loan type classification (Conventional, FHA, VA, USDA, Jumbo, and so on).
{{loan.loan_status}}Current milestone or pipeline status of the loan in TE.
{{loan.loan_program}}Loan program name (e.g., HomeReady, Jumbo, USDA Rural).
{{loan.purchase_price}}Purchase price of the property for a purchase loan.
{{loan.appraised_value}}Appraised value of the property.
{{loan.address_1}}Street address line 1 of the property associated with the loan.
{{loan.city}}City of the loan's subject property.
{{loan.state}}State of the loan's subject property.
{{loan.zip}}ZIP code of the loan's subject property.
{{loan.property_type}}Property type (e.g., Single Family, Condo, Multi-Family).
{{loan.occupancy}}Occupancy type (Primary Residence, Second Home, Investment Property).
{{loan.loan_to_value}}Loan-to-value (LTV) ratio.
{{loan.debt_to_income}}Debt-to-income (DTI) ratio for the borrower.
{{loan.monthly_pi_payment}}Monthly principal and interest (P&I) payment.
{{loan.lock_status}}Current rate lock status (e.g., Locked, Floating, Expired).
{{loan.is_first_time_buyer}}Boolean — borrower is a first-time homebuyer. Do not quote in JSON.
{{loan.escrow_waived}}Boolean — escrow/impound account has been waived. Do not quote in JSON.
{{loan.channel}}Origination channel (e.g., Retail, Wholesale, Correspondent).
{{loan.owner_id}}TE user ID of the loan officer who owns the loan record.
{{loan.owner_email}}Email address of the loan officer who owns this loan.

loan — date fields

Format with the date filter (for example, | date: '%m/%d/%Y') before including in payloads that expect a formatted date string.

Liquid tagDescription
{{loan.application_date}}Date the loan application was submitted.
{{loan.approval_date}}Date the loan received conditional or full approval.
{{loan.closing_date}}Actual closing date of the loan.
{{loan.closing_date_estimated}}Estimated closing date used during the loan process.
{{loan.ctc_date}}Clear-to-close (CTC) date — when final underwriting approval was granted.
{{loan.funded_date}}Date the loan was funded/disbursed.
{{loan.lock_date}}Date the interest rate was locked.
{{loan.lock_expire_date}}Date the rate lock expires.
{{loan.first_payment_date}}Date the first mortgage payment is due.
{{loan.pre_approval_issued_date}}Date the pre-approval letter was issued to the borrower.
{{loan.pre_approval_expiration_date}}Expiration date of the pre-approval letter.
{{loan.underwriting_submission_date}}Date the loan was submitted to underwriting.
{{loan.underwriting_approval_date}}Date underwriting approval was received.
{{loan.created_date}}Date the loan record was created in TE.

loan.[participant] — loan participant contact fields

Each loan participant is a contact record accessible via a participant-role prefix. Every participant supports the same field set as the core contact object. Example: {{loan.borrower.f_name}}, {{loan.buyers_agent.email}}, {{loan.coborrower.credit_score}}.

Participant prefixDescription
{{loan.borrower.*}}Primary borrower on the loan. Supports full contact field set including CI enriched rate fields.
{{loan.coborrower.*}}Co-borrower on the loan. Supports the same full contact field set.
{{loan.buyers_agent.*}}Buyer's real estate agent. Supports the full contact field set plus custom fields.
{{loan.sellers_agent.*}}Seller's real estate agent. Supports the full contact field set plus custom fields.
{{loan.attorney.*}}Attorney associated with the loan. Supports the full contact field set.
{{loan.settlement_agent.*}}Settlement or title agent. Supports the full contact field set.

lead — lead record fields

Available in Lead ODCs. Boolean fields (already_found_home, first_time_buyer, veteran) render as true or false — do not quote them in JSON payloads.

Liquid tagDescription
{{lead.stage}}Current pipeline stage of the lead record in TE.
{{lead.referred_by}}Name or source that referred the lead.
{{lead.loan_purpose}}Stated loan purpose (e.g., Purchase, Refinance, Cash-Out Refinance).
{{lead.loan_amount}}Loan amount requested by the lead.
{{lead.property_address}}Property address associated with the lead inquiry.
{{lead.property_type}}Property type (e.g., Single Family, Condo, Multi-Family).
{{lead.occupancy}}Occupancy intent (Primary Residence, Second Home, Investment Property).
{{lead.estimated_purchase_price}}Estimated purchase price entered by or for the lead.
{{lead.down_payment}}Down payment amount or percentage.
{{lead.desired_timeframe}}Desired timeframe for the transaction (e.g., Immediately, 3–6 Months).
{{lead.created_date}}Date the lead record was created in TE.
{{lead.already_found_home}}Boolean — the lead has already identified a property.
{{lead.first_time_buyer}}Boolean — the lead is a first-time homebuyer.
{{lead.veteran}}Boolean — the lead is a veteran or active military.
{{lead.assignee}}The TE user currently assigned to the lead.
{{lead.all_lead_ids}}Comma-separated list of all lead IDs associated with this contact record.

For questions about configuring the Outbound Data Connector or troubleshooting a specific payload, contact your Total Expert implementation team or submit a support request.

Did you find it helpful? Yes No

Send feedback
Sorry we couldn't be helpful. Help us improve this article with your feedback.