Skip to main content

Help & Documentation

Everything you need to connect Google Sheets, send data to your sheet, and troubleshoot common issues.

1. Getting started

RowSink turns a Google Sheet into a live data endpoint. You add a sheet, get a unique URL, and send JSON to add rows to your sheet. No backend required.

  1. Sign up and complete account setup. Go to Get Started or Sign In.
  2. Share your Google Sheet with the RowSink service account as Editor. The email is: sheets@rowsink.iam.gserviceaccount.com. Copy it from the add-spreadsheet form or spreadsheet settings. Without this, we cannot write to your sheet.
  3. Add a spreadsheet from My Spreadsheets: paste the full Google Sheets URL and click "Check connection". RowSink will automatically verify that you have Editor access. In most cases this happens instantly; if we can't confirm your access automatically, you'll be asked to create a temporary tab with a specific name to prove you can edit the sheet (it's deleted automatically afterward). Once verified, choose the sheet tab and save.
  4. Get your endpoint. Each configuration has a unique URL:https://api.rowsink.com/v1/spreadsheets/:uuid/rowsThe :uuid is shown on the spreadsheet detail page.

2. Sending data (API reference)

Endpoint: POST https://api.rowsink.com/v1/spreadsheets/:uuid/rows

Headers: Content-Type: application/json. If the configuration has API key protection enabled, also send Authorization: Bearer YOUR_KEY_SECRET or Authorization: RowsinkKey YOUR_KEY_SECRET.

Body: A JSON object or array of objects. Keys become column headers; values become cell values. Empty body or non‑JSON returns 400.

code
code

Success response (200): { "success": true, "data": { "rowsQueued": N } }. Rows are queued and written to the sheet asynchronously. "Queued" means accepted; they are processed shortly after.

Error responses: 400 (invalid format / no data), 401 (missing or invalid API key when required), 404 (unknown UUID), 413 (body too large), 429 (rate limit exceeded). Response body includes an error message.

3. Rate limits & body size

Rate limits: 100 requests per minute per IP and 100 per spreadsheet (sliding window). Exceeding either limit returns 429 with Retry-After (seconds). Responses also include X-RateLimit-Limit and X-RateLimit-Remaining.

Request body: Must not exceed 200 KB. Larger payloads return 413 with "Request body must not exceed 200 KB".

4. How data is written to your sheet

  • Columns: JSON keys are collected from your payload to form column headers. We use the union of all keys across all objects in the request.See why this matters vs other tools →
  • Nested Objects: Nested objects are automatically flattened using dot notation. For example, {"user": {"name": "Alice"}} becomes a column named user.name.
  • Expand Nested Arrays: When enabled in settings, we create additional rows when your data contains arrays nested inside objects. A top-level list of records already appears as one row per item. However, if an object has a nested list (e.g., individual items in an order), this setting expands them into multiple rows.
  • Timestamp column (optional): When enabled, RowSink writes an automatic timestamp to column A for every row.
    • Smart Mode (Default): Writes high-precision numeric values synced to your spreadsheet's timezone. Recommended for easy sorting and filtering.
    • ISO 8601 Strings: Writes timestamps as plain text (e.g., "2026-02-16T18:00:00Z"). Enable this in settings if you need strict machine-readable strings for external processing.
  • Header row: Automatically managed. Rowsink writes a header row the very first time you send data. If you later send data with a different schema (new keys or different order), we automatically write a new header row before appending that data. This ensures your data always stays aligned with its corresponding headers without manual configuration.
  • Values: null / undefined → empty cell. Objects and arrays (if not expanded) are stringified as JSON.
  • Formula Escaping: Values starting with +, =, -, or @ are prefixed with a single quote (') so Google Sheets treats them as plain text instead of formulas.

5. API key protection

For each spreadsheet you can enable API key protection. When enabled, each request to send data must include a valid API key in the Authorization header.

Use API keys only on the server

Keys cannot stay hidden in browser or mobile app code. Enable API key protection only when sending data from your own backend, serverless function, or trusted environment.

Create a key: In the spreadsheet configuration, open the API Key section and click "Create API Key". The secret is shown only once—copy and store it securely. You can regenerate (revokes the old key) or revoke keys at any time.

Authorization: Use Bearer <secret> or RowsinkKey <secret>. Keep the space after "Bearer" or "RowsinkKey". The secret is the value you received when creating the key (it starts with rk_live_).

6. Spreadsheet settings

  • Header row: Automatically managed based on your data schema. No manual reset is required.
  • Add timestamp column (column A): When on, each new row gets an automatic timestamp in column A. By default, these are "Smart" numeric values that respect your spreadsheet's timezone for perfect sorting.
  • Expand Nested Arrays: When on, nested arrays in your JSON objects are expanded into additional rows. See section 4 for details.
  • API key protection: Toggle whether an API key is required to send data to this endpoint.
  • Edit configuration: You can change the Google Sheets URL or sheet tab. Re-check the connection after changing the URL, then save. Changing to a different spreadsheet will require access verification again.

7. Tools: Tester, Queue Log & Capacity Checker

Endpoint Tester (/tester): Select a configuration, optionally add an API key, edit a JSON payload, and send a test request. Use the load test to fire repeated requests at a chosen rate (0.1–100 req/s, 1–300 seconds) to verify behavior under load.

Queue Log (/queue-log): Live stream of Enqueued (rows added to the queue) and Processed (rows written to the sheet) events. Only events received while the page is open are shown. Useful to confirm that data is being accepted and written.

Spreadsheet Capacity Checker (/spreadsheet-capacity): Check how full your Google Spreadsheet is. Google Sheets limits each spreadsheet to 10 million cells total (across all tabs). This tool shows your current usage and breakdown by tab.

8. Google Sheets limits

Google Sheets has a limit of 10 million cells per spreadsheet. This limit applies to the entire spreadsheet file, not per individual tab. All tabs within a spreadsheet share this 10 million cell budget.

Important: Spreadsheet-wide limit

The 10 million cell limit counts all cells across all tabs in your spreadsheet, including blank cells. When you create a new tab, it starts with 1,000 rows × 26 columns (26,000 cells) even if empty. Use the Spreadsheet Capacity Checker to monitor your usage.

If you try to append data that would exceed this limit, Google Sheets returns a 400 Bad Request error: "This action would increase the number of cells in the workbook above the limit of 10000000 cells." The entire append operation fails—no partial writes occur.

What counts toward the limit: Every cell in the allocated grid space, including blank cells. Google Sheets counts cells based on the grid dimensions (rows × columns), not just cells with data.

If you approach the limit: Consider archiving old data, splitting data across multiple spreadsheets, or reducing the number of columns in your sheets. Each spreadsheet file gets its own 10 million cell budget.

9. Account limits

You can have up to 10 spreadsheet configurations per account. Delete one to add another. The dashboard and My Spreadsheets pages show how many you have in use.

10. Troubleshooting

"Permission denied" or connection check fails

Share the Google Sheet with sheets@rowsink.iam.gserviceaccount.com as Editor. RowSink uses this service account to add rows to your sheet. Without access, we cannot read metadata or write data.

"You have read-only access"

You can only create a configuration for a spreadsheet you can edit. If the sheet is shared with you as Viewer, ask the owner to grant you Editor access.

"Verification Required" when adding a spreadsheet

RowSink automatically verifies that you have Editor access to the spreadsheet. If your access can't be confirmed automatically (for example, the sheet is shared via a link or through a Google Group), you'll be asked to create a temporary tab with a specific name in your spreadsheet to prove you can edit it. Add a new tab using the + button at the bottom of the sheet, rename it to the name shown, and click Verify. The tab is deleted automatically once verified.

"API key required" or "Invalid API key"

The configuration has API key protection enabled. Send Authorization: Bearer YOUR_KEY_SECRET. The secret is shown only when you create a key. If you lost it, regenerate the key in spreadsheet settings and update your client.

"Rate limit exceeded" (429)

You exceeded 100 requests per minute per IP or per spreadsheet. Wait for the duration given in the Retry-After header, then retry. Use the Endpoint Tester's load test carefully to avoid hitting limits.

"Request body must not exceed 200 KB" (413)

The JSON body is too large. Split into smaller requests or reduce payload size. Each request is limited to 200 KB.

"Spreadsheet config not found" (404)

The UUID in the URL is wrong or the configuration was deleted. Check the endpoint URL on the spreadsheet detail page. Ensure you're using the correct environment (production vs. local).

Data queued but not appearing in the sheet

Rows are processed asynchronously. Check the Queue Log for "Processed" events. If you see "Enqueued" but not "Processed", there may be a temporary backlog or a permissions issue writing to the sheet. Confirm the sheet is shared with the service account and the tab name matches.

"This action would increase the number of cells in the workbook above the limit of 10000000 cells" (400)

Your spreadsheet has reached Google's 10 million cell limit. This limit applies to the entire spreadsheet (all tabs), not per tab. Use the Spreadsheet Capacity Checker to see your current usage. Consider archiving old data, splitting into multiple spreadsheets, or reducing columns to free up space.

Need more help? Check How it Works or get in touch.

We use cookies to ensure you get the best experience on our website. For more information on how we use cookies, please see our cookie policy.
Learn more