Documentation Dynamic Links

Dynamic Links

A Dynamic Link generates an add-to-calendar redirect from query parameters. You build the link with event details and a calendar service, and when someone clicks it they are sent straight to that calendar with the event pre-filled. No event is stored on AddCal, but every click is tracked so you get full analytics on how each link performs.

Supported calendar services

Set service to any of the values below. The visitor is redirected straight to that calendar with the event pre-filled, no account or extra step required.

Google Calendar
service=google
Apple Calendar
service=apple
Outlook desktop
service=outlook
Outlook.com
service=outlook_web
Office 365
service=office365
Yahoo Calendar
service=yahoo
Download .ics
service=ics

AddEvent compatibility mode

Migrating from AddEvent? There is a drop-in compatible endpoint at /api/dyn_ade that accepts AddEvent's parameter names, so your existing links keep working. Use client in place of uid, and AddEvent service values like outlookcom and stream are mapped automatically.

AddEvent-compatible link
https://addcal.co/api/dyn_ade
  ?client=dk_abc123
  &service=outlookcom
  &title=Team+Standup
  &start=2026-06-15T14:00:00
  &timezone=America/New_York
Everything else, recurrence, reminders, all the same parameters, works exactly as it does on the standard endpoint.

Dynamic Links vs Smart Links

Both turn a URL into a calendar event, but they do different jobs. The deciding question is whether the event details are the same for everyone or personalized per recipient.

  • Smart Links are best when the event is the same for everyone (a webinar, a launch, a class). AddCal stores it as one shared event in your calendar, with analytics, dedup, and optional approval.
  • Dynamic Links are best when each recipient gets different details (their own meeting link, seat, or address). They generate a one-off redirect straight to the visitor's calendar app, with recurrence and reminders. No event is stored, but clicks are tracked so you still get analytics.
Dynamic Links require a Dynamic Link Key and are available on the Business plan.

The link

Build a link to /api/dyn with your event details as query parameters, then put it wherever your audience is, an email, a button, an app. When someone clicks it, they are redirected straight to their chosen calendar with the event pre-filled.

Dynamic Link
https://addcal.co/api/dyn
  ?uid=dk_abc123
  &service=google
  &title=Team+Standup
  &start=2026-06-15T14:00:00
  &duration=30
  &timezone=America/New_York
  &recurring=FREQ=WEEKLY;BYDAY=MO,WE,FR
  &alarm=15

Parameters

Pass event details as query parameters. A key, a service, a title, and a start are required.

ParameterRequiredDescription
uidRequiredYour Dynamic Link Key, for example dk_abc123. Create one in your dashboard on the Business plan.
serviceRequiredWhere to redirect: google, apple, outlook, outlook_web, office365, yahoo, or ics.
titleRequiredEvent title, up to 255 characters.
startRequiredStart date and time in ISO 8601 format, for example 2026-06-15T14:00:00.
endOptionalEnd date and time in ISO 8601. Defaults to one hour after start if omitted.
durationOptionalDuration in minutes. Takes precedence over end.
timezoneOptionalIANA timezone, required for timed events, for example America/New_York.
all_day_eventOptionalSet to true for an all-day event.
descriptionOptionalEvent description, up to 2000 characters.
locationOptionalPhysical address or virtual meeting URL, up to 255 characters.
alarmOptionalReminder in minutes before the event, for example 15.
recurringOptionalAn RFC 5545 recurrence rule (RRULE), for example FREQ=WEEKLY;BYDAY=MO,WE,FR.
transpOptionalBusy status: OPAQUE (busy) or TRANSPARENT (free). Defaults to OPAQUE.

Recurrence and reminders

Unlike Smart Links, Dynamic Links accept an RFC 5545 recurrence rule via recurring and a reminder via alarm, so the event lands in the calendar already set to repeat with a reminder attached.

Use transp=TRANSPARENT to add the event as free time rather than busy.

Merge fields and URL encoding

Dynamic Links are built to carry merge tags. Drop your platform's tags where the values go and each recipient gets their own event, because the details live in the link, so they can differ for everyone.

With merge tags
ActiveCampaign
https://addcal.co/api/dyn?uid=dk_abc123&service=google&title=%EVENT_TITLE%&start=%EVENT_START%

Mailchimp
https://addcal.co/api/dyn?uid=dk_abc123&service=google&title=*|EVENT_TITLE|*&start=*|EVENT_START|*

A URL cannot safely contain spaces, line breaks, emoji, or symbols like & and %, so those must be encoded (a space becomes %20). But if you encode the whole link, your merge tags get encoded too and your platform can no longer replace them.

Why encoding matters: the rule is encode everything except your merge tags. Get it wrong and the link is either rejected as invalid, or your platform can't fill in its tags. Those are the two most common reasons a link "doesn't work". You never have to encode anything by hand: the Link Builder in the app handles the encoding for you. Pick your platform, type your tags, and copy a link that is already correct.
A raw link that opens in your browser can still be rejected as invalid by strict senders like WhatsApp through ActiveCampaign. Build the link in the app and test with a real send rather than pasting the URL into a browser, where the tag shows literally because nothing has replaced it yet.
Build a link in the app

Analytics

Even though a Dynamic Link doesn't store an event, every click is tracked. Open the analytics dashboard for any key to see performance over any date range, with the option to count each visitor once.

  • Total and unique clicks over time, so you can see trends and de-duplicate repeat visitors.
  • Calendar service split: which apps (Google, Apple, Outlook and more) your audience adds to.
  • Per-event breakdown: clicks grouped by the title and date each link describes, plus filters by event title and date.
  • Referrers, countries, devices and browsers for every link, or rolled up across all your keys.