RecurSync
Privacy policy — the whole story, in plain English.
This covers RecurSync, my Zoho CRM extension that syncs recurring meetings between Google Calendar and the Zoho CRM Meetings module. It explains exactly what the extension touches, where that data sits, and what I can and can’t see.
Effective 8 August 2026 Last updated 29 September 2026
The short version
- RecurSync runs inside your own Zoho CRM org. Your calendar data travels only between Google and Zoho. The one thing I run is a small sign-in service that handles Google sign-in and renews access; it stores nothing and never sees your calendar events.
- It reads only the one calendar you pick, and only the handful of event fields it needs to build a matching CRM meeting.
- It never reads or stores your guest lists — no attendees, no organizer, no meeting links.
- I cannot see your data. No analytics, no tracking, no advertising, and nothing sold or shared. Not now, not later.
- Each person connects their own Google account, and can disconnect any time from the RecurSync tab in Zoho CRM.
Who I am
I’m Nate, and Finicky Fox is my one-person shop. RecurSync is a side project of mine — I built it because recurring meetings have never synced properly between Google Calendar and Zoho CRM, and after fourteen years of that gap going unfixed, I got tired of waiting.
One person wrote this extension, and one person answers the email about it. That’s me.
Where RecurSync runs — this is the important part
RecurSync is not a web service with a login. It is a set of functions that install into your own Zoho CRM org and execute there, on Zoho’s infrastructure, under your organization’s account. When it needs calendar data it talks directly from your Zoho org to Google’s API.
There is no Finicky Fox server anywhere in that path. I don’t have a database, a log collector, or a backend that receives your events — not because I promise not to look, but because no such thing exists. Your calendar data moves between two parties you already have a relationship with: Google and Zoho.
Two things are mine. One is the Google OAuth client — the registration
that tells Google “an app called RecurSync is asking for permission.” That’s
an identity record, not a pipe. The other is the small
sign-in service at auth.finickyfox.com, which handles
Google sign-in and access renewal and stores nothing. No calendar content is routed
through either of them to me.
What it asks Google for
When you click Connect, Google shows you a consent screen listing two permissions. Here they are, and here is precisely why each one is needed:
| Permission | What RecurSync does with it |
|---|---|
calendar.calendarlist.readonly |
Lists the calendars on your Google account so you can choose which one to sync, and confirms you own it. It gives no access to any event. |
calendar.events.owned |
Reads events on the calendar you chose, and creates, updates, or deletes the matching event when you change a meeting in CRM. This is the two-way sync itself. It only covers calendars you own — shared or subscribed calendars can’t be synced. |
Both are needed for the product to work at all — without write access the sync is one-directional, and without the calendar list you couldn’t pick a calendar. RecurSync asks for nothing beyond these two.
What it reads from Google Calendar
Only from the single calendar you selected, and only these fields:
- Title — becomes the CRM meeting title.
- Description — copied to the CRM description as written, including any links in it (a video-call link typed into the description comes across too). If your CRM admin turns on Google Notes, a cleaned-up copy with clickable links also goes into a “Google Notes” field on the meeting; scripts and any formatting beyond basic bold, lists and links are stripped.
- Location — copied to the CRM venue.
- Start and end times, plus whether it’s an all-day event.
- The recurrence rule — the pattern that makes it a weekly or monthly series. This is the whole reason the extension exists.
- The event’s ID and version tag, so it can match an event to its CRM record and tell whether it changed.
- Whether the event was cancelled, so the deletion can follow through.
- For a single changed occurrence of a series, which series it belongs to and its original start time, so the matching CRM occurrence can be updated.
What it deliberately does not touch
No attendees or guest lists. No organizer or creator identity. No Google Meet or conference data attached to the event (only what someone typed into the description). No attachments, colors, visibility flags, or reminders. No other calendar on your account, and no free/busy lookups of anyone else.
To be scrupulous about this: when Google returns an event, the raw response contains the full event record, guest list included — that’s just how the API replies. RecurSync reads only the fields listed above out of that response. Everything else is discarded in memory and is never stored, forwarded, or logged.
What it writes, and where
Into your Zoho CRM
Into the standard Meetings module: the title, description, venue, start and end times, all-day flag, recurrence pattern, and the CRM user who owns it. It also stamps a small hidden marker on meetings it created, so it can tell its own records apart from ones you made by hand.
It also keeps two hidden bookkeeping modules in your org:
- Sync Maps — the pairing table. It holds identifiers only: the Google event ID, the calendar ID, the CRM record ID, the owner’s email, a version tag, which side wrote last, and an integrity seal. No meeting titles, descriptions, locations, or people.
- Sync Profiles — one record per connected person: your Zoho login email, your CRM user ID, the address of the Google account you connected, which calendar you picked, whether sync is on, your encrypted Google tokens (see Sign-in and tokens), a position marker for where the last sync left off, the notification channel details, the last sync status or error, and an integrity seal.
Back into Google Calendar
When you create or edit a meeting in CRM, RecurSync writes the title, description, location, start and end times, your time zone, and the recurrence rule to the matching Google event — plus a hidden marker linking it back to the CRM record. If you edit just one occurrence of a series in CRM, only that occurrence is changed in Google (“this event only”). When you delete the meeting in CRM, it deletes the Google event.
It never adds attendees, invitations, or conferencing to your Google events. Nobody gets emailed because of RecurSync.
Google API Services User Data Policy
RecurSync’s use of information received from Google APIs adheres to the Google API Services User Data Policy, including the Limited Use requirements.
Concretely, that means Google Calendar data obtained through RecurSync is:
- used only to provide and improve the calendar-to-CRM sync you turned on;
- never transferred to anyone except as needed to provide that sync, or where the law requires it;
- never used for advertising, ad targeting, or building any profile of you;
- never sold, rented, or licensed to anyone, under any circumstances;
- never read by a human — including me — except in the narrow case described below, and then only with your explicit involvement.
That last exception is simply this: if you ask me for help and choose to send me a screenshot or an error message from your own org, I’ll read what you sent me in order to answer you. I have no way to obtain it otherwise, and I don’t keep it afterward.
Sign-in and tokens
When you click Connect Google Calendar in the RecurSync tab in Zoho CRM, a window opens on RecurSync’s
sign-in service at auth.finickyfox.com, which sends you to Google to approve
the two calendar permissions. Google returns a one-time code to the sign-in service, which
exchanges it for your tokens. Before anything is saved, it shows you which Google
account is being connected to which Zoho CRM user, and warns you if they differ;
nothing is connected until you click Continue. The sign-in only completes in the same
browser that started it.
The sign-in service seals your Google refresh token so that it can only be renewed through the sign-in service, and only for your own Sync Profile in your own organisation. It then hands the sealed token directly to your Zoho organisation, which stores it encrypted (AES-256) on your own Sync Profile record, under a key derived from a random secret generated for your organisation when RecurSync is installed. Whenever RecurSync needs fresh access (about once an hour while syncing), your Zoho org asks the sign-in service, which returns a short-lived access token. Those tokens are used for one thing: calling the Google Calendar API from your Zoho org to sync your chosen calendar.
What the sign-in service sees and keeps. It handles your tokens only while answering a request, and it stores nothing: no database, no logs of its own. To show you the confirmation, it reads your Google account’s address (the ID of your primary calendar). It never reads, receives or stores your calendar events. It runs on Cloudflare, which processes routine request information such as IP addresses to deliver the service. RecurSync’s own Google app secret lives only in the sign-in service, not in anyone’s Zoho org.
Each CRM user connects their own Google account. Your calendar syncs to meetings you own, and RecurSync only ever changes or removes your own meetings. Once a meeting is in Zoho CRM, who can see it follows your organisation’s normal CRM sharing rules, like any other meeting. Only a CRM administrator can turn Google Notes on or off.
You can withdraw access at any time from either end: click Disconnect in the RecurSync tab, or revoke it directly at myaccount.google.com/permissions. Either one stops the sync. Disconnect also deletes the token from your Zoho org and asks Google, through the sign-in service, to revoke RecurSync’s access; if that request can’t get through, removing RecurSync at the link above finishes the job.
Logs and error messages
When something goes wrong, RecurSync records the reason so you can see it in the RecurSync tab. I want to be straight about one detail: an error message can include the title of the meeting that failed — for example, “Push to Google failed for ‘Q3 budget review’.” That’s there so the message is actually useful rather than a mystery.
That error text is stored in your own Zoho org, on your Sync Profile record, and it is overwritten and cleared the next time a sync succeeds. It is not sent anywhere. It never reaches me unless you decide to show it to me.
Routine execution logs stay in your Zoho org too, under Setup → Functions, where your admin can read them. Those record record IDs and API responses — not meeting contents. Zoho controls how long they’re kept; I don’t have access to them.
Analytics and tracking — there aren’t any
The extension contains no analytics, no telemetry, no crash reporting, no advertising SDK, and no third-party scripts. The RecurSync tab talks to exactly one thing: your own Zoho org. It has no external network permissions at all, which you can verify in the extension’s manifest.
I don’t know how many meetings you sync, when you sync them, or what they’re called. I know how many organizations bought the extension, because Zoho tells me that on the payout report.
Keeping data — and deleting it
Since everything lives in your Zoho org, you are the one holding it, and you decide how long to keep it. Here is exactly what happens, including the parts that might surprise you:
When you click Disconnect:
- The notification channel with Google is shut down and syncing stops immediately, in both directions.
- The sync position marker and channel details are cleared from your profile.
- Meetings already synced into CRM stay where they are. They’re your business records at that point, and silently deleting a chunk of someone’s calendar history would be the wrong default.
- Your Sync Profile record and the Sync Map pairing rows are also kept, so that reconnecting later doesn’t duplicate everything.
If you want it all gone: delete the synced meetings in CRM, and have your admin delete your RecurSync Profile record and the associated Sync Map rows — they live in two hidden custom modules in your own org and your admin can remove them like any other records. Then revoke access at myaccount.google.com/permissions.
Uninstalling the extension first revokes every connected user’s Google access and stops the notification channels, then Zoho removes RecurSync’s functions. Whether Zoho also clears out the two hidden modules and the records in them is Zoho’s platform behavior, not something RecurSync controls — so if you need them gone for certain, delete the records first, then uninstall.
There’s nothing for me to delete on my end, because there’s nothing on my end: the sign-in service stores nothing. If you email me asking for deletion, the honest answer will be to walk you through the steps above in your own org — and I’m happy to do that.
Security
The strongest security property here is architectural: your calendar data has no extra place to leak from. There is no database of mine to steal, and the sign-in service holds no stored data at all. Google’s raw refresh token and RecurSync’s app secret are never in your Zoho org: the token stored there is encrypted with your organisation’s key and can only be renewed through the sign-in service, for your organisation and your profile.
All traffic between your Zoho org and Google runs over HTTPS. Access to the extension and its records is governed by your own Zoho CRM permissions — if someone can’t see a record in your org, RecurSync doesn’t change that. RecurSync’s own bookkeeping records (Sync Profiles and Sync Maps) are sealed with a secret generated for your organisation, and RecurSync ignores any record whose seal doesn’t match — so another CRM user can’t redirect someone else’s sync by editing those records through the CRM API. Your data’s security also depends on Google’s and Zoho’s own protections, which are documented in their respective privacy policies.
If you ever find a security problem in RecurSync, please tell me directly at hello@finickyfox.com. I’ll take it seriously and I won’t be defensive about it.
Your rights
Because RecurSync stores nothing outside your organization’s own systems, your organization — not me — controls the data and can access, correct, export, or delete it directly. For a copy of your data or its removal, your Zoho administrator is the fastest route, and the section above explains where everything sits.
If you’re in a place with rights under laws like the GDPR or the CCPA: I don’t hold your personal data, I don’t sell or share it, and there’s no profiling or automated decision-making in the extension. If you have a request I can actually help with, write to me and I’ll do what I can — including telling you plainly when the answer has to come from your own admin instead.
RecurSync is a business tool sold to organizations. It isn’t directed at children, and I don’t knowingly collect anything from anyone under 16.
Changes to this policy
If RecurSync ever starts handling data differently, I’ll update this page and change the “last updated” date at the top. If a change is significant — a new permission, a new place data goes — I’ll say so on the Zoho Marketplace listing too, rather than quietly editing this page and hoping nobody notices.
This URL is the permanent home of the policy. It won’t move.
Questions? Just ask.
If anything here is unclear, or you want to know whether RecurSync touches some specific piece of your data, email me and I’ll give you a straight answer.
Nate — Finicky Fox
hello@finickyfox.com
Minnesota, USA