How to Add Recurring Events to Your Airtable Calendar

Airtable's calendar view shows one date per record. If an event happens every Friday for eight weeks, you need eight records - one for each date. There is no "repeat every week" setting, no recurrence rule, no way to tell Airtable that one event should appear multiple times on the calendar.

This is a genuine gap in Airtable's feature set, and it affects anyone using Airtable to manage schedules, programs, bookings, or anything else that runs on a repeating pattern.

There are two ways to work around it. The first keeps everything inside Airtable using a two-table structure and an automation script. The second connects Airtable to Google Calendar or Outlook, where recurring events are a native feature, and syncs them back in.

Method 1: Two-Table Structure With a Script

This method creates one record per event occurrence automatically, so your calendar view shows every instance of a recurring event without any manual entry.

The table structure

You need two tables.

Table 1: Events

This is where you define each event and its recurrence pattern. Fields to create:

  • Name (primary field, single line text) - the event name, e.g. "Book Club"

  • Is Recurring (checkbox) - mark this for events that repeat

  • Start Date (date) - when the recurring period begins

  • End Date (date) - when the recurring period ends

  • Recurring Day (single select) - the day of the week it repeats. Options: Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday

  • Notes (long text, optional) - any additional detail about the event

Table 2: Event Dates

This table stores every individual occurrence. Each record is one instance of one event. Fields to create:

  • Date (date, primary field) - the actual date of this occurrence

  • Event (linked record) - links back to the record in the Events table

  • Event Name (lookup) - pulls the Name field from the linked Events record

Since Airtable's calendar view uses the primary field as the label, make sure the Date field is the primary field in this table. The Event Name lookup will show in the record detail but the date is what displays on the calendar itself.

Setting up the calendar view

Once the Event Dates table is set up, create a calendar view in that table:

  • Click the + button next to your views in the Event Dates table

  • Select Calendar

  • Set the date field to Date

Now every record in Event Dates will appear on the calendar on its corresponding date. When the script runs and creates eight records for an eight-week event, all eight dates will show up.

Calendar view in the Event Dates table showing individual occurrences of recurring events

The automation and script

Instead of creating event date records manually, set up an automation that triggers whenever a new recurring event is added to the Events table, reads its recurrence pattern, and generates all the individual date records automatically.

Step 1: Create the automation

In your base, open Automations and create a new automation.

Set the trigger to When a record is created. Select the Events table. Do not add any conditions here - the automation should fire for every new event, whether recurring or not. The script handles both cases.

Add a Run a script action.

Step 2: Pass the record ID to the script

In the script action's input variables, add one variable called recordId and set its value to the trigger record's ID using the field picker.

Step 3: Paste in the script

let eventTable = base.getTable("Events");
let eventDatesTable = base.getTable("Event Dates");

let inputConfig = input.config();
let eventId = inputConfig.recordId;

let eventRecord = await eventTable.selectRecordAsync(eventId, {
  fields: ["Name", "Start Date", "End Date", "Recurring Day"],
});

if (!eventRecord) {
  throw new Error("Event not found");
}

let startDate = eventRecord.getCellValue("Start Date");
let endDate = eventRecord.getCellValue("End Date");
let recurringDay = eventRecord.getCellValue("Recurring Day")?.name;

if (!startDate || !endDate || !recurringDay) {
  throw new Error("Start Date, End Date, and Recurring Day are all required");
}

let dayMap = {
  Sunday: 0,
  Monday: 1,
  Tuesday: 2,
  Wednesday: 3,
  Thursday: 4,
  Friday: 5,
  Saturday: 6,
};

let targetDay = dayMap[recurringDay];
if (targetDay === undefined) {
  throw new Error("Recurring Day value is not a valid day of the week");
}

// Collect all matching dates first, then batch create
let recordsToCreate = [];
let current = new Date(startDate);
let end = new Date(endDate);

while (current <= end) {
  if (current.getDay() === targetDay) {
    recordsToCreate.push({
      fields: {
        Date: current.toISOString(),
        Event: [{ id: eventRecord.id }],
      },
    });
  }
  current.setDate(current.getDate() + 1);
}

// Create in batches of 50 (Airtable's API limit per call)
while (recordsToCreate.length > 0) {
  await eventDatesTable.createRecordsAsync(recordsToCreate.slice(0, 50));
  recordsToCreate = recordsToCreate.slice(50);
}

output.text(
  `Created ${recordsToCreate.length === 0 ? "all" : "remaining"} date records for ${eventRecord.getCellValue("Name")}`,
);

The script reads the start date, end date, and recurring day from the event record. It loops through every day in that range, and whenever the day of the week matches, it adds that date to a batch. Once it has collected all the dates, it creates them in groups of 50 - Airtable's API limit per call and significantly faster than creating them one at a time.

Step 4: Test and enable

Create a test record in the Events table with Is Recurring checked, a start date, an end date a few weeks out, and a recurring day. Run the automation manually to confirm the Event Dates records are created correctly, then turn the automation on.

What to do when an event changes

If you need to update a recurring event (change its end date, skip a week, change the day), the simplest approach is to delete all the existing Event Dates records linked to that event and re-run the automation. There is no automatic update mechanism - the script only runs on creation, not on edit.

For events that need exceptions (for example, "every Friday except July 4th"), you can manually delete the specific date record that should be skipped after the script has generated all the dates.

Method 2: Sync With Google Calendar or Outlook

If you already use Google Calendar or Outlook to manage your schedule, the easier path is to create recurring events there (where it is natively supported) and sync them into Airtable automatically.

Syncing from Google Calendar into Airtable

Airtable has a built-in Google Calendar sync integration that pulls events from a Google Calendar into a synced table in your base.

  • In your base, click the + button to add a new table

  • Select Sync from another source, then Google Calendar

  • Connect your Google account and select the calendar you want to sync

  • Choose which fields to include (event name, start time, end time, description, etc.)

  • Airtable creates a synced table that updates automatically as your calendar changes

Once the sync is set up, any recurring event you create in Google Calendar will appear as multiple records in Airtable - one per occurrence - exactly as you would need for the calendar view to show them properly.

Airtable sync setup for Google Calendar showing the connection and field mapping options

The synced table is read-only in Airtable. You manage all events in Google Calendar, and Airtable reflects them.

Sending events from Airtable to Google Calendar

If you prefer to manage events in Airtable and have them appear in Google Calendar, you can set up an Airtable automation to create calendar events when records are added:

  • Create an automation triggered by When a record is created in your events table

  • Add a Create calendar event action (available natively for Google Calendar and Outlook in Airtable's automation actions)

  • Map the record's fields to the calendar event's title, start time, and end time

This does not create recurring events natively - it creates a single calendar event per Airtable record. For true recurrence you still need to either use the two-table method above or manage the recurrence in Google Calendar directly.

Using Make or Zapier for more control

If you need bidirectional sync or more complex logic - for example, syncing with Outlook and filtering by event category before creating Airtable records - Make gives you full control over the sync logic with modules for both Airtable and most calendar tools.

Which Method to Use

Use the two-table script method if: Your events are managed entirely in Airtable and you do not use an external calendar. This keeps everything in one place and gives you full control over the data.

Use the Google Calendar sync if: You already manage schedules in Google Calendar or Outlook and just want Airtable to reflect them. It is less setup and requires no scripting.

For related reading, if you need to show events from two different tables in the same Airtable calendar view, see How to Show Records from Multiple Tables in One Airtable Calendar.

If you are managing bookings alongside your events and need to prevent conflicts, see How to Manage Bookings in Airtable and Prevent Double Bookings.