Calendar
Import your meetings from Google Calendar or an .ics file (export from Outlook or Apple Calendar) and turn billable meetings into tracked time with one click.
Prerequisite: The Calendar module must be enabled (Settings → Modules). It depends on the CRM module. Import and deterministic matching are included in every plan; only the AI suggestions count toward your monthly AI quota.
How import works
Both sources — Google Calendar and .ics files — flow through the same pipeline:
- Events land as meeting activities on the CRM timeline. Attendees are stored as participants.
- Matching: Each meeting is matched to the right company or contact — first deterministically by exact email address (contact) or business domain (company), then optionally by AI for ambiguous cases.
- Review & bill: Ambiguous meetings land in the review queue. There you confirm the match and, if you like, create an unbilled time entry with one click — the hours are taken from the actual meeting duration.
Time entries are never created automatically — you confirm every one.
Connecting Google Calendar
- Open Settings → Calendar.
- Click Connect Google Calendar and grant read-only access (
calendar.readonly). - The first sync starts automatically once connected. After that, slonge syncs in the background roughly every 6 hours.
- Use Sync now to trigger a sync manually.
If the authorization expires, a Reconnect banner appears. Until you reconnect, syncing pauses — your already-imported meetings stay intact.
Importing an .ics file
- Export your calendar as
.ics(Outlook, Apple Calendar, and most apps support this). - Open Settings → Calendar and upload the file under ICS import.
- After processing you see a summary: imported, skipped, failed.
Recurring events, time zones, and cancellations
- Recurring series are imported as individual instances (±12 months around today), time-zone- and DST-correct.
- Time zones: Start and end times are stored as UTC; events without a time zone use the time zone configured in settings (default:
Europe/Zurich). - Cancellations: If a meeting is cancelled in Google, slonge marks the activity as cancelled — a time entry you already created is not deleted automatically. In the review queue you decide whether to keep or remove it.
- Non-billable: Declined meetings are skipped; purely internal meetings and meetings with no other attendees are imported as non-billable.
Billable or not? (AI)
For ambiguous meetings, the AI suggests whether the meeting is billable and which company it belongs to. If your AI quota is exhausted, the deterministic match is kept and the import continues normally — an import never fails because of the AI quota.
Which attendee data is stored? (Privacy / DSG-GDPR)
For each meeting, slonge stores the name and email address of attendees as meeting participants — this is required to match the meeting to the correct company or contact.
- Attendees that match no existing contact stay raw participant records and are not auto-promoted to contacts. This avoids silently building a marketing-reachable list.
- Matching to an existing contact never overwrites that contact's consent or do-not-email status (
doNotEmail, consent basis). - When you disconnect a calendar connection, the raw imported participant data for that connection is deleted. Deleting a contact also removes imported participant references to that contact. Contacts you have confirmed are left untouched.
- The compliance ledger records only a per-import summary (counts of imported/skipped/failed plus a checksum of the file name) — never the calendar content or attendee emails.
Via the CLI and AI assistants (MCP)
The same operations are available through the slonge CLI and compatible AI assistants:
slonge calendar import meetings.ics # import an ICS file → summary
slonge calendar sync # trigger a Google sync
slonge calendar review # list pending meetings
slonge calendar review --confirm <id> --client <id> [--project <id>]
slonge calendar review --dismiss <id>
When you pass --project on confirm, slonge also creates an unbilled time entry. The call is idempotent: a second call returns the same time entry.