Skip to content

Sync to Google Calendar

BuildWorkPro doesn’t ship a native Google Calendar integration via the public API — the in-app integration runs server-side, and customers who want their own pipeline build it themselves. This recipe shows the read side: pulling a unified event feed from BuildWorkPro that you can then push into Google Calendar (or Outlook, Notion, or wherever).

  1. Pick a date window.

    The /calendar/events endpoint accepts ISO 8601 start and end query params. The window can’t exceed 366 days.

    Terminal window
    START="2026-04-25T00:00:00Z"
    END="2026-05-25T00:00:00Z"
  2. Fetch the events.

    Terminal window
    curl -s -G https://app.buildworkpro.com/api/v1/calendar/events \
    -H "Authorization: Bearer ${BUILDWORKPRO_API_KEY}" \
    --data-urlencode "start=${START}" \
    --data-urlencode "end=${END}" \
    --data-urlencode "types=task,phase,bid"

    The response is a flat list of events aggregated across projects, tasks, phases, leads, bids, and activities:

    {
    "data": [
    {
    "id": 91,
    "type": "task",
    "title": "Pour foundation slab",
    "start": "2026-05-02T13:00:00.000Z",
    "end": "2026-05-02T17:00:00.000Z",
    "projectId": 14,
    "assignedTo": 3
    }
    ],
    "meta": { "request_id": "req_..." }
    }
  3. Push to Google Calendar.

    Use Google’s Events: insert endpoint with your own OAuth token. Map BuildWorkPro fields onto Google’s payload — title -> summary, start/end -> start.dateTime/end.dateTime, and put the BuildWorkPro id and type into extendedProperties.private so you can reconcile on the next sync.

    await calendar.events.insert({
    calendarId: 'primary',
    requestBody: {
    summary: bwpEvent.title,
    start: { dateTime: bwpEvent.start, timeZone: 'America/New_York' },
    end: { dateTime: bwpEvent.end, timeZone: 'America/New_York' },
    extendedProperties: { private: { bwp_id: String(bwpEvent.id), bwp_type: bwpEvent.type } },
    },
    });
  4. Schedule the sync.

    Run this on a cron — every 15 minutes is a reasonable starting cadence. On each tick, query the next 30-day window. Use the extendedProperties you stored to update existing Google events instead of creating duplicates.