ScreenshotNeo

BlogHow-to

How to Create a Webpage Screenshot When a New Row Appears in Google Sheets with n8n

Build an n8n workflow that captures a webpage when a new Google Sheets row arrives, then saves the image to Google Drive and sends an optional alert.

By the ScreenshotNeo team4 October 20268 min read

To capture a webpage when a new Google Sheets row arrives in n8n, start with a Google Sheets Trigger set to Row added, pass the row’s URL field to a screenshot renderer, then save the returned image to Google Drive. Add a Gmail notification if you want a completion alert. The row-added trigger matters: an existing n8n template for this use case starts when a spreadsheet file is added to Drive, which is a different event.

1. Prepare the sheet and workflow

Create a sheet with one URL per row. For example:

Url Title Status
https://example.com Example home page Ready

The example uses a column named Url. If your header differs, use that exact incoming field name in the expressions below. You can add columns for a title, folder, or other metadata, but this basic workflow needs only the URL.

  1. Create a new n8n workflow and add a Google Sheets Trigger.
  2. Connect Google Sheets credentials and choose the spreadsheet and sheet (tab) to monitor.
  3. Set the event to Row added. n8n also lists Row updated and Row added or updated; choose those only if edits to existing rows should also trigger captures. See the Google Sheets Trigger documentation.
  4. Save the workflow and activate it after testing. A manual test can help inspect the item shape, but the activated workflow is what should watch for future rows.

The incoming item should contain the row’s named columns. In downstream node expressions, the URL is typically referenced as {{ $json.Url }}. Inspect the trigger output in n8n and adjust capitalization or spacing to match your sheet header exactly.

2. Add a screenshot renderer

A renderer loads the URL in a browser environment and returns an image. ScreenshotOne publishes an n8n integration and documents screenshot rendering in workflows; its n8n template also shows Drive storage and Gmail alerts. The template’s trigger watches for a spreadsheet file added to a Google Drive folder, so replace that trigger with the Google Sheets Trigger configured for Row added for this workflow. See the ScreenshotOne n8n guide and the n8n workflow template.

Option A: ScreenshotOne community node

  1. Add the ScreenshotOne node to the workflow. The integration is listed in ScreenshotOne’s n8n documentation.
  2. Create or select the ScreenshotOne credential in n8n and store the access key there. Do not put the key in a shared spreadsheet or a plain-text expression.
  3. Map the target URL to the row field, for example {{ $json.Url }}.
  4. Choose the desired capture behavior in the node/API options, such as viewport size, device emulation, or delay timing, then connect the node’s image output to the storage step.

Option B: HTTP Request node

If you prefer a generic HTTP step, configure an HTTP Request node to call your renderer’s documented endpoint, pass the incoming URL as a parameter, and authenticate using an n8n credential or secret. Set the response format to a file/binary response when the renderer returns image bytes. The exact endpoint, authentication field, and output setting depend on the renderer; follow its current API documentation. Avoid placing secrets in the sheet or in an expression that will be visible to workflow editors.

For any provider, map the row URL dynamically rather than entering a fixed URL. Check the node output once to identify the binary property name; later nodes need that property to upload the image.

3. Save the screenshot and notify someone

  1. Add a Google Drive node after the renderer and choose the upload operation.
  2. Set the file data input to the renderer’s binary output. Choose a Drive folder and set a filename that stays unique, for example a sanitized title plus a timestamp or row identifier.
  3. Optionally add a Gmail node after the Drive upload. Include the file or folder link in the message so recipients can open the result.

The published n8n template demonstrates extracting URLs from a Url column, capturing images, saving them in Drive, and emailing a folder link. In this row-trigger version, the workflow runs for each added row, so a message per row is simplest. If you prefer a digest, add a batching or scheduling design instead of sending one message for every capture.

4. Test the workflow before relying on it

  1. Use a reachable public URL in a newly added row. Make sure it includes https://.
  2. Inspect the Google Sheets Trigger output and confirm the URL appears under the expected property name.
  3. Run the capture step and confirm it returns image data rather than an error or an empty response.
  4. Run the Drive step and verify the file exists in the intended folder and opens as an image.
  5. If enabled, verify the Gmail message includes a usable link.
  6. Activate the workflow and add another new row to validate the event-driven path.

Testing with an existing row may not cause a Row added event. Add a fresh row after the trigger is active when checking the live behavior.

5. Configure capture behavior and row handling

Need Workflow choice
Only newly inserted records Google Sheets Trigger: Row added
Capture after edits too Row updated or Row added or updated; consider a status or URL-change filter to avoid unnecessary recaptures
Different screen sizes Set the renderer’s viewport or device emulation options
Page needs time to settle Use a supported delay or wait option; keep it only as long as the page needs
Save results by row metadata Use a title or identifier column to form the output filename, sanitizing characters that are invalid in filenames

