Convert

Export VCF Contacts to ICS Birthday Calendar: 4 Methods

Quick Answer

Easily parse the VCF file, extract BDAY properties and generate an ICS file with annual recurring VEVENT entries. Easiest method: Import VCF contacts to Google Contacts, Apple Contacts or Outlook, and enable the built-in “Birthdays” calendar. These platforms automatically create a birthday calendar from your contact data without any export. The Python script is best when you need a standalone .ics file to export contacts to ICS birthday calendar for use in any calendar app.

Introduction

VCF contacts can include a BDAY property that stores each person’s birthday. However, this data sits inside the contact file and does not appear on your calendar unless you extract it. The goal is to turn those birthday dates into calendar events with annual reminders, so you never miss an important date.

There are two approaches: generate a standalone ICS file from VCF birthday data (useful for importing into any calendar app), or use built-in birthday calendars that platforms like Google, Apple, and Outlook provide automatically. This guide covers both, plus the ICS file structure and common issues with date formatting across vCard versions. If you need to convert your VCF to other formats first, see our guides for VCF to CSV or VCF to HTML.

We have built VCF parsing tools at Univik since 2013 and extract birthday data from vCard exports across vCard 2.1, 3.0, and 4.0 from over 15 platforms.

How VCF Birthdays Become ICS Events

A VCF file stores birthdays in the BDAY property. The format varies by vCard version:

vCard Version BDAY Format Example
2.1 BDAY:YYYYMMDD or BDAY:YYYY-MM-DD BDAY:19900315
3.0 BDAY:YYYY-MM-DD BDAY:1990-03-15
4.0 BDAY:YYYYMMDD or BDAY;VALUE=date:YYYY-MM-DD BDAY:19900315

An ICS birthday event is a VEVENT with an all-day date and an annual recurrence rule (RRULE:FREQ=YEARLY). The Python script reads each BDAY value, creates a VEVENT, and writes the complete ICS file. Calendar apps then display these as recurring annual events with optional reminders.

4 Methods to Create a Birthday Calendar from VCF

Method 1: Python Script (Custom ICS File)

This method generates a standalone .ics file that you can import into Google Calendar, Apple Calendar, Outlook, or any CalDAV server. The script extracts BDAY properties from the VCF and creates annual recurring events.

1

Install vobject: pip install vobject

2

Save the following as vcf_to_birthday_ics.py:

import vobject, sys, re, uuid
from datetime import datetime
vcf_file = sys.argv[1] if len(sys.argv) > 1 else "contacts.vcf"
with open(vcf_file, "r", encoding="utf-8") as f:
  vcf_data = f.read()
events = []
for card in vobject.readComponents(vcf_data):
  if not hasattr(card, "bday"): continue
  name = card.fn.value if hasattr(card, "fn") else "Unknown"
  bday_raw = card.bday.value
  if isinstance(bday_raw, str):
    clean = re.sub(r"[^0-9]", "", bday_raw)
    if len(clean) >= 8:
      bday_date = datetime.strptime(clean[:8], "%Y%m%d")
    else: continue
  else: bday_date = bday_raw
  events.append({"name": name, "date": bday_date})
ics = "BEGIN:VCALENDAR\r\nVERSION:2.0\r\n"
ics += "PRODID:-//Univik//Birthday Calendar//EN\r\n"
ics += "X-WR-CALNAME:Birthdays\r\n"
for e in sorted(events, key=lambda x: (x["date"].month, x["date"].day)):
  dt = e["date"].strftime("%Y%m%d")
  ics += "BEGIN:VEVENT\r\n"
  ics += f"DTSTART;VALUE=DATE:{dt}\r\n"
  ics += f"SUMMARY:{e['name']}'s Birthday\r\n"
  ics += "RRULE:FREQ=YEARLY\r\n"
  ics += f"UID:{uuid.uuid4()}@univik.com\r\n"
  ics += "BEGIN:VALARM\r\n"
  ics += "TRIGGER:-P1D\r\nACTION:DISPLAY\r\n"
  ics += f"DESCRIPTION:{e['name']}'s birthday tomorrow\r\n"
  ics += "END:VALARM\r\nEND:VEVENT\r\n"
ics += "END:VCALENDAR\r\n"
with open("birthdays.ics", "w", encoding="utf-8") as f:
  f.write(ics)
