Pro - connecting a sheet requires Pro.
Connecting a sheet
- Open a form in the dashboard → Automations → Google Sheets.
- Copy the service-account address shown on the card. It looks like
formpaste-sheets@…iam.gserviceaccount.com. - In Google Sheets, open your sheet → Share → paste that address → give it Editor access → Share.
- Back in Formpaste, paste the sheet’s URL (or just its ID), turn the toggle on, and save.
https://docs.google.com/spreadsheets/d/<ID>/edit#gid=0 - and we extract the ID for you.
What a row looks like
The first submission writes the header row: a_submitted_at column, then one column per
form field, using your field name attributes.
_submitted_at is when the submission was received (ISO 8601, UTC), not when the row
was written - so the timestamp still means what you expect if a row arrives after a retry.
When a form gains a new field
Say you add aphone field to your form after the sheet already exists. Formpaste adds a
phone column to the right of your existing headers and fills it, rather than silently
dropping the value.
This is deliberate, and it is the main way we differ from other form backends: a submission
should never be quietly lost because a column did not exist yet. The same principle is why
spam goes to a quarantine folder instead of being deleted.
A few consequences worth knowing:
- New columns are appended at the end, never inserted in the middle - your existing column layout is never shifted.
- You can reorder or rename columns in the sheet. We read row 1 before every append and match your field names to whatever headers are there now.
- A header with no matching field in a given submission gets an empty cell, so rows stay aligned.
- Renaming a header to something your form does not send means we treat it as a new field next time and add the column back. Rename the form field instead if you want the column to follow.
When it fires
A row is appended for each delivered, non-spam submission - the same ones that generate a notification email. Quarantined (spam) submissions do not reach your sheet. Appending is best-effort and independent of email: a Sheets failure never blocks, delays, or retries your email notification.Values are never formulas
Submitted values are written as literal text. If a visitor submits=IMPORTRANGE(...)
or =HYPERLINK(...), the cell shows that text; it does not execute inside your spreadsheet.
This is deliberate - a form is an untrusted input, and a formula running in your sheet on a
stranger’s say-so would be a real security problem.
When something goes wrong
The card tells you what to fix, in plain language:
These three are configuration problems, so we do not retry them - retrying cannot fix a
permission setting. Fix the cause and submit again; the warning clears as soon as you save a
new configuration.
Temporary problems (Google rate-limiting us, a Sheets outage) are retried automatically and
never show an error, because there is nothing for you to fix.
Limits & behaviour
- One sheet per form. Several forms can point at the same sheet if you want them combined, though a sheet per form is usually easier to read.
- Appends are serialized, so two submissions arriving at the same moment cannot interleave and corrupt the header row.
- Rows normally appear within seconds of the notification email.
- We only ever read row 1 (your headers) and append rows. We never read the rest of your sheet’s contents.
- Google’s own limit of 10 million cells per spreadsheet applies - roughly two million submissions at five columns.
Free vs. Pro
Free forms cannot connect a sheet. Attempting to enable it on Free returns:
Turning the integration off always works, on any plan - so downgrading never traps you
with an integration you cannot disable.
Zero-config
Nothing is sent to any sheet until you connect one on a Pro form. A new form writes nowhere.Prefer to route submissions somewhere else - a CRM, a database, Slack? Use
webhooks with an automation platform. Sheets is the one destination
we built natively, because “where do my submissions go” is answered by a spreadsheet more
often than by anything else.