How to Import CSV into Google Calendar: Format, Template & Methods
Import events to Google Calendar from CSV files. Includes the exact CSV format, a ready-to-use template, and methods for bulk event imports.

How to Import CSV into Google Calendar: Format, Template & 5 Methods
You can import CSV files into Google Calendar through Settings > Import & Export in any desktop browser. Your CSV needs two columns minimum: Subject and Start Date in MM/DD/YYYY format. Google parses the file, creates individual events, and drops them into whichever calendar you pick.
Simple enough. But if you have 300 conference sessions, a semester of class schedules, or a full season of game times sitting in a spreadsheet, the basic upload starts showing its limits fast. Below you'll find the exact CSV format Google Calendar expects, a template you can copy right now, and five ways to get events into your calendar -- from the basic UI upload to the Google Calendar API.
Google Calendar CSV Format Requirements
Google Calendar is picky about its CSV format. Get one column header wrong and the import fails silently -- no error message, no warning. Just nothing happens. Here is what the file needs to look like.
Required and Optional Columns
| Column | Required | Format | Example |
|---|---|---|---|
Subject | Yes | Plain text | Team Meeting |
Start Date | Yes | MM/DD/YYYY | 05/30/2026 |
Start Time | No | 12-hour AM/PM | 10:00 AM |
End Date | No | MM/DD/YYYY | 05/30/2026 |
End Time | No | 12-hour AM/PM | 1:00 PM |
All Day Event | No | Boolean | True or False |
Description | No | Plain text | Quarterly review |
Location | No | Plain text | Conference Room A |
Private | No | Boolean | True or False |
That is it. Nine columns. Google Calendar does not support custom columns, attendees, reminders, event colors, or attachments through CSV import. Frustrating if you need those, but that is the reality of this import method.
Format Rules That Trip People Up
Column headers must be in English and case-sensitive. Write Start Date, not start date or StartDate. Google matches these strings exactly.
Dates use MM/DD/YYYY. You'll find blog posts claiming Google Calendar requires YYYY-MM-DD. From what I can tell, this is locale-dependent. The official Google documentation at support.google.com/calendar/answer/37118 shows 05/30/2020 as the example format. For English (US) locale accounts, stick with MM/DD/YYYY. If your Google account uses a different locale, you might need a different date format -- I haven't tested every locale, so you may need to experiment.
Times use 12-hour format with AM/PM. Write 2:00 PM, not 14:00. Include a space between the time and the AM/PM marker.
Wrap fields with commas in double quotes. If your location is Columbia, Schermerhorn 614, the CSV field must be "Columbia, Schermerhorn 614". Otherwise the comma splits the field and breaks the row.
Save as UTF-8. Accented characters, special symbols, non-English text -- all of it needs UTF-8 encoding or you'll get garbled output. Most modern spreadsheet apps default to UTF-8, but Excel on Windows sometimes saves as ANSI. That one bit me once with a file full of French event names.
Ready-to-Use CSV Template
Copy this template directly. It covers four common scenarios: a timed meeting, an all-day event, a multi-day event, and a private call.
Subject,Start Date,Start Time,End Date,End Time,All Day Event,Description,Location,Private
Team Standup,02/10/2026,09:00 AM,02/10/2026,09:30 AM,False,Daily sync meeting,"Conference Room A, Floor 3",False
Project Deadline,02/14/2026,,,,,Q1 deliverable due,,False
Company Retreat,02/20/2026,,02/21/2026,,True,Annual offsite retreat,Lake Resort,False
Client Call,02/12/2026,02:00 PM,02/12/2026,03:00 PM,False,Quarterly review with Acme Corp,"Zoom, Meeting ID: 123-456-789",True
Notice the Project Deadline row leaves Start Time, End Date, and End Time empty. Totally fine. Google treats it as an all-day event marker. The Company Retreat row sets All Day Event to True and spans two dates with no times -- that is how you get multi-day events.
Method 1: Import CSV via Google Calendar UI
The standard approach. Works for one-off imports of up to around 50-100 events. No tools, no code, no extensions needed.
- Open calendar.google.com in a desktop browser. The mobile app does not support CSV import.
- Click the gear icon in the top-right corner.
- Select Settings from the dropdown.
- Click Import & Export in the left sidebar.
- Click Select file from your computer and choose your
.csvfile. The file must have a.csvextension --.xlsand.xlsxfiles are rejected. - Use the dropdown to select the target calendar. Events land in whichever calendar you pick here. Default is your primary calendar.
- Click Import.
- Google displays a confirmation showing how many events were imported. Check your calendar view to verify they appear at the correct dates and times.
Do this first: Create a test calendar. Go to Settings > Add calendar > Create new calendar, then import into that. If something looks wrong, delete the test calendar and start over. Seriously, do not skip this step. Cleaning up 200 broken events from your primary calendar is not fun.
About re-importing: Google Calendar does not update or deduplicate events. Import the same CSV twice and you get double of everything. No merge. No upsert. Just duplicates. Delete them manually or nuke the entire calendar and re-import.
Method 2: Convert CSV to ICS for Recurring Events
CSV import cannot handle recurring events. Full stop. If you import a weekly team meeting as separate rows, you get individual one-time events. No recurrence pattern. No "every Monday at 10am."
ICS (iCalendar) files fix this. They support RRULE directives that define recurrence patterns, and Google Calendar imports ICS files through the same Import & Export interface.
Online Converter
The quickest way is csv-to-ics.com, a free browser-based tool. Upload your CSV, map the columns, download the .ics file. Then import it into Google Calendar using the same Settings > Import & Export flow. Honestly, this works great for most people.
Python Script for CSV-to-ICS
If you want more control -- especially for adding recurrence rules -- a short Python script does the job:
import csv
from datetime import datetime
csv_file = 'events.csv'
ics_file = 'events.ics'
ics_content = "BEGIN:VCALENDAR\nVERSION:2.0\nCALSCALE:GREGORIAN\nMETHOD:PUBLISH\n"
with open(csv_file, newline='', encoding='utf-8') as f:
reader = csv.DictReader(f)
for idx, row in enumerate(reader):
start_dt = datetime.strptime(
f"{row['Start Date']} {row['Start Time']}",
"%m/%d/%Y %I:%M %p"
)
end_dt = datetime.strptime(
f"{row['End Date']} {row['End Time']}",
"%m/%d/%Y %I:%M %p"
)
ics_content += f"""BEGIN:VEVENT
UID:event{idx}@example.com
DTSTAMP:{start_dt.strftime('%Y%m%dT%H%M%S')}
DTSTART:{start_dt.strftime('%Y%m%dT%H%M%S')}
DTEND:{end_dt.strftime('%Y%m%dT%H%M%S')}
SUMMARY:{row['Subject']}
DESCRIPTION:{row.get('Description', '')}
LOCATION:{row.get('Location', '')}
END:VEVENT
"""
ics_content += "END:VCALENDAR"
with open(ics_file, 'w', encoding='utf-8') as f:
f.write(ics_content)
print(f"ICS file created: {ics_file}")To add weekly recurrence, insert an RRULE line after DTEND:
RRULE:FREQ=WEEKLY;COUNT=12
That creates a repeating event for 12 weeks. The ICS format supports DAILY, WEEKLY, MONTHLY, and YEARLY frequencies. Google Calendar respects these rules on import.
Method 3: Google Calendar API for Developers
The API is what you want when you're importing hundreds or thousands of events, need attendees and reminders attached, or are building calendar import into a product.
API Endpoint
POST https://www.googleapis.com/calendar/v3/calendars/{calendarId}/events/import
This endpoint requires OAuth 2.0 authorization with the calendar or calendar.events scope. Each event needs an iCalUID -- a unique identifier per the RFC 5545 spec.
What the API Supports That CSV Does Not
The API gives you everything the CSV format cannot:
- Recurring events via the
recurrence[]field (RRULE support) - Attendees with email addresses and RSVP status
- Reminders and notifications
- Event colors and categories
- Attachments and conference data (Google Meet links)
- Batch requests for importing multiple events in a single HTTP call
The API quota is 1,000,000 requests per day per project, so you're unlikely to hit limits. For a working Python example that reads a CSV and calls the Calendar API, check out the CSV-to-Google-Calendar-API project on GitHub.
When to Use the API
Pick the API when CSV features are not enough, when you're importing at scale, or when you're building a product that lets users push events to their own Google Calendars. For a one-off import of 50 events? Overkill. Don't bother.
Method 4: Google Apps Script Automation
Apps Script is the middle ground between the manual UI import and the full API. It runs JavaScript inside Google's ecosystem, requires no API keys, and talks directly to both Google Sheets and Google Calendar.
How It Works
- Paste your CSV data into a Google Sheet (or import the CSV file into Sheets).
- Open Extensions > Apps Script.
- Write a function that reads each row and creates a calendar event.
- Run the script manually or set a time-based trigger for automatic execution.
Basic Script
function importEventsFromSheet() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var data = sheet.getDataRange().getValues();
var calendar = CalendarApp.getDefaultCalendar();
// Skip header row, start at index 1
for (var i = 1; i < data.length; i++) {
var row = data[i];
var title = row[0]; // Subject
var startDate = new Date(row[1]); // Start Date
var startTime = row[2]; // Start Time
var endDate = new Date(row[3]); // End Date
var endTime = row[4]; // End Time
var allDay = row[5]; // All Day Event
var description = row[6]; // Description
var location = row[7]; // Location
if (allDay === true || allDay === 'True') {
// createAllDayEvent expects endDate to be the day AFTER the last day,
// so add one day to make the range inclusive of the end date.
var adjustedEnd = new Date(endDate);
adjustedEnd.setDate(adjustedEnd.getDate() + 1);
calendar.createAllDayEvent(title, startDate, adjustedEnd, {
description: description,
location: location
});
} else {
// Combine date and time so events aren't created at midnight.
if (startTime) {
var st = new Date(startTime);
startDate.setHours(st.getHours(), st.getMinutes(), 0, 0);
}
if (endTime) {
var et = new Date(endTime);
endDate.setHours(et.getHours(), et.getMinutes(), 0, 0);
}
calendar.createEvent(title, startDate, endDate, {
description: description,
location: location
});
}
}
}The CalendarApp service supports recurring events via createEventSeries(), guest invitations, reminders, and event colors. A handy trick: add a "Status" column to your sheet and mark rows as imported. That prevents duplicates when you re-run the script.
Nothing to install -- Apps Script runs on Google's servers. Set a daily trigger and it picks up new rows on its own. This gets messy with large files (1000+ rows), though. The script has a 6-minute execution limit and you'll probably hit it if your sheet is big.
Method 5: Zapier and Other Automation Tools
Not into coding? If you need ongoing imports (not just a one-time upload), automation platforms like Zapier and Make.com connect Google Sheets to Google Calendar without writing a line of code.
Zapier Workflow
- Upload your CSV data to Google Sheets.
- Create a Zap with the trigger New Spreadsheet Row in Google Sheets.
- Set the action to Create Detailed Event in Google Calendar.
- Map your sheet columns (Subject, Start Date, etc.) to the Calendar event fields.
- Turn on the Zap. Every new row added to the sheet creates a calendar event automatically.
Zapier also supports updating events, adding attendees, and deleting events. Way more than the CSV import can do.
Make.com
Make.com (formerly Integromat) offers similar Google Sheets-to-Calendar modules with a visual workflow builder. It tends to be cheaper than Zapier for high-volume automations.
When Third-Party Tools Make Sense
These are worth it when you have a recurring workflow -- weekly schedule updates, rolling event additions -- or when non-technical team members need to add events by editing a spreadsheet. For a single bulk import? The built-in CSV upload is faster and free. Save your money.
Troubleshooting Common Errors
Events Don't Appear After Import
Wrong date format. This is the number one cause. If your dates use YYYY-MM-DD or DD/MM/YYYY and your Google account is set to English (US), the import silently drops those rows. No error. You'll just notice events are missing. Switch to MM/DD/YYYY.
Wrong file format. The file must have a .csv extension. Renaming an .xlsx file to .csv does not work -- you need to actually export or save as CSV from your spreadsheet application.
Events Show at the Wrong Time
Timezone mismatch. Google Calendar imports events using the calendar's default timezone. If your CSV has events for Eastern Time but your calendar is set to Pacific, everything shifts by three hours. Check Settings > General > Time Zone before importing.
Import Fails or Shows Zero Events
Encoding issues. If the CSV was created on Windows with non-UTF-8 encoding, special characters can corrupt the file structure. Open the file in a text editor (Notepad++, VS Code, whatever), save as UTF-8, and try again.
All data in one column. This one is sneaky. Some European locale spreadsheet apps use semicolons as the CSV delimiter instead of commas. Google Calendar expects commas. Open the file in a text editor and check -- if you see semicolons between fields, that is your problem.
Duplicate Events After Re-Import
Google Calendar does not deduplicate. Ever. Every import creates new events, even if identical ones already exist. If you need to re-import, delete the previous events first. This is where the test calendar trick from earlier really saves you -- just delete the whole calendar and start fresh.
Excel Formatting Issues
Excel loves to "help" by reformatting your data. If your times appear as decimal numbers (like 0.375 instead of 9:00 AM), Excel converted the time column to a number. Right-click the column, select Format Cells, and set it to Time format before saving as CSV. This is one of the most common gotchas I see people hit.
Limitations and Workarounds
Not everything works through every method. Here is a straight comparison:
| Feature | CSV Import | ICS Import | API | Apps Script | Zapier |
|---|---|---|---|---|---|
| Basic events | Yes | Yes | Yes | Yes | Yes |
| Recurring events | No | Yes | Yes | Yes | Yes |
| Attendees/guests | No | No | Yes | Yes | Yes |
| Reminders | No | No | Yes | Yes | Yes |
| Event colors | No | No | Yes | Yes | No |
| Attachments | No | No | Yes | No | No |
| Bulk import | Yes | Yes | Yes | Yes | Limited |
CSV import is the simplest path for basic, one-time event uploads. For anything beyond that -- recurrence, guests, reminders -- you need one of the other methods.
Also worth mentioning: CSV import only works on desktop. The Google Calendar mobile app does not support file imports at all. You need a desktop browser.
Building CSV Import Into Your Own App?
If you're building an app that lets users import CSV data -- into a calendar, a database, whatever -- you already know how painful file validation, column mapping, date format detection, and encoding issues can be. It adds up fast.
ImportCSV is an embeddable CSV importer that handles all of that. It validates files on upload, lets users map columns visually, cleans data automatically, and sends structured data to your backend. Way easier than building CSV parsing from scratch.
Wrap-up
CSV imports shouldn't slow you down. ImportCSV aims to expand into your workflow — whether you're building data import flows, handling customer uploads, or processing large datasets.
If that sounds like the kind of tooling you want to use, try ImportCSV .