Renderer options vary by provider. ScreenshotOne’s n8n integration documents webpage screenshots and other output types; consult the provider’s current API options for exact parameter names. Do not assume a viewport screenshot is a full-page capture: select a scrolling or full-page mode when you need content below the fold and the renderer supports it.

Be deliberate about duplicate rows and retries. A retried execution can produce another image. If duplicates matter, use a stable row identifier and check whether an output for that identifier already exists before uploading, or record completion status in the sheet. If using a status column, update it only after the image upload succeeds so failed captures remain visible for recovery.

6. Troubleshoot common problems

Symptom Likely cause What to check
No execution after adding data Workflow is inactive, the wrong spreadsheet or tab is selected, or the trigger is configured for updates instead of additions. Activate the workflow, confirm the selected document and sheet, and verify the event is Row added. Add a fresh row after activation.
URL is empty in the screenshot step Expression does not match the column header or incoming item shape. Inspect trigger output and use the exact property name, such as {{ $json.Url }}.
Authentication or permission error Google or renderer credentials are missing, expired, or lack access. Reconnect the relevant credential and confirm it can access the chosen sheet, Drive folder, or renderer account.
Renderer returns an error instead of an image Invalid URL, missing key, unsupported options, or a target page that cannot be loaded. Test a public HTTPS URL, check credential configuration and supported parameters, and inspect the renderer response details.
Drive upload creates no usable image The upload node received JSON/text instead of the binary image property. Inspect the renderer output and select its actual binary field as the upload data.
Image is blank or partially loaded The target page may render slowly or depend on scripts, authentication, or delayed content. Use a supported wait/delay option, ensure the target is accessible to the renderer, and try a smaller reproducible URL.
More than one capture for a row The trigger event includes updates, the workflow was manually run, or an execution retried after a partial failure. Use the row-added event when appropriate and add deduplication or status tracking if duplicate output is unacceptable.

7. Reliability, performance, and cost

Each row starts work, so large bursts can create many browser captures and Drive uploads. Keep the workflow’s concurrency and provider rate limits in mind, and use a queue or batching pattern if rows arrive faster than captures can finish. Longer waits may improve captures for slow pages but increase execution time. A fixed wait is easy to understand; use only the delay needed for the pages you capture.

Plan for pages that are unavailable, blocked, or slow. Configure error handling so a failed screenshot is visible to an operator, and avoid marking a row complete before the upload succeeds. Track the row identifier, target URL, execution result, and output link if you need to retry failures without recapturing every successful row.

Costs may include your n8n hosting or plan, screenshot-rendering usage, and any storage or email limits imposed by the services you choose. The cited sources do not establish comparable prices or performance figures, so check each provider’s current terms for your expected volume.

Or skip the browser setup

ScreenshotNeo is a website screenshot API and MCP server. Call it with the URL from each row; the API documentation explains the request and available options. In n8n, use an HTTP Request node with a GET request to the API and map the row’s URL into the url query parameter. Store the access key as a credential or secret, and configure the response as a file when saving the image.

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://example.com -o shot.webp
import requests

r = requests.get(
    "https://api.screenshotneo.com/v1/shot",
    params={"access_key": "YOUR_API_KEY", "url": "https://example.com"},
    timeout=90,
)
r.raise_for_status()
open("shot.webp", "wb").write(r.content)
const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://example.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
if (!res.ok) throw new Error(`Screenshot request failed: ${res.status}`);
await Bun.write('shot.webp', res);

ScreenshotNeo removes cookie banners, newsletter popups, and chat widgets before the shot. Bot checks, blank pages, and failed loads are never billed. Its MCP server lets AI agents take screenshots. The free plan includes 1,000 screenshots per month with no card; paid plans start at $5 for 3,000. Connect the HTTP Request node to Drive as above, then sign up free for 1,000 screenshots a month with no card.

FAQ

Does adding a row to a Google Sheet mean adding a spreadsheet file to Drive?

No. A new row is an event inside a selected spreadsheet. A Drive-folder trigger detects a file event. Use the Google Sheets Trigger for row events.

Can I capture edits as well as new rows?

Yes. Choose Row updated or Row added or updated, then consider filtering so unrelated edits do not trigger another capture.

Can the workflow capture a full-page screenshot?

That depends on the renderer and its configured capture options. Select a full-page or scrolling mode when supported; a normal viewport capture may show only the visible area.

Should the screenshot access key go in the sheet?

No. Keep it in n8n credentials or its secret-management mechanism, and reference that credential from the renderer node.

Sources