Contents

Chapter 1

Airtable Base Import Guide

How to set up each template base in your Airtable workspace, import seed data, and configure automations.


Prerequisites

  • An Airtable account (free tier works for most templates)
  • This template pack downloaded and unzipped
  • 10–15 minutes per base for initial setup

Step 1: Create a New Base

1. Open airtable.com and go to your workspace

2. Click "+ Add a base""Start from scratch"

3. Name the base to match the template (e.g., "CRM", "Project Tracker", "Inventory Management")

4. Delete the default table — you'll create tables from the schema

Step 2: Understand the Schema Files

Each schema file in schemas/ defines the complete structure of one base. Here's how to read them:

schemas/01-crm.json
├── tables[]
│   ├── name: "Contacts"
│   ├── fields[]
│   │   ├── name: "Email"
│   │   ├── type: "email"
│   │   └── description: "Primary contact email"
│   └── views[]
│       ├── name: "All Contacts"
│       └── type: "grid"

Field type mapping — Airtable field types used in schemas:

Schema TypeAirtable FieldSetup Notes
singleLineTextSingle line textDefault field type
emailEmailValidates email format
phoneNumberPhoneFormats automatically
numberNumberSet decimal precision as noted
currencyCurrencySet currency symbol in field config
percentPercentDisplays as percentage
dateDateUse ISO format (YYYY-MM-DD)
dateTimeDate with timeIncludes time component
singleSelectSingle selectCreate options as listed in schema
multipleSelectsMultiple selectCreate options as listed in schema
multilineTextLong textSupports rich text if enabled
checkboxCheckboxBoolean true/false
urlURLValidates URL format
ratingRatingSet max stars as noted
durationDurationSet format (h:mm or h:mm:ss)
linkedRecordLink to another recordLinks between tables
formulaFormulaEnter formula from schema
rollupRollupConfigure linked field + aggregation
lookupLookupPull field from linked record
autoNumberAuto numberAutomatic sequential ID
attachmentAttachmentFile uploads

Step 3: Create Tables and Fields

For each table in the schema file:

1. Create the table: Click "+" next to your last table tab

2. Rename the default field: The first field is always the primary field — rename it to match the schema's first field

3. Add fields in order: Click "+" at the end of the field headers

  • Select the correct field type
  • Set the field name exactly as specified
  • Configure options (for select fields, add each option listed in the schema)
  • Add the description from the schema (click the field header → "Edit field" → "Add a description")

4. Set up linked record fields: These create relationships between tables

  • Choose "Link to another record"
  • Select the target table
  • Airtable automatically creates the reciprocal link in the target table

5. Create views: After all fields are set up, create the views listed in the schema

  • Grid views: Apply filters and sorts as described
  • Kanban views: Choose the grouping field (usually a Status or Stage field)
  • Calendar views: Choose the date field
  • Gallery views: Choose the cover field

Pro Tips for Faster Setup

  • Duplicate similar fields: Right-click a field header → "Duplicate field", then adjust the name and options
  • Batch-create select options: When setting up a single-select field, paste all options at once (one per line)
  • Use field descriptions: They show up as tooltips when hovering over field headers — very helpful for team members

Step 4: Import Seed Data

Seed data CSVs are in the seed-data/ folder. Each CSV corresponds to one table in a base.

CSV-to-Base Mapping

CSV FileTarget BaseTarget Table
crm-contacts.csvCRMContacts
crm-deals.csvCRMDeals
project-tasks.csvProject TrackerTasks
inventory-items.csvInventory ManagementProducts
content-calendar-posts.csvContent CalendarPosts
hiring-candidates.csvHiring PipelineCandidates

Import Process

1. Open the target table in your base

2. Click the down arrow next to the table name → "Import data""CSV file"

3. Select the matching CSV file

4. Airtable will preview the import — verify:

  • Column headers match your field names
  • Data types are detected correctly
  • No encoding issues with special characters

5. Click "Import"

Post-Import Cleanup

After importing, you may need to:

  • Fix field types: CSV imports sometimes create text fields instead of select fields. Convert them:
  • Click the field header → "Customize field type"
  • Change from "Single line text" to "Single select"
  • Airtable will auto-create options from existing values
  • Re-link records: CSV imports can't create linked records automatically. To link records:

1. Make sure both tables exist with data

2. Create the linked record field in the source table

3. Manually link the first few records, or use Airtable's "Suggested links" feature

  • Recalculate formulas: Formula fields will auto-calculate once the source fields have data
  • Verify select options: Imported select values may need their colors assigned. Click any option to set a color

Step 5: Configure Automations

See automations/automation-blueprints.md for step-by-step automation setup instructions for each base.

Quick reference for the most common automations:

AutomationTriggerAction
New lead notificationRecord created in ContactsSend email to sales team
Overdue task alertDate passes on Due Date fieldSend Slack/email notification
Low stock warningQuantity falls below Reorder PointCreate record in Orders table
Stage change updateStatus field changesSend notification + log activity

Step 6: Invite Your Team

1. Click "Share" in the top-right of the base

