---
title: Setting up a webhook
description: EMS provides a webhook feature for integrating Hearken data with other systems.
---

[Skip to content](https://help.indiegraf.com/setting-up-a-webhook#main-content)

English

Show submenu for translations

[Publisher Portal](https://portal.indiegraf.com/tickets?hsLang=en)

[![Indiegraf-PrimaryLogo-FullColor-1](https://help.indiegraf.com/hs-fs/hubfs/Indiegraf-PrimaryLogo-FullColor-1.png?width=262&height=60&name=Indiegraf-PrimaryLogo-FullColor-1.png)](https://help.indiegraf.com/?hsLang=en)

Open main navigation

Close main navigation

- English
  
  Show submenu for translations
- [Publisher Portal](https://portal.indiegraf.com/tickets)

 How can we help you?

- There are no suggestions because the search field is empty.

1. [Indiegraf](https://help.indiegraf.com/?hsLang=en)
2. [Hearken](https://help.indiegraf.com/hearken?hsLang=en)
3. [Setting up APIs and webhooks](https://help.indiegraf.com/hearken?hsLang=en#setting-up-apis-and-webhooks)

March 5, 2026

# Setting up a webhook

## EMS provides a webhook feature for integrating Hearken data with other systems.

Webhooks make it possible to connect the EMS to hundreds of other apps and use logic to perform multi-step workflows. The Webhooks feature can be accessed by EMS administrators. In this article, we'll guide you through the creation of a Webhook that *gets* data from the EMS and *puts* it in a Google Sheet—but you can use Webhooks to connect to other apps and do other things, too.

To start, find the **Webhooks** option under **Manage Team** in your sidebar.

![](https://downloads.intercomcdn.com/i/o/591854104/3e5bd4013c8aa4c476f5c3b4/Screen+Shot+2022-10-04+at+9.20.37+AM.png?expires=1772739000&signature=cd393a1fb6681b721ac5ecb01ca2c636ca06c0de7cd5e200c73d621b00742447&req=cSkmHsx6nIFbFb4f3HP0gGouaYzu%2Fdu4%2BFnmPBn47WdCI63at4%2FuIzLfmerI%0AsIq4AKbQM%2BWmjH4Phw%3D%3D%0A)

 

You'll wind up on the Webhooks page:

![](https://downloads.intercomcdn.com/i/o/249033258/c7fd4a5f1486b717d3980f03/AddWebhooks.PNG?expires=1772739000&signature=bfae923704dbf89fdcd2815c73a61673c5a49794ed0db494f0ca94c7e5cf8845&req=diQuFsp9n4RXFb4f3HP0gAbcUbqiiH67BNpJUazUCY8RcA8juQvTO%2BUujHVK%0Ah93diacb2qN4cjvVmw%3D%3D%0A)

Select **New Rule** on the far right to add a webhook. As you can see in the following image, you will have the option to choose from a list of 6 events for which you’d like to be notified: A new response, vote, or person added, and/or any corresponding updates to those features.

(A new response is created when someone makes a submission. A new vote is created when someone votes in a poll. A new person is added when someone fills out a new unique email address in one of your embeds. A response update occurs when an EMS user in your organization edits a response. A vote update occurs when a person who just voted adds their email address after voting. A person update occurs when an EMS user in your organization edits a person's record within the EMS.)

![](https://downloads.intercomcdn.com/i/o/249033458/288e15b5283ad4461c061523/AddWebhooks1.PNG?expires=1772739000&signature=ff6d98645cbe2d1127bb32e5c056359a77d54013976d9f3cfe8a86578e6a87d4&req=diQuFsp9mYRXFb4f3HP0gBZMB45hxtbhxNuIFGEyRyIANHUiZtpbvEglB%2BAg%0AxwOLk8Rjb2220UcLOQ%3D%3D%0A)

In the **Receiving URL** field, you should enter the webhook URL supplied by the application you are linking with. We generally recommend **[Zapier](https://zapier.com/)** to generate a link to the specific app you would like because it is relatively easy to use and connects to a wide variety of other apps. (Some apps, like Slack, have built-in webhooks support. The data format these apps expect vary wildly and might not match what the EMS sends. An intermediary service like Zapier can be used to transform the data format to be compatible with our Hearken EMS server.)

To get your **Receiving URL** in Zapier, start creating a Webhook with the app you want to connect and select "**Catch Hook**" as the trigger and "**Create Spreadsheet Row(s)**" as the action. *Do not select "Catch Raw Hook"!*

![](https://downloads.intercomcdn.com/i/o/365548402/087df0adfe0b626c6f85c61d/Screen+Shot+2021-07-20+at+3.36.30+PM.png?expires=1772739000&signature=4d8f0432810e1858d8408a810f5c776d5260860025140d0c10d3e6282a8aabe6&req=dyYiE812mYFdFb4f3HP0gCfYhXu5t5ocI274BFVJVs72oE5Ep3WEI9Vds7%2BY%0AX3Zh7yf6wy6X9aj2Kw%3D%3D%0A)

Then click "Continue" and get your Webhook URL. This is the **Receiving URL** you want to paste in your EMS Webhook:

![](https://downloads.intercomcdn.com/i/o/365548536/ec7f7f9ab1413a91ddc6a6da/Screen+Shot+2021-07-20+at+3.41.19+PM.png?expires=1772739000&signature=b9e72f5a3ad20d9b4542932ab4b70ec13f2b14c8f020781ad605f907dbe17b61&req=dyYiE812mIJZFb4f3HP0gJpVWjwK3jg%2BX502aoBa1fh16lpiSDBQy4CqwVsL%0A4d2NNX482rvRd9JGfQ%3D%3D%0A)

For this example, we'll use "New Response" as a trigger. Click "Save" to save it in the EMS. We'll finish the rest in Zapier.

![](https://downloads.intercomcdn.com/i/o/365533303/59213e8af6a39650c4c3085e/Screen+Shot+2021-07-20+at+2.41.07+PM.png?expires=1772739000&signature=d47b2884430b6efa45d47e553e3479606557f0769174cd5c23e43ca5fcd02d73&req=dyYiE8p9noFcFb4f3HP0gH8HLwn%2F75%2Fgmi5u0mehNbdI6nc3PlIWgNepENHc%0ApufSLfJLcP6%2BklOiIQ%3D%3D%0A)

Zapier will ask you to test your trigger. In our case, the trigger is a new response. Submit a test response on any of your forms, then click "Test trigger."

![](https://downloads.intercomcdn.com/i/o/365548597/34b69e27c897543bb436d589/Screen+Shot+2021-07-20+at+3.41.27+PM.png?expires=1772739000&signature=f112ae34600adf650e3aa556ecad7ac15c4b4ee5560bfc86f51246a26da515be&req=dyYiE812mIhYFb4f3HP0gARvE6MaTm%2FiNF%2F%2BF59Uv%2Be8TqSZzXprksMstY3H%0AzoxN6l0U3oC30XrroA%3D%3D%0A)

You should see something like this if it worked:

Click "Continue" to complete the step of connecting the Webhook to the EMS.

![](https://downloads.intercomcdn.com/i/o/365549979/c7db2caf52404acf213a3dd2/Screen+Shot+2021-07-20+at+3.47.36+PM.png?expires=1772739000&signature=f10726018e5c4ec2ad8373da72565398d8235afd7222a2bb9f531f4c87cac8b6&req=dyYiE813lIZWFb4f3HP0gNnDUY6EVO26MfLsNpzZm4lHotE3tQCGDzavu5Rn%0AIoT3Eevlf9mkMjy%2FuQ%3D%3D%0A)

Create a Google Sheet and create column headers for each field you want to pull from the EMS. You can name the headers whatever you want and as as many as you want, but there has to be text there for Zapier to place the data in the correct column. Here are the ones I'll use, purely as examples.

![](https://downloads.intercomcdn.com/i/o/365552711/fe32ce20a35121619e248fe5/Screen+Shot+2021-07-20+at+4.02.09+PM.png?expires=1772739000&signature=0554937b24af6ab9a36a164725009912513f5dba4d37be59a543ce246bed0f09&req=dyYiE8x8moBeFb4f3HP0gNLF9UhBYu90BfTyusXTqTW7Cbpy4ynuQUxgP%2Ffk%0A5ZjUjfWpU8w9tYw77Q%3D%3D%0A)

Once you have picked out your columns, connect to the spreadsheet and worksheet within it you want to use (you'll need to connect Google Drive to Zapier to do this) and link the columns with the properties you want to use:

![](https://downloads.intercomcdn.com/i/o/365552730/421f69aa20779a077769e79d/Screen+Shot+2021-07-20+at+4.02.20+PM.png?expires=1772739000&signature=f92cfb843d3b5de0cb6c3a880d6e676923d368c4b87211b95eb4ca933e168c3f&req=dyYiE8x8moJfFb4f3HP0gP7%2BiUcV6BfDrlzVgoaTVyoytMWGVdWNxQ7y0A%2B%2F%0Ay25EEZrfA4fwi8PlkQ%3D%3D%0A)

From there you can test the Zap to see if it works as you intended:

![](https://downloads.intercomcdn.com/i/o/365552856/d340577f6b37df7087118232/Screen+Shot+2021-07-20+at+4.03.06+PM.png?expires=1772739000&signature=3acb56e59c903e5ad24d20720ecd13ef0f1b18816c0f06902410569ea4c5f31b&req=dyYiE8x8lYRZFb4f3HP0gH0g2UmljWFIBsnhhs5IJxfz8vyf%2B5LkdRSWv1F3%0A7aIm0dbiApYqtckybw%3D%3D%0A)

Here is the Zap I made depositing the data from the form submission into the Google Sheet:

![](https://downloads.intercomcdn.com/i/o/365552874/c7533807d86f6dce664b0a52/Screen+Shot+2021-07-20+at+4.03.15+PM.png?expires=1772739000&signature=dfc664675bc15469861e321a3aa836e6650727f7dad18301c36f63e9249144b9&req=dyYiE8x8lYZbFb4f3HP0gPbK51E160hEjNlBNzP4EEN3VcHatdEzrFxL3dqf%0Af2LWXYPJ8y%2Bags7nsw%3D%3D%0A)

Yay!

---

When a response or action successfully triggers the webhook, a check mark will show up at the far right of the EMS Webhooks page, and you will also be able to click through the response to see the source response of each notification. Similarly, if a Webhook URL is incorrect or there is otherwise an error, the action will display an error:

![](https://downloads.intercomcdn.com/i/o/249033884/23d12074ae33b5f6175d64e1/action.PNG?expires=1772739000&signature=2f40e4e5c9aec888a65cad55db06980327bb7ddebf16019430e1439458b7c85b&req=diQuFsp9lYlbFb4f3HP0gDfhYKOkVD1xS9NhUZ6FyiCTbXkdmBByrKuPJ%2BTb%0A8PzB3Twb%2Bd4V9L8oWQ%3D%3D%0A)

Here is a sample format of the JavaScript Object Notation (JSON) of each action at the site of your URL-generator, which you will be able to see after each successful run of your webhooks:

 

#### **Webhook response structure**

The data sent with each webhook will follow this structure (see below for term definitions):

`{`

`"_event": {string},`

`"_type": {string},`

`"id": {integer},`

`"retry_count": {integer},`

`"_created_at": {milliseconds since UNIX epoch},`

`"organization": {`

`"_type": "organization",`

`"created_at": {milliseconds since UNIX epoch},`

`"updated_at": {milliseconds since UNIX epoch},`

`"id": {integer},`

`"name": {string},`

`"slug": {string}`  
`}, "payload": {object} }`

 

\_event: The name of the event that triggered the webhook. Eg: updated\_question

\_type: The class or type of the object in the webhook payload, Eg: question\_webhook

id: A numerical id associated with the webhook

created\_at: Unix timestamp in milliseconds for when the webhook run is created

\_retry\_count: An integer starting at 0 indicating the number of attempts made to deliver this webhook. Unless specified otherwise, every webhook makes 3 attempts to deliver the information.

organization: The organization object

id: Numerical id of the organization

created\_at: Unix timestamp in milliseconds for when the organization was created

updated\_at: Unix timestamp in milliseconds for when the organization was last updated

name: The name of the organization

slug: An alphanumeric string that serves as an unique identifier for the organization

payload: Information about the specific object that triggered the webhook. The format varies based on the type

Example: This is what an updated response webhook looks like

`{{    "_event": "updated_question",    "_type": "question_webhook",    "_created_at": 1600811238426,    "id": 71338,    "_retry_count": 0,    "organization": {       "_type": "organization",       "created_at": 1518725427802,       "updated_at": 1578356143203,       "id": 322,       "name": "Example",       "slug": "example"    },    "payload": {       "_type": "question",       "created_at": 1598529395806,       "updated_at": 1600811238358,       "question_status": {          "_type": "question_status",          "created_at": 1518725427965,          "updated_at": 1518725427965,          "id": 548,          "name": "New"       },       "lists": {          "_type": "collection",          "total_objects": 1,          "offset": 0,          "limit": 10,          "data": [{             "_type": "list",             "created_at": 1598528086790,             "updated_at": 1598528086790,             "id": 8821,             "name": "City Development in the Future",             "question_count": 1           }]        },        "answers": {             "_type": "collection",             "total_objects": 0,             "offset": 0,             "limit": 10,             "data": []       }, "id": 1003023, "prompt": "What will happen to the design of cities in the future? How does your perfect City of the Future look?", "embed_name": "City Development in the Future", "opt_in_response": true, "anonymous": false, "display_text": "Are we going to be using flying cars?", "original_text": "Are we going to be using flying cars?", "approved": false, "deleted": false, "postcode": null, "source_url": "https://ems.wearehearken.com/", "reporter": null, "notes": null, "hidden": false, "quarantined": false, "source": "prompt_embed:6328", "custom_fields": [{ "name": "Postal code (optional)", "type": "string", "value": "5000" }], "organization_audience_member": { "id": 690566, "email": "ex@examplemail.com", "_type": "organization_audience_member", "name": "Example" }, "assigned_to_user": "Kavya Sukumar" } }`

- [Welcome to Indiegraf](https://help.indiegraf.com/welcome-to-indiegraf?hsLang=en)
- [Onboarding](https://help.indiegraf.com/onboarding?hsLang=en#main-content)

    - [Quick Start Guide](https://help.indiegraf.com/onboarding?hsLang=en#quick-start-guide)
- [Indie Website](https://help.indiegraf.com/indie-website?hsLang=en#main-content)

    - [Analytics & Growth](https://help.indiegraf.com/indie-website?hsLang=en#analytics-growth)
    - [Audience Engagement & Forms](https://help.indiegraf.com/indie-website?hsLang=en#audience-engagement-forms)
    - [Configuring your Homepage](https://help.indiegraf.com/indie-website?hsLang=en#configuring-your-homepage)
    - [Content Creation & Management](https://help.indiegraf.com/indie-website?hsLang=en#content-creation-management)
    - [Design & Page Layout](https://help.indiegraf.com/indie-website?hsLang=en#design-page-layout)
    - [Indiegraf Pay](https://help.indiegraf.com/indie-website?hsLang=en#indiegraf-pay)
    - [Media & Visual Assets](https://help.indiegraf.com/indie-website?hsLang=en#media-visual-assets)
    - [Paywall Solution: Pelcro](https://help.indiegraf.com/indie-website?hsLang=en#paywall-solution-pelcro)
    - [SEO and Google Tools](https://help.indiegraf.com/indie-website?hsLang=en#seo-and-google-tools)
    - [Site Administration](https://help.indiegraf.com/indie-website?hsLang=en#site-administration)
    - [Technical Questions](https://help.indiegraf.com/indie-website?hsLang=en#technical-questions)
- [Indie Email](https://help.indiegraf.com/indie-email?hsLang=en#main-content)

    - [Quickstart Video Guide: Indie Email](https://help.indiegraf.com/indie-email?hsLang=en#quickstart-video-guide-indie-email)
    - [Account Setup & Foundations](https://help.indiegraf.com/indie-email?hsLang=en#account-setup-foundations)
    - [Contact Management](https://help.indiegraf.com/indie-email?hsLang=en#contact-management)
    - [Creating Campaigns](https://help.indiegraf.com/indie-email?hsLang=en#creating-campaigns)
    - [Sending Campaigns & Automation](https://help.indiegraf.com/indie-email?hsLang=en#sending-campaigns-automation)
    - [Troubleshooting & Deliverability](https://help.indiegraf.com/indie-email?hsLang=en#troubleshooting-deliverability)
    - [Analytics](https://help.indiegraf.com/indie-email?hsLang=en#analytics)
- [Indie Ads Manager (IAM)](https://help.indiegraf.com/indie-ads-manager-iam?hsLang=en#main-content)

    - [Reporting & Statistics](https://help.indiegraf.com/indie-ads-manager-iam?hsLang=en#reporting-statistics)
    - [Essential Articles](https://help.indiegraf.com/indie-ads-manager-iam?hsLang=en#essential-articles)
    - [Native Ad Templates](https://help.indiegraf.com/indie-ads-manager-iam?hsLang=en#native-ad-templates)
    - [Quick Start Guide](https://help.indiegraf.com/indie-ads-manager-iam?hsLang=en#quick-start-guide)
    - [Payment Solutions](https://help.indiegraf.com/indie-ads-manager-iam?hsLang=en#payment-solutions)
- [Hearken](https://help.indiegraf.com/hearken?hsLang=en#main-content)

    - [Planning and Preparing to Launch with Hearken](https://help.indiegraf.com/hearken?hsLang=en#planning-and-preparing-to-launch-with-hearken)
    - [Collecting Questions](https://help.indiegraf.com/hearken?hsLang=en#collecting-questions)
    - [Collecting Votes](https://help.indiegraf.com/hearken?hsLang=en#collecting-votes)
    - [Reporting an Answer](https://help.indiegraf.com/hearken?hsLang=en#reporting-an-answer)
    - [Spreading Hearken Across Your Organization](https://help.indiegraf.com/hearken?hsLang=en#spreading-hearken-across-your-organization)
    - [Creating and Customizing an Embed](https://help.indiegraf.com/hearken?hsLang=en#creating-and-customizing-an-embed)
    - [Workflow Features](https://help.indiegraf.com/hearken?hsLang=en#workflow-features)
    - [Platform Features](https://help.indiegraf.com/hearken?hsLang=en#platform-features)
    - [Setting Up Notifications and Alerts](https://help.indiegraf.com/hearken?hsLang=en#setting-up-notifications-and-alerts)
    - [Setting up APIs and webhooks](https://help.indiegraf.com/hearken?hsLang=en#setting-up-apis-and-webhooks)
    - [Data collection and exporting](https://help.indiegraf.com/hearken?hsLang=en#data-collection-and-exporting)
    - [Automatic categorization](https://help.indiegraf.com/hearken?hsLang=en#automatic-categorization)
    - [Social, outreach, and marketing](https://help.indiegraf.com/hearken?hsLang=en#social-outreach-and-marketing)
    - [Events and In-Person Engagement](https://help.indiegraf.com/hearken?hsLang=en#events-and-in-person-engagement)
    - [Monetizing your Hearken work](https://help.indiegraf.com/hearken?hsLang=en#monetizing-your-hearken-work)
- [Indiegraf Experts](https://help.indiegraf.com/indiegraf-experts?hsLang=en)
- [Indiegraf Product Release Notes](https://help.indiegraf.com/indiegraf-product-release-notes?hsLang=en#main-content)

    - [Product Demo Videos](https://help.indiegraf.com/indiegraf-product-release-notes?hsLang=en#product-demo-videos)
- [General](https://help.indiegraf.com/general?hsLang=en)
- [RevEngine](https://help.indiegraf.com/revengine?hsLang=en#main-content)

    - [Getting Started with RevEngine](https://help.indiegraf.com/revengine?hsLang=en#getting-started-with-revengine)
    - [International giving](https://help.indiegraf.com/revengine?hsLang=en#international-giving)
    - [RevEngine Core](https://help.indiegraf.com/revengine?hsLang=en#revengine-core)
    - [Organization management](https://help.indiegraf.com/revengine?hsLang=en#organization-management)
    - [Working with Stripe](https://help.indiegraf.com/revengine?hsLang=en#working-with-stripe)
    - [Contribution page basics](https://help.indiegraf.com/revengine?hsLang=en#contribution-page-basics)
    - [Customizing your page](https://help.indiegraf.com/revengine?hsLang=en#customizing-your-page)
    - [Branding and images](https://help.indiegraf.com/revengine?hsLang=en#branding-and-images)
    - [Advanced page settings & features](https://help.indiegraf.com/revengine?hsLang=en#advanced-page-settings-features)
    - [Portal & contribution management](https://help.indiegraf.com/revengine?hsLang=en#portal-contribution-management)
    - [Contribution data](https://help.indiegraf.com/revengine?hsLang=en#contribution-data)
    - [Analytics and Reporting](https://help.indiegraf.com/revengine?hsLang=en#analytics-and-reporting)
    - [Best Practices and Recommendations](https://help.indiegraf.com/revengine?hsLang=en#best-practices-and-recommendations)
    - [Receipts, reminders and transactional communications](https://help.indiegraf.com/revengine?hsLang=en#receipts-reminders-and-transactional-communications)
    - [Security & Legal](https://help.indiegraf.com/revengine?hsLang=en#security-legal)
    - [Common issues](https://help.indiegraf.com/revengine?hsLang=en#common-issues)

[![Indiegrf](https://help.indiegraf.com/hs-fs/hubfs/Indiegraf-SecondaryLogo-DarkNavy-2.png?width=260&height=130&name=Indiegraf-SecondaryLogo-DarkNavy-2.png "Indiegrf")](https://help.indiegraf.com/?hsLang=en)

Indiegraf is on a mission to make local news entrepreneurship a great career and life choice for journalists everywhere.

<https://www.instagram.com/indiegrafmedia> <https://www.twitter.com/indiegrafmedia> <https://www.facebook.com/indiegrafmedia> <https://www.linkedin.com/indiegraf-media> [mailto:support@indiegraf.com](mailto:support@indiegraf.com)

Copyright © 2025, Indiegraf Media