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.
| Construct | Syntax | Purpose |
|---|---|---|
| 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.
| Object | Description | Example |
|---|---|---|
contact | Contact record that triggered the event | {{contact.f_name}} |
owner | The user (loan officer) who owns the contact or loan | {{owner.email}} |
loan | The loan record associated with the trigger | {{loan.amount}} |
brand_* | Organization-level branding variables | {{brand_company_name}} |
contact.enriched.rate | Enriched rate/market data on the contact | {{contact.enriched.rate.loan_rate}} |
contact.enriched.equity | Enriched equity/property data on the contact | {{contact.enriched.equity.estimated_ltv}} |
contact.enriched.debt | Enriched debt/credit profile data on the contact | {{contact.enriched.debt.credit_score}} |
lead | The 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 case | Liquid syntax | Populated → output | Empty → 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 case | Liquid syntax | Populated → output | Empty → 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 case | Liquid syntax | Populated → output | Empty → output |
|---|---|---|---|
| Static string fallback if empty | {{owner.f_name | default: 'N/A'}} | Field = "John" → John | Field empty → N/A |
| Default to another field value | {{owner.ai_email | default: owner.email}} | ai_email = "x@b.com" → x@b.com | ai_email empty → value of owner.email |
| Default to empty string (suppress null) | {{contact.address_2 | default: ''}} | Field = "Apt 4" → Apt 4 | Field null → (empty string, not null) |
Date filters
| Pattern / use case | Liquid syntax | Populated → output | Empty → 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-time | N/A — always renders |
| Today's date | {{'today' | date: '%m/%d/%Y'}} | Renders today's date at send-time | N/A — always renders |
Date format code reference:
| Code | Meaning | Example output |
|---|---|---|
%Y | 4-digit year | 2024 |
%y | 2-digit year | 24 |
%m | Month as 2-digit number | 03 |
%B | Full month name | March |
%b | Abbreviated month name | Mar |
%d | Day of month (zero-padded) | 05 |
%e | Day of month (space-padded) | 5 |
%H | Hour in 24h format | 14 |
%I | Hour in 12h format | 02 |
%M | Minutes | 30 |
%S | Seconds | 00 |
%p | AM/PM | PM |
%A | Full weekday name | Friday |
%a | Abbreviated weekday | Fri |
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 case | Liquid syntax | Populated → output | Empty → 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" → Mike | ai 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-0100 | ai 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.
| Operator | Meaning | Example | Notes |
|---|---|---|---|
== | 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 |
contains | String 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 payloadNote: 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:
14not"14" - Booleans unquoted:
true/falsenot"true" - Strings always quoted:
"CONTACT"notCONTACT
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:
| downcaseto normalize casing - State codes:
| upcaseto ensure consistent format - Names:
| capitalizeif data entry is inconsistent - Dollar amounts:
| formatNumber: 0to 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
| Symptom | Likely cause | Fix |
|---|---|---|
| Field sends literal "OR" between values | Used plain OR text instead of {% if %} logic | Replace with {% if field_a %}...{% else %}...{% endif %} |
| Number arrives as string at destination | Value wrapped in quotes in JSON | Remove quotes: use 14 not "14" |
| Filter has no effect | Filter not supported by platform's Liquid engine | Test with a simpler filter first; consult platform docs |
| Empty string instead of expected value | Wrong field name or object not in scope for trigger | Verify field name and that the object is available in this trigger context |
| Payload rejected by connector | Liquid tag broke JSON structure | Paste 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 format | Format string uses wrong codes | Reference the date format code table above |
| Chained filters produce unexpected result | Filter order matters — executes left to right | Re-order filters; test intermediate steps individually |
| Brand fields render empty | brand_* variables not set at org level | Verify brand variables are configured in organization settings |
Quick reference card
| Pattern | Syntax |
|---|---|
| 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 tag | Description |
|---|---|
{{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 tag | Description |
|---|---|
{{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 tag | Description |
|---|---|
{{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 tag | Description |
|---|---|
{{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 tag | Description |
|---|---|
{{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 tag | Description |
|---|---|
{{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 tag | Description |
|---|---|
{{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 tag | Description |
|---|---|
{{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 prefix | Description |
|---|---|
{{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 tag | Description |
|---|---|
{{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.