Master Airtable formulas with practical examples and advanced techniques.
Airtable formulas unlock powerful automation and calculations. This comprehensive guide covers everything from basics to advanced techniques.
{Field Name}SUM(), IF(), CONCATENATE()'text' or "text"// for single line or /* */ for multi-lineCONCATENATE() - Combine text
CONCATENATE({First Name}, ' ', {Last Name})
// Result: "John Smith"
CONCATENATE({First Name}, ' ', {Last Name})
// Result: "John Smith"
UPPER() / LOWER() - Change case
UPPER({Email})
// Result: "[email protected]"
UPPER({Email})
// Result: "[email protected]"
LEFT() / RIGHT() / MID() - Extract text
LEFT({Phone}, 3)
// Result: "555" from "555-1234"
MID({Product Code}, 4, 2)
// Extract 2 characters starting at position 4
LEFT({Phone}, 3)
// Result: "555" from "555-1234"
MID({Product Code}, 4, 2)
// Extract 2 characters starting at position 4
FIND() / SEARCH() - Locate text
FIND('@', {Email})
// Returns position of @ symbol
FIND('@', {Email})
// Returns position of @ symbol
SUBSTITUTE() - Replace text
SUBSTITUTE({Phone}, '-', '')
// Remove dashes from phone number
SUBSTITUTE({Phone}, '-', '')
// Remove dashes from phone number
Basic Math
{Price} * {Quantity}
{Revenue} - {Costs}
{Total} / {Count}
{Price} * {Quantity}
{Revenue} - {Costs}
{Total} / {Count}
ROUND() / CEILING() / FLOOR()
ROUND({Price}, 2)
// Round to 2 decimal places
CEILING({Quantity} / 12)
// Round up to nearest dozen
ROUND({Price}, 2)
// Round to 2 decimal places
CEILING({Quantity} / 12)
// Round up to nearest dozen
SUM() / AVERAGE() / MAX() / MIN()
SUM({Price}, {Tax}, {Shipping})
// Add multiple fields
AVERAGE({Q1 Revenue}, {Q2 Revenue}, {Q3 Revenue}, {Q4 Revenue})
SUM({Price}, {Tax}, {Shipping})
// Add multiple fields
AVERAGE({Q1 Revenue}, {Q2 Revenue}, {Q3 Revenue}, {Q4 Revenue})
IF() - Conditional logic
IF({Status} = 'Complete', '✅', '⏳')
// Show checkmark if complete, hourglass otherwise
IF({Status} = 'Complete', '✅', '⏳')
// Show checkmark if complete, hourglass otherwise
Nested IF()
IF({Score} >= 90, 'A',
IF({Score} >= 80, 'B',
IF({Score} >= 70, 'C',
IF({Score} >= 60, 'D', 'F'))))
IF({Score} >= 90, 'A',
IF({Score} >= 80, 'B',
IF({Score} >= 70, 'C',
IF({Score} >= 60, 'D', 'F'))))
AND() / OR() / NOT()
IF(AND({Status} = 'Approved', {Budget} > 0), 'Proceed', 'Wait')
IF(OR({Priority} = 'High', {Urgent} = TRUE), '🔴', '🟢')
IF(AND({Status} = 'Approved', {Budget} > 0), 'Proceed', 'Wait')
IF(OR({Priority} = 'High', {Urgent} = TRUE), '🔴', '🟢')
SWITCH() - Multiple conditions
SWITCH({Status},
'New', '🆕',
'In Progress', '⏳',
'Complete', '✅',
'Cancelled', '❌',
'❓')
SWITCH({Status},
'New', '🆕',
'In Progress', '⏳',
'Complete', '✅',
'Cancelled', '❌',
'❓')
TODAY() / NOW()
TODAY()
// Current date
NOW()
// Current date and time
TODAY()
// Current date
NOW()
// Current date and time
DATETIME_DIFF() - Calculate difference
DATETIME_DIFF({Due Date}, TODAY(), 'days')
// Days until deadline
DATETIME_DIFF({End Date}, {Start Date}, 'hours')
// Project duration in hours
DATETIME_DIFF({Due Date}, TODAY(), 'days')
// Days until deadline
DATETIME_DIFF({End Date}, {Start Date}, 'hours')
// Project duration in hours
DATETIME_FORMAT() - Format dates
DATETIME_FORMAT({Created}, 'MMMM D, YYYY')
// Result: "January 15, 2026"
DATETIME_FORMAT({Meeting Time}, 'h:mm A')
// Result: "2:30 PM"
DATETIME_FORMAT({Created}, 'MMMM D, YYYY')
// Result: "January 15, 2026"
DATETIME_FORMAT({Meeting Time}, 'h:mm A')
// Result: "2:30 PM"
DATEADD() - Add/subtract time
DATEADD({Start Date}, 30, 'days')
// Add 30 days to start date
DATEADD({Due Date}, -3, 'days')
// 3 days before due date
DATEADD({Start Date}, 30, 'days')
// Add 30 days to start date
DATEADD({Due Date}, -3, 'days')
// 3 days before due date
ARRAYJOIN() - Combine linked values
ARRAYJOIN({Tags}, ', ')
// Result: "Marketing, Sales, Product"
ARRAYJOIN({Tags}, ', ')
// Result: "Marketing, Sales, Product"
ARRAYUNIQUE() - Remove duplicates
ARRAYUNIQUE({Categories})
ARRAYUNIQUE({Categories})
ARRAYFLATTEN() - Flatten nested arrays
ARRAYFLATTEN({Nested Field})
ARRAYFLATTEN({Nested Field})
REGEX_MATCH() - Test pattern
REGEX_MATCH({Email}, '@company\.com$')
// TRUE if email ends with @company.com
REGEX_MATCH({Email}, '@company\.com$')
// TRUE if email ends with @company.com
REGEX_EXTRACT() - Extract pattern
REGEX_EXTRACT({Text}, '\d{3}-\d{4}')
// Extract phone number pattern
REGEX_EXTRACT({Text}, '\d{3}-\d{4}')
// Extract phone number pattern
REGEX_REPLACE() - Replace pattern
REGEX_REPLACE({Phone}, '[^0-9]', '')
// Remove all non-numeric characters
REGEX_REPLACE({Phone}, '[^0-9]', '')
// Remove all non-numeric characters
Weighted Average
({Score1} * {Weight1} + {Score2} * {Weight2} + {Score3} * {Weight3}) /
({Weight1} + {Weight2} + {Weight3})
({Score1} * {Weight1} + {Score2} * {Weight2} + {Score3} * {Weight3}) /
({Weight1} + {Weight2} + {Weight3})
Percentage Change
IF({Previous Value} = 0, 0,
ROUND(({Current Value} - {Previous Value}) / {Previous Value} * 100, 1) & '%')
IF({Previous Value} = 0, 0,
ROUND(({Current Value} - {Previous Value}) / {Previous Value} * 100, 1) & '%')
Compound Interest
{Principal} * POWER(1 + {Rate}, {Years})
{Principal} * POWER(1 + {Rate}, {Years})
IF({Completion %} = 100, '✅ Complete',
IF(DATETIME_DIFF({Deadline}, TODAY(), 'days') < 0, '🔴 Overdue',
IF(DATETIME_DIFF({Deadline}, TODAY(), 'days') < 7, '🟡 Due Soon',
'🟢 On Track')))
IF({Completion %} = 100, '✅ Complete',
IF(DATETIME_DIFF({Deadline}, TODAY(), 'days') < 0, '🔴 Overdue',
IF(DATETIME_DIFF({Deadline}, TODAY(), 'days') < 7, '🟡 Due Soon',
'🟢 On Track')))
IF(
AND(
FIND('@', {Email}) > 0,
FIND('.', {Email}) > FIND('@', {Email}),
LEN({Email}) > 5
),
'✅ Valid',
'❌ Invalid'
)
IF(
AND(
FIND('@', {Email}) > 0,
FIND('.', {Email}) > FIND('@', {Email}),
LEN({Email}) > 5
),
'✅ Valid',
'❌ Invalid'
)
IF({Title},
CONCATENATE({Title}, ' ', {First Name}, ' ', {Last Name}),
CONCATENATE({First Name}, ' ', {Last Name}))
IF({Title},
CONCATENATE({Title}, ' ', {First Name}, ' ', {Last Name}),
CONCATENATE({First Name}, ' ', {Last Name}))
{Monthly Revenue} * (12 - MONTH(TODAY()) + 1) + {YTD Revenue}
{Monthly Revenue} * (12 - MONTH(TODAY()) + 1) + {YTD Revenue}
Cause: Invalid syntax or data type mismatch Solution: Check field references and data types
Cause: Field is empty or formula returns empty string Solution: Add error handling with IF(field, formula, 'default')
Cause: Field references itself directly or indirectly Solution: Restructure formulas to break the loop
Mastering Airtable formulas transforms your bases from simple databases into powerful automation engines. Start with basic functions, gradually incorporate advanced techniques, and always test with sample data.
Need help building complex formulas for your base? Contact our team [blocked] for expert assistance.