> ## Documentation Index
> Fetch the complete documentation index at: /help/llms.txt
> Use this file to discover all available pages before exploring further.

# Google Forms

> Everyone who answers your Google Form becomes a contact in Kerux and can start a campaign, with a small script and no Zapier.

> [!NOTE]
>
> **Pro plan.** Lead forms (the secret URLs in **Forms** and the **Lead form submitted** trigger) are part of Pro and Agency (and the free trial), like Lead Ads. On Starter, **Connections** shows **Part of Pro** with an **Upgrade to Pro** button, and making a URL or adding the trigger shows **Part of Pro: Lead forms (Typeform, Tally, Jotform...)** with the same button. URLs and triggers you already have keep adding contacts on every plan. See [Plans and billing](/help/account/billing.md).

Using Google Forms for event sign-ups or requests? Google Forms has no webhook setting, but a short Apps Script (free, inside your form) sends every new response to Kerux.

No Zapier or Make in between: Google Forms sends each submission straight to a secret URL of your workspace, and Kerux reads what the script sends.

## Connect Google Forms

**1. Make your secret URL in Kerux**

Go to **Integrations > Connections**. In **Forms**, click **Connect** on the **Google Forms** row: a side panel opens. Under **Name your first URL**, type a name you'll recognize (for example *Demo request*) and click **Create URL**, then **Copy**. Keep it private: anyone with this URL can add contacts to your workspace.

**2. Open Apps Script**

Open your form in Google Forms, click the three dots at the top right and pick **Apps Script**.

**3. Paste the script**

Replace what's there with the script below, paste your Kerux URL between the quotes on the first line and click **Save**.

```javascript theme={null}
    const KERUX_URL = "PASTE_YOUR_KERUX_URL_HERE";
    
    function sendToKerux(e) {
      const answers = {};
      e.response.getItemResponses().forEach(function (r) {
        const value = r.getResponse();
        answers[r.getItem().getTitle()] = Array.isArray(value) ? value.join(", ") : String(value);
      });
      UrlFetchApp.fetch(KERUX_URL, {
        method: "post",
        contentType: "application/json",
        muteHttpExceptions: true,
        payload: JSON.stringify({
          response_id: e.response.getId(),
          form_id: e.source.getId(),
          form_name: e.source.getTitle(),
          submitted_at: e.response.getTimestamp().toISOString(),
          email: e.response.getRespondentEmail(),
          answers: answers,
        }),
      });
    }
```

**4. Run it on every response**

In Apps Script, click **Triggers** (the clock on the left) > **Add Trigger**. Choose the function **sendToKerux**, event source **From form**, event type **On form submit**, and click **Save**. Google asks you to allow the script: allow it (it only reads this form's responses and sends them to your URL).

**5. Send a response**

Submit your form once. In Kerux, the URL's card shows its fields: one per question, named after the question's title.

If your form collects email addresses (**Settings > Responses > Collect email addresses**), the respondent's email comes in too. Add a question for the LinkedIn profile if you want LinkedIn steps to run right away.

## Choose where each field goes

When the first submission arrives, the URL's card in the panel stops saying **Waiting for your first submission...** and shows **Where each field goes**: every field of that submission (only the field names, never the answers) and where Kerux puts it.

* **Automatic** is Kerux's guess. It uses the field's type when Google Forms sends one (an email question is the email), then the question's words (*First name*, *Company*, *Job title*, *Phone*...), and any answer that is an email address or a LinkedIn profile URL.
* Pick another target to change it: **Email**, **First name**, **Last name**, **First and last name**, **Phone**, **Company**, **Job title**, **Location**, **Address**, **City**, **Country**, **Postal code**, **LinkedIn profile**, a **Custom field** (use it in messages as `{{contact.custom.<name>}}`), or **Don't keep**.
* Click **Save mapping**. Every next submission uses it.

**Test** shows how a sample Google Forms submission (built from Google's Apps Script documentation) would be read with your mapping. Nothing is saved and no contact is made.

## Start a campaign from the form

**1. Add the trigger**

Open your campaign, go to its **Triggers** tab and click **+ Add** > **Lead form submitted**.

**2. Pick the source**

Under **Source**, pick **Google Forms**. Under **Which URL**, pick one of your Google Forms URLs or **Any Google Forms URL**. Leave **Every form**, or pick **Only these forms** once a submission from them has arrived. Click **Add the trigger**.

Pick **Any source (every lead form and form tool)** instead to start the campaign from every form and every Facebook / Instagram lead ad at once.

## Good to know

* **No LinkedIn profile? They still come in.** People without a LinkedIn URL become contacts by their email. Email and other steps run; LinkedIn steps wait (shown in **Home > Tasks** with the reason *missing LinkedIn URL*) until someone adds their profile, then continue by themselves.
* **Never twice.** Google Forms may send the same submission again (a retry, a test sent twice): Kerux recognizes it by its response id and adds the person once. Someone who is already a contact is updated: empty fields are filled, their answers are saved as custom fields.
* **One URL per form.** Make as many URLs as you like (**Add another URL**), so each campaign can pick its own.
* **If the URL leaks**, click **Make a new URL** on its card: the old one stops working at once. Paste the new one in Google Forms. **Turn off** stops the URL for good.
* **Limits.** Each URL takes up to 60 requests a minute; more get an answer to try again later. A body can be up to 256 KB.
* Only workspace owners and admins can make URLs and see them. Members see **Ask an admin** on the row.
* Answers are data, never instructions: whatever someone types in your form is stored as text, nothing else.

## With the API

The same URLs are in the public API: `GET /v1/integrations/form-relays`, `POST /v1/integrations/form-relays` (`{"tool": "google_forms", "name": "Demo request"}`), `PATCH /v1/integrations/form-relays/{id}` (rename, or `mapping`), `POST /v1/integrations/form-relays/{id}/rotate`, `POST /v1/integrations/form-relays/{id}/test`, `DELETE /v1/integrations/form-relays/{id}`, and `POST /v1/workflows/{id}/lead-form-triggers` (`{"provider": "google_forms", "page_id": "*"}`). See [the API](/help/developers/api.md).

## Sources

* Google: [Installable triggers](https://developers.google.com/apps-script/guides/triggers/installable), [FormResponse](https://developers.google.com/apps-script/reference/forms/form-response) and [UrlFetchApp](https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app).

> [!NOTE]
>
> Kerux reads what the script above sends, built from Google's Apps Script documentation. If a field arrives somewhere unexpected, change it under **Where each field goes**, or contact support from [Get help](/help/get-help.md).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.