2. Choose permission level:

  • Creator: Can modify schema (fields, tables, views)
  • Editor: Can add/edit records but not change schema
  • Commenter: Can view and comment only
  • Read only: View access only

3. Send invite link or enter email addresses

Troubleshooting

"Field type mismatch" on import

The CSV has values that don't match the field type. Fix: Import as text first, then convert the field type afterward.

Linked records not connecting

Linked record fields require both tables to exist first. Create all tables before setting up links, then import data.

Formula fields showing errors

Formulas depend on other fields existing and having data. Verify the referenced fields exist with the exact names used in the formula.

Select field options not matching

Option names are case-sensitive. "In Progress" and "in progress" are different options. Standardize casing before import.

Base exceeds free tier limits

Free Airtable accounts allow 1,200 records per base and 2GB attachments. The seed data CSVs are well within this limit, but your production data may not be. Consider Airtable Plus or Pro for larger datasets.


If you're setting up multiple bases, this order minimizes rework:

1. CRM (standalone, no dependencies)

2. Project Tracker (standalone)

3. Inventory Management (standalone)

4. Content Calendar (standalone, or link to CRM contacts as authors)

5. Hiring Pipeline (standalone)

6. Expense Tracker (standalone, or link to Project Tracker for project-based expenses)

7. Product Roadmap (optionally link to Project Tracker)

8. Customer Feedback (optionally link to CRM)

9. Event Planner (standalone)

10. Knowledge Base (standalone, benefits from all other bases being populated)


*Need help? Contact support@datanest.dev*

Chapter 2

Airtable Formulas Cheatsheet

A quick reference for every formula used in the business templates, plus general-purpose formulas you'll use constantly.


How Airtable Formulas Work

Airtable formulas are similar to Excel/Sheets formulas but with some key differences:

  • Field names go in curly braces: {Field Name}
  • String concatenation uses &: {First} & " " & {Last}
  • Dates require date functions, not arithmetic
  • Formulas return a single value (text, number, or date) — they can't modify other records

Formulas Used in These Templates

CRM Base

Full Name — Combines first and last name fields:

{First Name} & " " & {Last Name}

Days Since Last Contact — How stale is this relationship:

DATETIME_DIFF(NOW(), {Last Contact}, 'days')

Deal Aging — Days since deal was created:

DATETIME_DIFF(NOW(), {Created Date}, 'days')

Weighted Pipeline Value — Deal value adjusted by close probability:

{Value} * {Probability} / 100

Contact Health Score — Simple engagement indicator:

IF(
  DATETIME_DIFF(NOW(), {Last Contact}, 'days') < 7, "Hot",
  IF(
    DATETIME_DIFF(NOW(), {Last Contact}, 'days') < 30, "Warm",
    IF(
      DATETIME_DIFF(NOW(), {Last Contact}, 'days') < 90, "Cool",
      "Cold"
    )
  )
)

Project Tracker Base

Days Until Due — Countdown to deadline:

DATETIME_DIFF({Due Date}, NOW(), 'days')

Is Overdue — Boolean flag for overdue tasks:

IF(
  AND({Status} != "Complete", IS_BEFORE({Due Date}, NOW())),
  "Overdue",
  ""
)

Time Estimation Accuracy — How close was the estimate:

IF(
  {Actual Hours} > 0,
  ROUND(({Actual Hours} - {Estimated Hours}) / {Estimated Hours} * 100, 1) & "%",
  ""
)

Progress Summary — Compact status for dashboards:

{Status} & " | " & IF({Days Until Due} > 0, {Days Until Due} & "d left", ABS({Days Until Due}) & "d overdue")

Inventory Management Base

Stock Value — Total value of current inventory:

{Quantity On Hand} * {Unit Cost}

Margin Percentage — Profit margin per item:

ROUND(({Sell Price} - {Unit Cost}) / {Sell Price} * 100, 1)

Reorder Status — Should you reorder:

IF(
  {Quantity On Hand} = 0, "OUT OF STOCK",
  IF(
    {Quantity On Hand} <= {Reorder Point}, "REORDER NOW",
    IF(
      {Quantity On Hand} <= {Reorder Point} * 1.5, "Running Low",
      "OK"
    )
  )
)

Days of Stock Remaining — Based on average daily sales (set {Avg Daily Sales} manually or via rollup):

IF({Avg Daily Sales} > 0, ROUND({Quantity On Hand} / {Avg Daily Sales}, 0), 999)

Hiring Pipeline Base

Days in Current Stage — Time spent in current hiring stage:

DATETIME_DIFF(NOW(), {Stage Changed Date}, 'days')

Pipeline Velocity — Days from application to current stage:

DATETIME_DIFF(NOW(), {Applied Date}, 'days')

Compensation Status — Is the ask within budget:

IF(
  {Salary Expectation} <= {Budget Max},
  IF({Salary Expectation} >= {Budget Min}, "Within Range", "Below Range"),
  "Over Budget by " & DOLLAR({Salary Expectation} - {Budget Max})
)

Expense Tracker Base

Monthly Total — Formatted monthly spend:

DOLLAR({Amount})