print(f"Created birthdays.ics with {len(events)} events")

3

Run it: python vcf_to_birthday_ics.py contacts.vcf

The output is a birthdays.ics file with one VEVENT per contact that has a BDAY property. Each event is an all-day annual recurring event with a one-day-before reminder. Events are sorted by month and day. Import this file into any calendar app.

Method 2: Built-In Birthday Calendars (No Export Needed)

Google Contacts, Apple Contacts, and Outlook all have automatic birthday calendars. If you import your VCF contacts into one of these platforms, birthdays appear on your calendar with no additional conversion. See the platform comparison below for details on each.

1

Import VCF to your contacts app. Use Google Contacts, Apple Contacts, or Outlook. Make sure the VCF includes BDAY properties.

2

Enable the Birthdays calendar. In Google Calendar, check “Birthdays” under “Other calendars”. In Apple Calendar, it appears under “Other” on Mac or is automatic on iPhone. In Outlook, birthday events are created automatically when you add birthdays to contacts.

Method 3: Online VCF to ICS Converter

A few online tools and open-source scripts convert VCF birthday data to ICS. The GitHub project VCF-to-ICS (foxp.github.io/VCF-to-ICS) runs in the browser and processes the file locally. For server-based conversion, general-purpose file converters may offer VCF-to-ICS output, but most convert the full contact data to calendar format rather than extracting only birthdays.

Most Online Tools Do Not Extract Birthdays Specifically

General “VCF to ICS” converters often try to convert entire contacts into calendar events, which produces unusable results (one event per contact with all fields dumped into the description). The Python script in Method 1 and the GitHub tools are specifically designed to extract only BDAY data and create proper annual birthday events.

Method 4: Manual Calendar Entry (Small Lists)

For fewer than 10 birthdays, you can add them manually to any calendar app. Open your VCF file in a text editor, search for “BDAY:” to find the dates, and create calendar events by hand. Set each event to repeat annually. This is tedious for large contact lists but works for a handful of important dates.

ICS Birthday Event Structure

An ICS birthday event follows the iCalendar standard (RFC 5545). Here is the anatomy of a single birthday event in the generated file:

ICS Property Purpose Example Value
DTSTART;VALUE=DATE Birthday date (all-day event) 19900315
SUMMARY Event title Jane Doe’s Birthday
RRULE:FREQ=YEARLY Repeats every year RRULE:FREQ=YEARLY
UID Unique identifier (prevents duplicates) a1b2c3@univik.com
VALARM (TRIGGER:-P1D) Reminder 1 day before Reminder at 9 AM day before
X-WR-CALNAME Calendar display name Birthdays

The VALUE=DATE parameter (without a time component) tells calendar apps to display the event as an all-day entry. The RRULE:FREQ=YEARLY makes it recur annually. The VALARM adds a reminder notification one day before each birthday.

Built-In Birthday Calendars by Platform

Platform Birthday Calendar How to Enable Reminder
Google Contacts + Calendar Auto-generated “Birthdays” calendar Check “Birthdays” under Other calendars Configurable (default: day of)
Apple Contacts + Calendar “Birthdays” calendar under Other Automatic on macOS/iOS when birthday field is filled Day before (default)
Outlook Birthday events created per contact Automatic when birthday is added to a contact Default Outlook reminder
Nextcloud Auto-generated birthday calendar from CardDAV Settings, Contacts, Birthday calendar toggle Configurable
Thunderbird No built-in birthday calendar Requires add-on or ICS import Via ICS VALARM

If you use Google, Apple, or Outlook, the built-in birthday calendar (Method 2) is the simplest approach. If you use Thunderbird, a CalDAV server, or a calendar app without built-in birthday support, use Method 1 to generate the ICS file and import it.

Method Comparison Table

Criteria Python Script Built-In Calendar Online Tool Manual
Produces .ics file Yes No (auto-generated) Yes No
Custom reminders Full control Platform default Limited Per event
Handles all vCard versions 2.1, 3.0, 4.0 Depends on import Varies N/A
Works with any calendar app Yes (ICS is universal) Platform-specific Yes Yes
Automation/scripting Yes No No No
Best for Custom ICS, CalDAV Google/Apple/Outlook Quick one-off Under 10 dates

Common Problems and Fixes

1

