Google Calendar Connector Guide

The Google Calendar connector lets Tealfabric workflows create and retrieve calendar events through Google Calendar APIs. It is useful for automating scheduling, operational reminders, and timeline synchronization across business systems.

Document information
FieldValue
Canonical URL/docs/04_connecting-systems/connectors/g/google-calendar
Version (published date)2026-05-08
Tagsconnectors, reference, google-calendar
Connector IDgoogle-calendar-1.0.0

Google Calendar connector flow showing OAuth-authenticated event creation, time-window event retrieval, and workflow-driven scheduling automation.

Configure OAuth access

Configure client_id, client_secret, and either access_token or refresh_token from your Google Cloud project. In production, use a refresh token so the connector can renew access automatically without manual token replacement.

Set redirect_uri, scope, and timeout_seconds as needed for your deployment. Before enabling workflows, complete OAuth consent and redirect URI configuration in Google Cloud Console.

Create events with send

Use send when your workflow needs to create meetings or operational events in a target calendar. Keep event payloads explicit for summary, start, end, and timezone fields so downstream participants receive accurate times.

const baseUrl = "https://api.example.com/api/v1";
const tenantId = "<TENANT_ID>";
const apiKey = "<API_KEY>";

async function createCalendarEvent(integrationId: string) {
  const response = await fetch(`${baseUrl}/integrations/${encodeURIComponent(integrationId)}/execute`, {
    method: "POST",
    headers: {
      "X-API-Key": apiKey,
      "X-Tenant-ID": tenantId,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      operation: "send",
      calendar_id: "primary",
      method: "POST",
      event: {
        summary: "Weekly Operations Review",
        description: "Review uptime, incidents, and release plan.",
        start: {
          dateTime: "2026-05-12T09:00:00",
          timeZone: "Europe/Oslo"
        },
        end: {
          dateTime: "2026-05-12T09:30:00",
          timeZone: "Europe/Oslo"
        }
      }
    }),
  });
  if (!response.ok) throw new Error(`Request failed: ${response.status}`);
  return response.json();
}
curl -X POST "https://api.example.com/api/v1/integrations/<ENTITY_ID>/execute" \
  -H "X-API-Key: <API_KEY>" \
  -H "X-Tenant-ID: <TENANT_ID>" \
  -H "Content-Type: application/json" \
  -d '{
    "operation": "send",
    "calendar_id": "primary",
    "method": "POST",
    "event": {
      "summary": "Weekly Operations Review",
      "description": "Review uptime, incidents, and release plan.",
      "start": {
        "dateTime": "2026-05-12T09:00:00",
        "timeZone": "Europe/Oslo"
      },
      "end": {
        "dateTime": "2026-05-12T09:30:00",
        "timeZone": "Europe/Oslo"
      }
    }
  }'
{
  "success": true,
  "result": {
    "id": "2s2h4g5d8ks9m0c1n2q3r4",
    "status": "confirmed"
  }
}

Retrieve event windows with receive

Use receive to list events in a time range for planning and scheduling logic. Time-bounded queries help avoid large payloads and make periodic sync workflows easier to control.

const baseUrl = "https://api.example.com/api/v1";
const tenantId = "<TENANT_ID>";
const apiKey = "<API_KEY>";

async function listUpcomingEvents(integrationId: string) {
  const response = await fetch(`${baseUrl}/integrations/${encodeURIComponent(integrationId)}/execute`, {
    method: "POST",
    headers: {
      "X-API-Key": apiKey,
      "X-Tenant-ID": tenantId,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      operation: "receive",
      calendar_id: "primary",
      timeMin: "2026-05-12T00:00:00Z",
      timeMax: "2026-05-19T00:00:00Z",
      singleEvents: true,
      orderBy: "startTime",
      maxResults: 50
    }),
  });
  if (!response.ok) throw new Error(`Request failed: ${response.status}`);
  return response.json();
}
curl -X POST "https://api.example.com/api/v1/integrations/<ENTITY_ID>/execute" \
  -H "X-API-Key: <API_KEY>" \
  -H "X-Tenant-ID: <TENANT_ID>" \
  -H "Content-Type: application/json" \
  -d '{
    "operation": "receive",
    "calendar_id": "primary",
    "timeMin": "2026-05-12T00:00:00Z",
    "timeMax": "2026-05-19T00:00:00Z",
    "singleEvents": true,
    "orderBy": "startTime",
    "maxResults": 50
  }'
{
  "success": true,
  "item_count": 2,
  "items": [
    {
      "id": "2s2h4g5d8ks9m0c1n2q3r4",
      "summary": "Weekly Operations Review"
    }
  ]
}

Reliability guidance

Most failures come from expired OAuth credentials, insufficient calendar scopes, or malformed event payloads. If a request fails, refresh authorization first, then validate required event fields for date-time and timezone consistency.

For production scheduling flows, keep event reads time-bounded, add retry/backoff on 429 responses, and monitor token refresh behavior. This keeps calendar automation stable as request volume grows.

Additional resources