Budget Remaining — Percentage of budget used:

IF(
  {Budget} > 0,
  ROUND((1 - {Spent} / {Budget}) * 100, 1) & "% remaining",
  "No budget set"
)

Over Budget Flag — Visual indicator:

IF({Spent} > {Budget}, "OVER by " & DOLLAR({Spent} - {Budget}), "OK")

Content Calendar Base

Days Until Publish — Countdown to publish date:

IF(
  {Status} = "Published", "Published",
  IF(
    IS_BEFORE({Publish Date}, NOW()), "Overdue",
    DATETIME_DIFF({Publish Date}, NOW(), 'days') & " days"
  )
)

Content Length Category — Bucketing by character count:

IF(
  {Character Count} > 3000, "Long Form",
  IF({Character Count} > 1000, "Standard", "Short")
)

General-Purpose Formulas

These work in any Airtable base. Copy-paste and replace field names.

Text Manipulation

Capitalize first letter:

UPPER(LEFT({Name}, 1)) & MID({Name}, 2, LEN({Name}))

Extract domain from email:

MID({Email}, FIND("@", {Email}) + 1, LEN({Email}))

Create initials:

UPPER(LEFT({First Name}, 1)) & UPPER(LEFT({Last Name}, 1))

Truncate with ellipsis (for dashboard views):

IF(LEN({Description}) > 50, LEFT({Description}, 47) & "...", {Description})

Clean phone number (remove non-digits):

SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE({Phone}, "-", ""), "(", ""), ")", ""), " ", "")

Number Formatting

Percentage with one decimal:

ROUND({Value} * 100, 1) & "%"

Currency formatting:

DOLLAR({Amount})

Thousands separator (workaround — Airtable doesn't have FORMAT_NUMBER):

IF(
  {Value} >= 1000000, ROUND({Value}/1000000, 1) & "M",
  IF({Value} >= 1000, ROUND({Value}/1000, 1) & "K", {Value} & "")
)

Date Operations

Quarter from date:

"Q" & CEILING(MONTH({Date}) / 3) & " " & YEAR({Date})

Day of week:

SWITCH(
  WEEKDAY({Date}),
  0, "Sunday",
  1, "Monday",
  2, "Tuesday",
  3, "Wednesday",
  4, "Thursday",
  5, "Friday",
  6, "Saturday"
)

Business days between dates (approximate — excludes weekends):

ROUND(DATETIME_DIFF({End Date}, {Start Date}, 'days') * 5 / 7, 0)

Next Monday:

DATEADD(NOW(), 7 - WEEKDAY(NOW(), 'monday'), 'days')

Start of current month:

DATETIME_PARSE(YEAR(NOW()) & "-" & MONTH(NOW()) & "-01", 'YYYY-M-DD')

Conditional Logic

Multi-level IF (status color coding):

SWITCH(
  {Status},
  "Active", "🟢",
  "Pending", "🟡",
  "At Risk", "🟠",
  "Inactive", "🔴",
  "⚪"
)

Null/empty handling:

IF({Field} = BLANK(), "Not set", {Field})

Multiple conditions (AND/OR):

IF(
  AND(
    {Priority} = "High",
    IS_BEFORE({Due Date}, DATEADD(NOW(), 3, 'days'))
  ),
  "URGENT",
  IF(
    OR(
      {Priority} = "High",
      IS_BEFORE({Due Date}, DATEADD(NOW(), 7, 'days'))
    ),
    "Attention Needed",
    "On Track"
  )
)

Rollup Aggregations

When configuring rollup fields, use these aggregation formulas:

GoalAggregation Formula
Count linked recordsCOUNTALL(values)
Count non-emptyCOUNTA(values)
Sum valuesSUM(values)
AverageAVERAGE(values)
Min/MaxMIN(values) / MAX(values)
Comma-separated listARRAYJOIN(values, ", ")
Unique countCOUNTALL(ARRAYUNIQUE(values))
Percentage completeCOUNTA(values) / COUNTALL(values) * 100

Formula Debugging Tips

1. Start simple: Build complex formulas incrementally. Get the inner expression working first, then wrap it

2. Check field names: Names are case-sensitive and must match exactly, including spaces

3. Watch for blanks: Many formulas break on empty fields. Wrap in IF({Field} != BLANK(), ..., "N/A")

4. Test with known values: Create a test record with predictable values to verify formula output

5. Use SWITCH over nested IFs: More than 3 levels of IF nesting? SWITCH is cleaner and easier to maintain

6. Date timezone issues: NOW() uses your account timezone. TODAY() returns date without time. Pick the right one

Common Error Messages

ErrorCauseFix
#ERROR!Syntax error in formulaCheck parentheses and commas
#VALUE!Wrong data typeEnsure field types match operations (e.g., don't do math on text)
#REF!Referenced field doesn't existCheck field name spelling (case-sensitive)
NaNDivision by zeroAdd IF({Divisor} > 0, ...) guard
Blank outputFormula returns empty stringCheck your IF conditions and BLANK() handling

*Need help? Contact support@datanest.dev*

Airtable Business Templates v1.0.0 — Free Preview