No birthdays found in the VCF file. Open the VCF in a text editor and search for “BDAY:”. If no results appear, the contacts do not have birthday data stored. Some contact exports (especially from corporate email systems) strip birthday fields. You will need to add birthday dates to the contacts before generating the calendar.

2

BDAY date format is not recognized by the script. VCF files from different platforms use different date formats. Some use YYYYMMDD, others use YYYY-MM-DD, and some older Nokia exports use DD/MM/YYYY. The Python script in Method 1 strips non-numeric characters and reads the first 8 digits as YYYYMMDD. If your dates use DD/MM/YYYY order, you will need to adjust the parsing format string from “%Y%m%d” to “%d%m%Y”.

3

Birthday year shows as 1604 or 0001. Some contact apps store birthdays without a year when the user entered only the month and day. These appear as BDAY:–0315 (vCard 4.0 no-year syntax) or with a placeholder year like 1604. The script can handle this by defaulting to a fixed year (e.g., 2000) when the year is missing or clearly invalid, while still setting the correct month and day for the annual recurrence.

4

Duplicate birthday events after re-importing the ICS file. Each VEVENT needs a unique UID. If you regenerate and re-import the ICS file, calendar apps may create duplicate events if the UIDs are different. The Python script uses uuid4() for unique IDs. To avoid duplicates on re-import, delete the previous birthday calendar in your calendar app before importing the new ICS file.

Frequently Asked Questions

Can I include anniversaries along with birthdays?

Yes. VCF files can include an ANNIVERSARY property (vCard 4.0) or X-ANNIVERSARY (vCard 3.0 extension). Modify the Python script to check for both hasattr(card, "bday") and hasattr(card, "anniversary"), then create separate VEVENT entries for each. Use a different SUMMARY format like “Jane and John’s Anniversary” to distinguish them from birthdays.

Can I import the ICS birthday calendar to Google Calendar?

Yes. Go to Google Calendar, click the gear icon, then Settings. Under “Import & Export”, click “Import” and select the birthdays.ics file. Choose which calendar to add the events to. Google Calendar creates the recurring annual events. You can also upload the ICS file to a Google Contacts-linked calendar.

How do I add a reminder for each birthday?

The Python script includes a VALARM with TRIGGER:-P1D, which sets a reminder one day before each birthday. To change the timing, modify the trigger value: -PT2H means 2 hours before, -P7D means one week before. You can add multiple VALARM blocks for multiple reminders (e.g., one week before and one day before).

What if some contacts have birthdays and others do not?

The script skips contacts without a BDAY property automatically. Only contacts with birthday data are included in the ICS output. To see which contacts are missing birthdays, convert VCF to CSV and check the birthday column for empty cells.

Can I export from Apple Contacts or Google Contacts and then create the ICS?

Yes. Export your contacts as a VCF file from Apple Contacts (File, Export, Export vCard) or Google Contacts (Export, vCard format). Then run the Python script on the exported VCF file. The BDAY field is preserved in the VCF export from both platforms.

Conclusion

Last verified: February 2026. Python script tested with vobject 0.9.7 on Python 3.12. ICS output tested in Google Calendar, Apple Calendar, Outlook 365, and Thunderbird. VCF birthday data tested from iCloud, Google Contacts, Samsung and Android exports across vCard 2.1, 3.0 and 4.0.

To export contacts to an ICS birthday calendar, the Python script (Method 1) generates a standalone .ics file with annual recurring events and reminders from VCF BDAY data. For the simplest approach, import your VCF contacts into Google, Apple or Outlook and enable the built-in Birthdays calendar (Method 2). The ICS file method is necessary when your calendar app does not have a built-in birthday feature or when you need a portable .ics file for CalDAV servers.

Three things to remember: check that your VCF file contains BDAY properties before converting (not all exports include them), use RRULE:FREQ=YEARLY to make events recur annually, and include a VALARM so you get reminded before each birthday instead of just seeing it on the day.

About the Author

This guide is written and maintained by the Univik team, developers of file conversion and digital forensics tools since 2013. Our VCF parsers extract BDAY and ANNIVERSARY data from vCard 2.1 through 4.0 and generate RFC 5545-compliant ICS files with proper VEVENT structure, unique UIDs, and configurable reminders. Have a conversion issue we did not cover? Let us know.