Log icon
Create icon
SheetModifiedTrigger icon

Sync Google Sheets article pitches into Airtable

Automate a Google Sheets to Airtable sync with Kestra. Poll a pitch submission sheet hourly and create Airtable records for editorial review.

Categories
Business

Keep your editorial intake in sync without manual copy and paste. This blueprint watches a Google Sheet that captures article pitch submissions (title, author, and URL per row) and automatically creates a matching record in an Airtable table for review and assignment. It closes the gap between a lightweight submission form backed by Sheets and the structured Airtable base where your team triages, assigns, and tracks each pitch, so nothing slips through and no one has to babysit a spreadsheet.

How it works

  • A scheduled trigger, io.kestra.plugin.googleworkspace.sheets.SheetModifiedTrigger, polls the spreadsheet on a fixed interval (every hour by default) and fires on CREATE_OR_UPDATE revisions. With includeDetails: true it computes a detailed diff and exposes the changed rows on trigger.modifications.
  • The log_sheet_changes task (io.kestra.plugin.core.log.Log) prints trigger.modifications as JSON so you can confirm the payload shape before mapping fields.
  • The create_airtable_record task (io.kestra.plugin.airtable.records.Create) writes a new row into the Editorial Pitches table, mapping Title, Author, and URL from the modified rows. It uses typecast: true so Airtable coerces values into the right column types, and runIf: "{{ trigger.count > 0 }}" so it only runs when there is an actual change to sync.

What you get

  • Hands-off intake: new and updated pitches flow from Sheets into Airtable on their own.
  • A single source of truth for editorial triage in Airtable.
  • Visibility into every detected sheet change through the logged trigger payload.
  • Idempotent guarding via runIf so empty polls do nothing.

Who it's for

  • Editorial and content teams running a pitch submission pipeline.
  • Operations and RevOps engineers wiring form-backed Sheets into Airtable bases.
  • Anyone who needs a reliable Sheets to Airtable bridge without writing a custom script.

Why orchestrate this with Kestra

Google Sheets has no native scheduler that can react to a row change and call the Airtable API, and Airtable cannot reach back into your sheet. Kestra fills that gap with an event style polling trigger, declarative YAML you can version control, automatic retries on transient API failures, and full execution lineage so you can see exactly which pitch synced when. The stopAfter setting halts polling on FAILED or KILLED states to avoid repeated bad runs.

Prerequisites

  • A Google Cloud service account with access to the source spreadsheet.
  • An Airtable base and a table named Editorial Pitches (or your own) with Title, Author, and URL columns.

Secrets

  • GOOGLE_SHEET_ID: the ID of the Google Sheet to watch.
  • GCP_SERVICE_ACCOUNT_JSON: the service account JSON key used to read the sheet.
  • AIRTABLE_API_KEY: an Airtable personal access token or API key.
  • AIRTABLE_BASE_ID: the ID of the target Airtable base.

Quick start

  1. Add the four secrets above to your Kestra instance.
  2. Set sheetName and range to match where your pitch rows live (defaults: Pitches, A1:Z100).
  3. Confirm the fields expressions match the JSON shape printed by log_sheet_changes, then adjust the trigger.modifications paths if your sheet diff differs.
  4. Enable the flow and submit a test pitch row to watch the record appear in Airtable.

How to extend

  • Loop over all changed rows instead of trigger.modifications[0] to batch multiple pitches per poll.
  • Add a Slack or email notification after the Airtable write to alert editors of new pitches.
  • Enrich each record with a status field, assignee, or submission timestamp before creating it.
  • Lower the polling interval for near real time intake, or add validation tasks to reject malformed rows.

Links

Share this Blueprint
See How

New to Kestra?

Use blueprints to kickstart your first workflows.