How to Connect Google Sheets and Google Calendar in WordPress
You can connect Google Sheets and Google Calendar in WordPress using Krom Automation Pro. One service account JSON file authenticates both Google services, so you configure credentials once and use them across any number of workflows. The integration covers logging WordPress events to a sheet, creating calendar events from a sheet row, and running both directions from a single workflow.
Most tutorials reach for Google Apps Script or a third-party SaaS tool. Apps Script works, but it lives outside WordPress, has no execution history inside your admin, and breaks silently when a sheet column shifts. Krom Automation keeps everything inside your WordPress install, with per-step execution logs, automatic retry on failure, and a visual canvas you can hand to a client without explanation.
This guide covers the exact setup steps, what syncs and what does not, the three failure modes you will actually hit, and the cases where this approach is the wrong fit. Browse the full feature list if you want the broader picture before diving in.
What Gets Synced: Field Map
Before touching any settings, confirm what data moves where. The table below shows the field on the left and where it lands on the right. Both directions are covered because a single workflow can do both at once.
| Source field | Destination | Notes |
|---|---|---|
| Trigger data (post title, user email, order ID) | Google Sheets cell via merge tag | Any merge tag from the trigger works. See the merge tags documentation for the full list. |
| Workflow timestamp | Google Sheets date column | ISO 8601 format. Format as a date in the sheet itself. |
| Execution status | Google Sheets status column | Useful for audit logs. Write “Completed” as a static string. |
| Sheet row: event title | Google Calendar event summary field | Map to the Summary field in the Create Calendar Event action. |
| Sheet row: start datetime | Google Calendar event start | Must be ISO 8601. Format: 2026-09-01T09:00:00+01:00. |
| Sheet row: end datetime | Google Calendar event end | Same format requirement as start. |
| Sheet row: description | Google Calendar event description | Plain text. HTML is stripped. |
| Sheet row: location | Google Calendar event location | Free text string. Address or room name both work. |
| Sheet row: attendee email(s) | Google Calendar attendees list | Comma-separated. Calendar sends invite emails if notifications are on. |
The reverse direction, pulling calendar events back into a sheet on a schedule, requires a Schedule trigger combined with an HTTP Request action calling the Google Calendar API. That is a more advanced pattern and is covered in the troubleshooting section below.
The Key Insight: One Service Account for Both
Every other guide treats Google Sheets and Google Calendar as two separate credential setups. In Krom Automation, both integrations use the same service account JSON. You upload the file once, and every subsequent Sheets action and Calendar action in every workflow can reference it without re-authenticating.
Configuring credentials once and reusing them across every workflow is not a convenience feature. It is the difference between a maintainable integration and one that breaks when someone rotates a key.
This matters at scale. If you manage 20 client sites and each one has separate OAuth tokens per integration, a token rotation breaks them individually and silently.
A service account credential is controlled at the Google Cloud project level. You rotate it once and update a single JSON file across all sites.
Requirements Before You Start
- Krom Automation Pro installed and active (free version does not include the Google integrations)
- WordPress 6.2 or higher, PHP 7.4 or higher
- A Google Cloud project with the Google Sheets API and Google Calendar API both enabled
- A service account created inside that project, with a JSON key downloaded
- The service account email address added as an editor on the target Google Sheet
- The service account email address added as an editor on the target Google Calendar
The last two steps are the ones people miss. A service account that cannot write to a sheet or calendar will fail silently in Apps Script but will log a clear error in Krom Automation’s execution history.
Step-by-Step Setup
Step 1: Create the Google Cloud Service Account
- Go to console.cloud.google.com and open or create a project.
- Navigate to APIs & Services > Library. Search for and enable Google Sheets API. Repeat for Google Calendar API.
- Go to APIs & Services > Credentials. Click Create Credentials > Service account.
- Give it a name, click Create and Continue, skip the optional role and user fields, then click Done.
- Click the service account you just created. Go to the Keys tab. Click Add Key > Create new key. Select JSON. Download the file.
Store the JSON file securely. It is a credential, not a config file. Do not commit it to a repository.
Step 2: Share Your Sheet and Calendar with the Service Account
- Open the target Google Sheet. Click Share. Paste the service account email (it ends in @your-project.iam.gserviceaccount.com). Set permission to Editor. Uncheck “Notify people”. Click Share.
- Open Google Calendar. Find your target calendar in the left sidebar. Click the three-dot menu next to it, then Settings and sharing. Scroll to Share with specific people or groups. Add the service account email. Set permission to Make changes to events. Save.
Step 3: Connect the Service Account in Krom Automation
- In your WordPress admin, go to Krom Automation > Integrations.
- Click Google Sheets. Click Connect.
- In the Service Account JSON field, paste the full contents of the JSON file you downloaded. Click Save.
- Click Google Calendar. Click Connect. The same JSON field appears. Paste the same file contents. Click Save.
Both integrations now share the same credential. The full setup detail is in the Google Sheets and Google Calendar integrations documentation.
Step 4: Build the Workflow
This example workflow triggers when a WooCommerce order completes, logs the order to a Google Sheet, and simultaneously creates a Google Calendar event for the fulfilment team.
- Go to Krom Automation > Workflows. Click Add New.
- On the canvas, click the trigger node. Select WooCommerce: Order Completed from the trigger list.
- Add your first action node. Select Google Sheets: Append Row.
- In the action settings panel, set Spreadsheet ID to the ID from your sheet URL (the long string between /d/ and /edit). Set Sheet Name to the exact tab name, for example Orders. Map your columns using merge tags: {{order.id}}, {{order.total}}, {{customer.email}}, {{workflow.executed_at}}.
- Add a second action node from the same trigger. Select Google Calendar: Create Event.
- Set Calendar ID to your calendar’s ID (found in Google Calendar settings under Integrate calendar, formatted as an email address). Set Summary to Fulfil Order #{{order.id}}. Set Start and End to tomorrow at 09:00 and 09:30 using the date merge tag with an offset. Set Description to Customer: {{customer.name}}, {{customer.email}}.
- Click Save. Toggle the workflow to Active.
Because both action nodes branch from the same trigger, they execute in parallel. The sheet append and calendar event creation happen together, not sequentially. If one fails, the execution log flags it individually without blocking the other.
Running sheet logging and calendar creation as parallel branches means one failure does not silently block the other. That is the kind of thing you only discover you needed after it goes wrong.
Step 5: Test with the Workflow Simulator
Before going live, use the built-in workflow simulator to run a dry test with zero side effects. The simulator shows you exactly what data would be written to each action without touching your live sheet or calendar. Check that the merge tags resolve to real values and that the datetime format is correct.
Logging to a Sheet Only: The Audit Log Pattern
Not every workflow needs a calendar event. The audit log pattern uses a single Google Sheets: Append Row action attached to any trigger. Common examples include:
- User registrations logged with timestamp, email and referring URL
- Form submissions logged from Gravity Forms, WPForms, or Fluent Forms with all field values
- WooCommerce order status changes with old status, new status and order value
- Failed login attempts logged with username and IP address
This pattern requires no calendar access. The service account only needs editor access on the target sheet. For form-based logging, the Gravity Forms integration and WPForms integration both expose all submitted field values as merge tags you can map directly to sheet columns.
What Does NOT Transfer or What Breaks
Every integration guide should have this section. Nobody else writes it, which is exactly why it is the most useful part.
| Limitation | Impact | Workaround |
|---|---|---|
| Calendar events cannot be updated or deleted by Krom Automation | If an order is refunded or a post is unpublished, the calendar event stays | Add a separate workflow on the relevant trigger to create a new “Cancelled” event, or use the HTTP Request action to call the Calendar API directly |
| Sheet rows cannot be updated in place | Append Row always adds a new row. There is no “find row and update” action in the current Pro release | Log a new row with a status column. Use a formula in the sheet to show the latest status per ID |
| Attendee invite emails depend on calendar notification settings | If your calendar has notifications turned off, attendees are added silently | Add a Send Email action in the same workflow for guaranteed delivery |
| Datetime merge tags output UTC by default | A 09:00 local time event lands in the wrong slot if timezone offset is not appended | Use the offset format in the merge tag, or configure your WordPress timezone setting correctly under Settings > General |
| Recurring events are not supported via the Create Event action | You cannot set a weekly repeat rule through the current action fields | Use the HTTP Request action to call the Calendar API with a recurrence array in the request body |
| Pulling calendar events back into WordPress is not a built-in action | Calendar-to-sheet sync requires an HTTP Request to the Calendar API on a schedule | Use a Schedule trigger with an HTTP Request action calling events.list on the Calendar API, then a Sheets append for each returned event |
The “find row and update” limitation is the one agencies hit most often. If your use case requires updating a row when an order status changes, design the sheet with an append-only log from the start and use a Google Sheets formula to surface the current status. That is more robust than an in-place update anyway, because you retain the full history.
Troubleshooting: The Three Real Failure Modes
Failure Mode 1: Permission Denied on Append or Create
The action executes but logs a 403 error. This almost always means the service account email is not an editor on the target sheet or calendar.
Double-check by opening the sheet, clicking Share, and confirming the service account email appears with Editor permission. On the calendar side, go to Settings and sharing and confirm the service account appears under “Share with specific people” with “Make changes to events” selected.
A second cause is that the API is not enabled in the Cloud project. Return to APIs & Services > Library and confirm both Google Sheets API and Google Calendar API show a green “API enabled” status.
Failure Mode 2: Invalid Datetime Format on Calendar Create
The calendar event fails to create and the execution log shows a 400 error with a message referencing the start or end field. Google Calendar requires full ISO 8601 format including timezone offset. 2026-09-01T09:00:00 will fail.
2026-09-01T09:00:00+01:00 will succeed. Check your WordPress timezone setting under Settings > General and ensure the merge tag you are using outputs the offset.
Failure Mode 3: Workflow Fires but Nothing Appears in the Sheet
The execution log shows success but no new row appears. The most common cause is a mismatch between the Sheet Name field in the action and the actual tab name in the spreadsheet. The field is case-sensitive and space-sensitive.
“Orders ” with a trailing space is not the same as “Orders”. Copy the tab name directly from the sheet rather than typing it.
A second cause is writing to the wrong spreadsheet. The Spreadsheet ID in the action must match the ID in the sheet’s URL. Confirm by checking the URL: docs.google.com/spreadsheets/d/THIS_IS_THE_ID/edit.
Cost to Run This vs. the Alternatives
| Approach | Year 1 cost | Year 2+ cost | Maintenance burden | Execution visibility |
|---|---|---|---|---|
| Krom Automation Pro (1 site) | $119 | $119/year or $0 after lifetime | Low. Managed inside WordPress. | Full per-step execution log |
| Krom Automation Pro (lifetime, 1 site) | $299 once | $0 | Low. No renewal to track. | Full per-step execution log |
| Zapier (Professional plan, ~1,000 tasks/month) | ~$228 | ~$228/year | Low inside Zapier, but data leaves your server | Task history, limited detail |
| Google Apps Script | $0 | $0 | High. No UI, breaks silently, developer required to debug | None inside WordPress |
| Make (Integromat) Core plan | ~$96 | ~$96/year | Medium. External platform to learn and maintain | Scenario history, external |
The lifetime plan at $299 is the number to focus on for agency use. Across 5 client sites on the Standard plan ($499 lifetime), the per-site cost is $100 once, with no annual renewal and no per-execution charges. Zapier at ~$228/year per account adds up fast when you are managing a portfolio of sites.
Apps Script costs nothing and breaks invisibly. That is a trade-off that only looks good until something stops working on a client site at midnight.
The free vs Pro comparison breaks down every feature gate if you want to confirm exactly what requires Pro before purchasing.
Who Should Use This Approach and Who Should Not
This setup is the right fit when:
- Your automation starts with a WordPress event (order, registration, form submission, post publish)
- You want execution logs and failure alerts inside WordPress, not in a third-party dashboard
- You are managing multiple client sites and want a single credential pattern
- You need the data to stay on your server, not pass through a SaaS intermediary
This approach is not the right fit when:
- You need true bidirectional, real-time sync where calendar changes push back to WordPress automatically
- You need to update existing sheet rows rather than append new ones
- The trigger is entirely outside WordPress (for example, a calendar event created in the Google Calendar UI triggering an action elsewhere)
- You need recurring event rules via the Create Event action
For purely external automation between Google products with no WordPress involvement, a tool like Zapier or Make is the correct choice. Krom Automation is WordPress-native. If WordPress is not the starting or ending point, it is the wrong layer for the integration.
If you work with other automation patterns, the post on 20 WordPress automations most sites should have covers how the Google Sheets logging pattern fits into a broader automation stack.
Related Workflows Worth Building Next
Once Sheets and Calendar are connected, the same service account credential is already available for every other workflow on that site. Common next steps include:
- Logging FluentCRM contact activity to a sheet for reporting. See the FluentCRM integration documentation.
- Creating a calendar event when a MemberPress subscription expires, to trigger a manual renewal call. See the MemberPress integration documentation.
- Logging LearnDash course completions to a sheet for training record compliance. See the LearnDash integration documentation.
- Sending a Slack or Discord message alongside the sheet append, so the team sees the log entry in real time. See the messaging integrations documentation.
If you are building a full automation stack across client sites, the automation stack we deploy on every client build explains how these patterns layer together.
Also from wpRigel
Pollify is wpRigel’s Gutenberg-native poll, survey and quiz plugin. Polls are built as real blocks inside the editor, with no shortcodes and no separate admin interface. Results export to CSV, Excel, PDF and Word, and the Pro tier adds NPS voting, IP blocking and enriched analytics.
Commandify is a command palette for the WordPress admin. Press Cmd or Ctrl plus K to search everything, jump to any screen, and run admin actions without navigating menus. It is the only command palette with genuine WooCommerce depth, covering orders, products, variations and customers as first-class commands.
Verdict
The Google Sheets and Google Calendar integration in WordPress is straightforward when you treat both services as a single credential problem. One service account JSON, shared once, authenticates both. Every workflow that follows can append to a sheet, create a calendar event, or do both in parallel without any additional authentication setup.
The limitations are real. Row updates, recurring events and calendar-to-WordPress sync require workarounds or raw API calls.
If those are your core requirements, be clear about that before you build. For the cases it does cover, the per-step execution log and automatic retry put it ahead of every Apps Script implementation we have seen survive longer than six months on a real client site.
Download the free version from the WordPress.org plugin directory to explore the canvas and the free triggers. The Google integrations require Pro, which starts at $119 per year for one site or $299 as a lifetime licence. See full pricing details and compare plans before deciding.
Frequently Asked Questions
Does the Google Sheets and Google Calendar integration require Krom Automation Pro?
Yes. Both Google integrations are Pro-only features.
The free version of Krom Automation includes 16 triggers, 21 actions and the full visual workflow builder, but the Google Sheets and Google Calendar actions are not included. Pro starts at $119 per year for one site.
Can one service account JSON file connect both Google Sheets and Google Calendar?
Yes, and this is the setup we recommend. In Krom Automation’s integrations panel, you paste the same JSON into both the Google Sheets connection and the Google Calendar connection. Both integrations authenticate through the same service account from that point forward.
What happens if the Google Sheets action succeeds but the Calendar action fails?
Each action node is logged independently. A failure in the Calendar action does not roll back the Sheets append.
The execution log flags the failed node, sends a failure notification to the email address you configure, and retries automatically with configurable backoff. You can inspect exactly which step failed and why without losing the data that did succeed.
Can I update an existing sheet row when an order status changes, rather than appending a new one?
Not with the current Append Row action. Krom Automation’s Google Sheets action appends new rows only.
The recommended pattern is to log every status change as a new row with a status column, then use a Google Sheets formula such as MAXIFS to surface the most recent status per order ID. This preserves a full audit trail rather than overwriting history.
Does this integration work in real time, or does it depend on WP-Cron?
Workflows triggered by WordPress events (order completed, user registered, form submitted) execute immediately when the trigger fires, via Action Scheduler rather than WP-Cron. Delays depend on WP-Cron only if you add a Delay action to the workflow. On low-traffic sites where WP-Cron fires infrequently, configure a real server cron to call wp-cron.php on a schedule to ensure delays land on time.
Can I log form submissions from Gravity Forms or WPForms to Google Sheets automatically?
Yes. Both form plugins expose all submitted field values as merge tags inside Krom Automation.
Set the trigger to the relevant form submission event, add a Google Sheets: Append Row action, and map each field merge tag to a sheet column. The Gravity Forms integration documentation covers the exact trigger and field names.