Online Tool Store Online Tool Store

CSV to ICS Converter

Convert a CSV of events into a correct .ics file — exclusive all-day end dates, safe line folding, proper escaping, and a report of skipped rows.

🔒 This tool runs entirely in your browser. Your files are never uploaded to a server.

Which column is which?

Detected from your header row where possible.

Built in this page; nothing is uploaded, and no calendar account is touched — you get a file to import yourself. Times are written without a timezone, so a calendar reads them in whichever zone it is set to. That is usually what you want for a schedule; if you need a fixed zone, add a TZID by hand.

How to use it

  1. Paste your CSV or open a file — columns are matched from the header row.
  2. Correct any column that was matched wrongly, and set the date order if your dates are ambiguous.
  3. Read the report: it lists rows that were skipped and guesses that were made.
  4. Download the .ics and import it into your calendar.

The exclusive end date

This is the single most common bug in generated calendar files, and it is invisible until someone notices their event is on the wrong day. For an all-day event, the iCalendar format treats DTEND as exclusive — the first day not covered:

a one-day event on 17 August
  DTSTART;VALUE=DATE:20260817
  DTEND;VALUE=DATE:20260818   ← the day after

17 to 19 August inclusive → DTEND 20260820

Write the same date in both fields and you have declared an event of zero length, which different calendars handle differently — some show one day, some show nothing. Adding the day is correct, and the arithmetic here was checked over month ends, a year end and a leap year rather than assumed.

Folding, and why it counts bytes

The format requires that no line exceed 75 octets, and that longer values be split with each continuation line beginning with a single space. The word octets matters: it is bytes, not characters.

"x"    1 byte         "é"    2 bytes
"あ"   3 bytes        "🎉"   4 bytes

So a description of 40 emoji is 160 bytes and must be folded, while 70 plain letters need not be. Worse, folding at a fixed byte offset can land in the middle of a multi-byte character and corrupt it. The folding here backs off to the nearest character boundary, and was verified by unfolding accented, Japanese and emoji text and confirming it matched the original exactly, with no line over 75 bytes and no replacement characters.

Escaping, in the right order

Four characters carry meaning in an iCalendar text value and must be escaped: backslash, semicolon, comma and newline. A description reading "Daily sync; bring notes" has to become Daily sync\; bring notes, or the semicolon is read as a property separator and the rest of your text disappears.

The order is what catches people: backslashes must be escaped first. Do commas or semicolons first and the backslashes you just introduced get escaped again on the next pass, so a semicolon ends up as \\; — a literal backslash followed by a separator. That is a one-character bug that silently truncates every affected field, so the escaping here is tested against inputs combining all four.

CSV is not just splitting on commas

Calendar data is full of commas — "Covers the new flow, end to end" — which is exactly why they are quoted in a well-formed CSV. The parser here follows the quoting rules properly: a quoted field may contain commas, line breaks and doubled quotes standing for a literal quote. Splitting on commas would break every one of those, and the failure looks like data shifted into the wrong columns rather than an error.

What it decides, and tells you about

A converter has to make judgement calls, and the honest thing is to report them rather than bury them. A row with no title is skipped, because an untitled calendar entry is not useful. A date that cannot be read is skipped rather than guessed — and a date like 29 February in a common year is treated as unreadable rather than being quietly rolled into March, which is what naive date handling does. An event whose end is before its start is written exactly as given and flagged, since only you know which end was wrong. All of these appear in the report above the output.

FAQ

Why do all-day events sometimes import a day short?

Because in the iCalendar format an all-day DTEND is exclusive — it marks the day after the event finishes. A single-day event on 17 August needs DTSTART 20260817 and DTEND 20260818. Generators that write the same date for both produce an event with no duration, which calendars display inconsistently or drop. This tool adds the day, and the behaviour was checked across month, year and leap-year boundaries.

What happens if a row has no start time?

It becomes an all-day event, which is almost always what an empty time column means. If there is a start time but no end time, an hour is assumed and you are told which rows that applied to, so the guess is visible rather than silent.

How does it read 03/04/2026?

However you tell it to. That date is genuinely ambiguous — 3 April or 4 March depending on where you are — so it is a setting rather than a guess. When one number is above 12 the ambiguity resolves itself and the setting is ignored for that row. Using ISO dates like 2026-04-03 in your CSV avoids the question entirely and is worth doing if you control the export.

Why are long lines broken up with a leading space?

That is line folding, and it is required: iCalendar lines must not exceed 75 octets, with continuations starting with a space. Note octets rather than characters — an emoji or an accented letter costs several. Folding at the wrong boundary would split a character and corrupt the text, so the folding here backs off to a character boundary and was verified by unfolding accented, CJK and emoji text back to the original byte for byte.

What timezone are the events in?

None is specified, so a calendar interprets the times in whatever zone it is set to. For a schedule of local events that is usually the desired behaviour — a 9am standup stays 9am. If you need the times pinned to a specific zone regardless of the reader, you will need to add a TZID and a VTIMEZONE block by hand; this tool deliberately does not guess at that.

Does it add events to my calendar?

No. It produces a file for you to import, and it has no access to any calendar account. Nothing is uploaded either — the CSV is parsed in your browser, which matters since these files tend to contain names, addresses and meeting details.

How we compare

Feature Online Tool Store Google Calendar CSV import Other online converters
CSV never leaves your device
Correct exclusive all-day end date Often wrong
Folds lines at 75 octets safely Rarely
You choose the date order
Reports skipped rows and assumptions Partly
Recurring events and reminders In the UI
Timezone handling and invitations

Useful when you have a spreadsheet of dates and want a file any calendar will accept, without uploading a list of names and addresses. It writes plain single events — for recurrence rules, reminders, attendees or fixed timezones you will want to edit the file or set those up in the calendar itself.

Explore related tools

Embed this tool

Paste this on your own site — it stays free, and every file still stays in your visitor's browser, not yours or ours.