Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/ptshen/timeful-plus/llms.txt

Use this file to discover all available pages before exploring further.

Calendar integration lets participants skip the tedious drag-to-mark step. Once a calendar account is connected, Timeful reads existing events from your calendar and automatically fills in the availability grid — marking you as busy wherever you have conflicting appointments. Timeful only ever reads calendar data; it never creates, modifies, or deletes events without your explicit action.

Supported Calendar Providers

Google Calendar

Connect any Google Workspace or personal Gmail account. Supports multiple Google accounts simultaneously.

Microsoft Outlook / 365

Connect Outlook.com, Hotmail, or Microsoft 365 organizational accounts via Microsoft Graph.

Apple Calendar

Connect iCloud calendars via CalDAV using your Apple ID email and an app-specific password.
The calendar type is stored as a CalendarType string on each CalendarAccount record in the User document:
// From server/models/calendar.go
const (
    AppleCalendarType   CalendarType = "apple"
    GoogleCalendarType  CalendarType = "google"
    OutlookCalendarType CalendarType = "outlook"
)

How It Works

1

Authorize your calendar account

Click Add Calendar on the event page or in your account settings. Timeful redirects you to the provider’s OAuth consent screen (or prompts for CalDAV credentials for Apple).
2

Timeful fetches your events

After authorization, Timeful calls the calendar API read-only to retrieve your events for the date range covered by the poll. Events are stored as CalendarEvent objects in memory — they are never persisted to the Timeful database.
3

Availability grid is auto-filled

Timeful marks every time slot occupied by a calendar event as busy, pre-filling the grid on your behalf. You can review and adjust before submitting.
4

Toggle sub-calendars

If your account has multiple sub-calendars (e.g., “Work”, “Personal”, “Birthdays”), you can toggle each one on or off so only relevant calendars contribute to your availability.

OAuth Scopes and Permissions

Timeful requests the minimum read-only permissions required. No write access is ever requested.
The following OAuth 2.0 scopes are requested when a user connects a Google account:
ScopePurpose
https://www.googleapis.com/auth/calendar.events.readonlyRead calendar events to detect conflicts
https://www.googleapis.com/auth/calendar.calendarlist.readonlyList available sub-calendars for the toggle UI
https://www.googleapis.com/auth/contacts.readonlySuggest contacts when adding attendees to a poll
These are configured in your Google Cloud project’s OAuth consent screen. See Self-Hosting Configuration for step-by-step setup.

Multiple Calendar Accounts

Users can link multiple calendar accounts — including multiple Google accounts, an Outlook account, and an Apple account — all at the same time. Each account is stored as a separate entry in the CalendarAccounts map on the User document, keyed by {email}_{calendarType}:
// From server/models/user.go
// CalendarAccounts is a mapping from {`email_CALENDARTYPE` => CalendarAccount}
CalendarAccounts map[string]CalendarAccount `json:"calendarAccounts" bson:"calendarAccounts,omitempty"`
For example, a user with two Google accounts and one Outlook account would have three entries:
alice@gmail.com_google
alice@columbia.edu_google
alice@outlook.com_outlook
The account the user first signed in with is tracked separately as primaryAccountKey.

Sub-Calendar Toggling

Within each linked account, Timeful discovers all sub-calendars (e.g., Google’s “Work”, “Personal”, “US Holidays”) and lists them in the calendar settings panel. Each SubCalendar entry has an enabled flag:
// From server/models/calendar.go
type SubCalendar struct {
    Name    string `json:"name" bson:"name,omitempty"`
    Enabled *bool  `json:"enabled" bson:"enabled,omitempty"`
}
Participants can disable sub-calendars that shouldn’t count against their availability (e.g., turn off a “Birthdays” calendar so birthday reminders don’t block time slots).

Calendar Options

Additional autofill behavior is controlled by CalendarOptions on the User document and updated via PATCH /api/user/calendar-options:
// From server/models/calendar.go
type CalendarOptions struct {
    BufferTime   BufferTimeOptions   `json:"bufferTime" bson:"bufferTime"`
    WorkingHours WorkingHoursOptions `json:"workingHours" bson:"workingHours"`
}

type BufferTimeOptions struct {
    Enabled bool `json:"enabled" bson:"enabled"`
    Time    int  `json:"time" bson:"time"` // minutes
}

type WorkingHoursOptions struct {
    Enabled   bool    `json:"enabled" bson:"enabled"`
    StartTime float32 `json:"startTime" bson:"startTime"` // hour of day, e.g. 9.0
    EndTime   float32 `json:"endTime" bson:"endTime"`     // hour of day, e.g. 17.0
}
OptionDescription
Buffer timeAdd N minutes of padding before and after each calendar event when calculating availability, so back-to-back meetings leave breathing room.
Working hoursOnly count availability within a defined start/end hour window each day, regardless of what the calendar shows outside those hours.

Setting Up OAuth for Self-Hosted Deployments

To enable Google Calendar integration on your self-hosted instance:
  1. Go to Google Cloud Console and create or select a project.
  2. Enable Google Calendar API and Google People API for the project.
  3. Navigate to APIs & Services → Credentials → Create Credentials → OAuth 2.0 Client ID.
  4. Set the application type to Web application.
  5. Add the authorized redirect URI: https://yourdomain.com/api/auth/google/callback
  6. Copy the Client ID and Client Secret into your .env file:
    CLIENT_ID=your_google_client_id
    CLIENT_SECRET=your_google_client_secret
    
  7. Set BASE_URL=https://yourdomain.com so the callback URL matches.
For full details, see Self-Hosting Configuration.
Calendar integration is optional. Without Google or Microsoft OAuth credentials configured, users can still create and respond to polls anonymously — they simply won’t be able to auto-fill availability from their calendars.

Availability Groups

Use live calendar data to show real-time team availability without creating a new poll each time.

Self-Hosting Configuration

Full reference for all environment variables including OAuth credentials.

Build docs developers (and LLMs) love