Google Calendar Integration
Set up Google Calendar for automatic interview scheduling sync. Covers self-hosted OAuth app configuration and per-user connection.
Google Calendar Integration
Reqcore integrates with Google Calendar to keep interview schedules in sync automatically. When an interview is scheduled, a calendar event is created and both the interviewer and candidate are added as attendees. RSVP responses from Google Calendar sync back to Reqcore in real-time via webhooks.
How it works
- An admin configures a Google OAuth app once at the server level (self-hosted only — reqcore.com handles this for cloud users)
- Each user connects their own Google account from Settings → Integrations
- Reqcore creates calendar events on that user's calendar when interviews are scheduled
- When a candidate accepts or declines the invite in Google Calendar, Reqcore reflects that response automatically
Cloud vs. self-hosted
| reqcore.com (cloud) | Self-hosted | |
|---|---|---|
| OAuth app setup | Managed by reqcore — nothing to do | You create and manage your own Google OAuth app |
| User connection | Click "Connect" → done | Admin sets up env vars first, then users click "Connect" |
| Google API quota | Shared across all cloud users | Your own project — full quota |
| Data residency | reqcore's infrastructure | Your infrastructure |
If you are using reqcore.com, skip to Connecting your account. The steps below are only required for self-hosted instances.
Self-hosted setup
You need to create a Google OAuth 2.0 app and provide two environment variables: GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET.
This is a one-time setup done by whoever administers the Reqcore server. Users do not need to touch Google Cloud.
Step 1 — Create a Google Cloud project
- Go to console.cloud.google.com
- Click the project dropdown in the top navigation bar, then click New Project
- Give it a name (e.g.
Reqcore) and click Create - Make sure the new project is selected in the dropdown before continuing
Step 2 — Enable the Google Calendar API
- In the left sidebar, go to APIs & Services → Library
- Search for
Google Calendar API - Click on it and click Enable
Step 3 — Configure the OAuth consent screen
- Go to APIs & Services → OAuth consent screen
- Choose your user type:
- Internal — only available if your organization uses Google Workspace. Recommended for company-internal deployments. No verification required.
- External — for personal Gmail accounts or mixed deployments. Up to 100 test users can connect without Google verification (sufficient for most self-hosted deployments).
- Click Create
- Fill in the required fields:
- App name:
Reqcore(or your company name) - User support email: your email address
- Developer contact information: your email address
- App name:
- Click Save and Continue
Add scopes
On the Scopes page, click Add or Remove Scopes and add the following:
| Scope | Purpose |
|---|---|
https://www.googleapis.com/auth/calendar.events | Create, update, and delete calendar events |
https://www.googleapis.com/auth/userinfo.email | Display the connected account email in settings |
Click Update, then Save and Continue.
Add test users (External apps only)
If you chose External user type, add each person who will use the calendar integration as a test user on the next screen. They must have a Google account (Gmail or Google Workspace).
Note: You can add up to 100 test users without Google verification. For larger deployments, submit your app for verification via the OAuth consent screen dashboard.
Click Save and Continue, then Back to Dashboard.
Step 4 — Create OAuth 2.0 credentials
- Go to APIs & Services → Credentials
- Click Create Credentials → OAuth client ID
- Set Application type to
Web application - Give it a name (e.g.
Reqcore Web) - Under Authorized redirect URIs, click Add URI and enter:
https://your-domain.com/api/calendar/google/callback
Replaceyour-domain.comwith the value of yourBETTER_AUTH_URLenvironment variable. For example, ifBETTER_AUTH_URL=https://recruiting.mycompany.com, the redirect URI is:https://recruiting.mycompany.com/api/calendar/google/callbackThe redirect URI must exactly match what is set in
BETTER_AUTH_URL. An HTTP/HTTPS mismatch or a trailing slash will cause the OAuth flow to fail. - Click Create
- A dialog shows your Client ID and Client Secret — copy both now (you can retrieve them later from the Credentials page)
Step 5 — Set environment variables
Add the following to your environment configuration (.env, docker-compose.yml, or your hosting platform's secret manager):
GOOGLE_CLIENT_ID=your-client-id.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=GOCSPX-your-client-secret
Docker Compose — add to the environment section of the app service in docker-compose.yml:
environment:
GOOGLE_CLIENT_ID: "your-client-id.apps.googleusercontent.com"
GOOGLE_CLIENT_SECRET: "GOCSPX-your-client-secret"
Railway — add both variables in your service's Variables tab.
Step 6 — Restart and verify
Restart the Reqcore server to pick up the new variables. Then:
- Log in to your Reqcore instance and go to Settings → Integrations
- The Google Calendar card should now show a Connect Google Calendar button instead of "Not configured"
- The integration is ready for users to connect
Connecting your account
Once the integration is configured (or if you're on reqcore.com), any team member can connect their Google Calendar:
- Go to Settings → Integrations
- Click Connect Google Calendar
- You'll be redirected to Google's sign-in and consent screen — select your account and click Allow
- You'll return to the Integrations page with a confirmation message
After connecting:
- New interviews you schedule will automatically create a Google Calendar event
- The candidate and any co-interviewers are added as attendees
- They'll receive a calendar invite and can accept or decline from their calendar
- RSVP responses appear in Reqcore within seconds via webhook
You can disconnect at any time from the same page. Tokens are encrypted at rest using your BETTER_AUTH_SECRET.
Troubleshooting
"Not configured" badge on the integrations page
The GOOGLE_CLIENT_ID or GOOGLE_CLIENT_SECRET environment variables are missing or empty. Double-check the values and restart the server.
"redirect_uri_mismatch" error from Google
The redirect URI registered in Google Cloud Console doesn't match what Reqcore is using. The URI Reqcore uses is derived from BETTER_AUTH_URL:
{BETTER_AUTH_URL}/api/calendar/google/callback
Go to Google Cloud Console → APIs & Services → Credentials, edit your OAuth client, and make sure the redirect URI matches exactly (including https://, no trailing slash).
"Access blocked: This app's request is invalid" (external apps)
Your Google account is not on the test users list. Go to the OAuth consent screen in Google Cloud Console and add your email under Test users.
"Failed to obtain OAuth tokens"
This happens if Google does not return a refresh token. This can occur if the user previously granted access and the consent screen was not shown again. Reqcore uses prompt: 'consent' to force re-consent, so this should not happen in normal use. If it does, the user can disconnect and reconnect to force a new consent prompt.
Two-way sync shows "Pending setup"
The webhook registration happens automatically after connecting. If it shows "Pending setup" for more than a minute, the webhook may have failed to register — this is usually a network issue where Google cannot reach your server URL. Verify your instance is publicly accessible at the BETTER_AUTH_URL address.
Self-hosted instances on a private network (not publicly accessible) will not receive webhook push notifications. Calendar events will still be created, but RSVP responses won't sync back automatically.
Related
- Environment Variables — Full environment variable reference
- Docker Compose Deployment — Self-hosted deployment guide
- Interview Scheduling — How interviews fit into the candidate workflow