# Best Practices

## Recommended setup

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th></tr></thead><tbody><tr><td><strong>Use the Calendars entity first</strong></td><td>Before setting up an Events data flow, run the "List of my calendars" entity to get all your calendar IDs and names. This makes it much easier to pick the right calendar when configuring your Events source.</td></tr><tr><td><strong>Set meaningful date ranges</strong></td><td>Always set both a start and end date for Events and Free/Busy reports. Leaving these open-ended can pull unexpected results. For ongoing reporting, use a rolling window that aligns with your reporting cadence — like the current month or current quarter.</td></tr><tr><td><strong>Use Append mode to build history</strong></td><td>Since Google Calendar only allows pulling data from the last 4 weeks, enable Append mode in your destination to accumulate a historical record over time. Each scheduled run will add new rows without overwriting past data.</td></tr><tr><td><strong>Combine multiple calendars with Append transformation</strong></td><td>If you need events from several calendars in one dataset, add multiple sources to the same data flow and use the Append transformation. This is cleaner than maintaining separate data flows for each calendar.</td></tr></tbody></table>

## Data refresh and scheduling

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th></tr></thead><tbody><tr><td><strong>Match refresh frequency to your use case</strong></td><td>For live scheduling dashboards, refresh every hour or every few hours. For weekly time-tracking reports, a daily refresh is sufficient. Avoid over-refreshing if your date range is narrow — you'll pull the same data repeatedly.</td></tr><tr><td><strong>Use "Updated since" for incremental runs</strong></td><td>The "Updated since" parameter on the Events entity lets you pull only events modified after a specific date. This is useful for catching last-minute changes like rescheduled or cancelled meetings without re-pulling your entire date range.</td></tr></tbody></table>

## Performance optimization

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th></tr></thead><tbody><tr><td><strong>Keep date windows tight</strong></td><td>Pulling 4 weeks of events from a busy calendar can return thousands of rows. Narrow your date range to what you actually need — this speeds up runs and avoids hitting row limits on lower-tier plans.</td></tr><tr><td><strong>Filter empty rows at the source</strong></td><td>Use advanced filters to exclude events where key fields like "summary" are empty. This prevents blank rows from cluttering your destination and keeps downstream formulas and charts clean.</td></tr></tbody></table>

## Common pitfalls

{% hint style="danger" %}
**Recurring events may show incorrect dates.** The date returned for a recurring event is often the original creation date, not the actual occurrence within your date range. Always verify recurring event data before using it in reports — and consider filtering by `updated` date rather than `start.dateTime` if accuracy is critical.
{% endhint %}

{% columns %}
{% column %}
**Do**

* Use Append mode to work around the 4-week historical limit
* Verify recurring event dates against Google Calendar directly
* Apply filters to remove blank rows before they reach your destination
* Use the `colorId` field to categorize events by type in your reports
  {% endcolumn %}

{% column %}
**Don't**

* Expect to pull data older than 4 weeks in a single run
* Use the `attendees` field in advanced filters — export it and filter downstream instead
* Assume times are already in your local timezone without checking DST offsets
* Overwrite your destination on every run if you need a historical record
  {% endcolumn %}
  {% endcolumns %}
