Introducing Agical.io, the smarter ICS file generator

If you've used Marketo's dynamic ICS files (the "Calendar File" token type) you're probably not completely happy with 'em. While undeniably useful, they lack certain key elements we're used to when sending invites and requests via Outlook or other apps.

Major complaints from Marketo users:

  • no event reminders (alarms)
  • no all-day events
  • can't tokenize the event title

Reminders and all-days are part of the venerable ICS/iCalendar standard from 1998, and it's frustrating to have them missing from a modern product.

So about a year ago, I wrote a tiny web service that fills in all these gaps. I dubbed it MagICS (a purposely old-fashioned name) and chatted it up on the Marketo Community but no one seemed too taken with it. Changed to the slicker name Agical but still couldn't get users to pay attention to how cool it is/was! But finally, Marketo master Nicholas M. tried it out this week and gave me the feedback I needed: "it just works."

So, after a year, I've decided to publish it here.

Agical is incredibly simple to use. You just put a link in your Marketo email with appropriate query params, including dynamic {{lead.tokens}} or {{my.tokens}} in the link as needed. When a lead clicks the link, Agical generates a dynamic ICS file. It's just like the Marketo feature, only you can pass more event settings to Agical and thus get more event settings back out.

How do I use it?

The base URL is https://ics.agical.io/. To that URL, you add the following params (param names are case-sensitive):

subject — subject of the event (in ICS terminology, the "summary")

description — long description of event

organizer — person organizing event

location — location of event

attach — a URL that is related to the event, such as a webinar URL

Note: attach is one component I'm curious about support for across calendar platforms. It's harmless to include it in the ICS, and it's so helpful when it's supported (because you don't have to hunt in the description or location for a URL). So please let me know what you find with it.

dtstart — start date/time in ISO date format

dtend — end date/time in ISO

ISO dates are formatted like so:

2016-05-26T15:00:00-04:00 (with static time offset); or
2016-05-26T15:00:00Z (in UTC, a.k.a. Zulu time)

Agical will always translate to UTC in the final ICS file.

duration — as an alternative to dtend specify a duration like 1H or 30M

reminder — the alarm time, in minutes, before the event

allday — use allday=1 for an all-day event, omit for a standard event

recur — set to recur=weekly or recur=monthly for recurring events, or omit for a one-time event

recuruntil — set to the end date/time of a recurring event

echo — optional parameter to print the contents of the resulting ICS to your browser instead of downloading it. This is very, very useful for debugging.

uid — optional parameter to hard-code the unique identifier for the event, allowing (in some calendar apps) the ability to update the event over time. The string @ics.agical.io is automatically appended to the value.

Here's an example URL (sorry for the wrapping, it's bound to happen):

https://ics.agical.io/?subject=Meet%20{{company.Account Owner First Name}}&organizer=Sandy&reminder=45&location=Sandy%27s%20Desk&dtstart=2016-10-26T15:00:00-04:00&dtend=2016-10-26T16:00:00-04:00&attach=http://www.example.com/

Does it work in all calendar apps?

You'll probably find that some parameters are ignored, or set to defaults, by some apps.

Google Calendar typically doesn't use the reminder time in the ICS file, instead using the lead's default reminder time. (For example, it'll set an alarm for 30m before instead of 45m before.) Better than no reminder at all! Yet sometimes Gcal does accept the "T-minus" time exactly as-is. Haven't been able to put my finger on what's different in those cases.

Outlook 2013, and maybe earlier, has the quirk that it wants to ignore the attach param, but won't ignore it — and will show a small warning — if it doesn't end with a slash. So attach=http://www.example.com/webinar/ is fine while attach=http://www.example.com/webinar is considered wrong, though neither will show in Outlook. Go figure. So you should include the trailing slash to be safe, if you're including attach at all.

In general, Agical uses only standard RFC 2445 features, so it will generate backward-compatible ICS files (since the standard is so old, there really aren't "modern" versions; it's more like modern software never bothered to implement old stuff).

I look forward to getting feedback about which params are respected by which apps. The goal of Agical is to present a standards-compliant, gracefully-degrading ICS file with advanced features made as... possible... as possible!

Any other gotchas?

Remember that you're building a URL. Which means (h/t Nicholas again) you need to encode reserved characters, just as you would with any other URL in an email. If you want to do a positive offset from UTC, that's 12:34:56%2B04:00, not 12:34:56+04:00 (literal plus signs have special meaning).

What's it cost?

Agical.io is free to use. It's hosted on Viaduct.io's FortRabbit's enterprise platform for 24/7 availability.

Current Agical.io service status


Update 2016-08-09: Add to Google Calendar support added

Agical can now create Add to Google Calendar links too!

Update 2016-09-01: Status chart added

Added Monitis widget.

Update 2017-06-12: Viaduct to FortRabbit

Noted hosting platform change.

Update 2018-08-28: Event duration support added

Agical now supports the duration parameter for ICS files (not supported by GCal).