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.

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.

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.