Send Survey Responses to
Email, WhatsApp, Notion, Google sheets & More

Get notified instantly when someone fills out your survey. Connect Mapster to 6,000+ apps like Slack, Google Sheets, WhatsApp, and email through Zapier.

Slack
WhatsApp
Sheets
Notion
Email

How It Works

Someone fills out your survey → Mapster instantly sends the response to any app you choose. No code needed.

1

Connect

Link your Mapster account to Zapier with your API key

2

Choose

Pick where you want responses sent -Slack, Sheets, email, etc.

3

Done

Every new response is automatically sent to your chosen app in real time

What Can You Do With It?

Slack

Get a Slack message every time someone submits a response

WhatsApp

Receive survey responses as WhatsApp messages

Google Sheets

Automatically add each response as a new row in a spreadsheet

Email

Get an email notification for every new response

HubSpot / CRM

Create or update contacts in your CRM with survey data

Notion / Airtable

Build a live response tracker in your favorite database

Setup Guide

Step 1: Get your API Key

  1. Log in to your Mapster dashboard
  2. Go to the Alerts page
  3. Click Generate API Key for Zapier
  4. Copy the key - you'll need it in the next step

Step 2: Create a Zap

  1. Go to zapier.com and click Create a Zap
  2. For the trigger, search for Mapster
  3. Choose New Survey Response
  4. Paste your API key when asked to connect your account
  5. Optionally pick a specific survey, or leave blank for all surveys

Step 3: Choose where to send responses

  1. Add an action - pick the app you want (Slack, Google Sheets, email, etc.)
  2. Map the survey fields (response, survey name, location, etc.) to the app
  3. Test it, then turn on your Zap

That's it! Every new survey response will automatically be sent to your chosen app.

What Data Gets Sent?

Each time someone submits a response, Zapier receives the following information that you can use in your actions:

  • Survey name - which survey the response came from
  • Answers - all questions and their answers, formatted and readable
  • User info - any custom attributes you passed (plan, company, etc.)
  • Location - country and city of the respondent
  • Device - desktop, mobile, or tablet + browser
  • Timestamp - when the response was submitted

Good to Know

  • Responses are sent instantly - no delays
  • Your API key works for all your Zaps - you only need to connect once
  • If you regenerate your API key, you'll need to reconnect your Zaps
  • Want responses from specific surveys only? Select a survey when setting up the trigger
  • Need multiple surveys going to different places? Create a separate Zap for each

API Reference

All Mapster API endpoints. The Zapier integration endpoints use an API key passed in the x-api-key request header. Widget endpoints are public. Dashboard endpoints require a Clerk browser session.

Zapier Integration Endpoints

GET/api/alerts/zapier/zapier-api-key

Returns the authenticated user's current API key record. Used by the Mapster dashboard to display the key.

Auth: Clerk session (dashboard only)

Response: { api_key: { id, api_key, label, created_at } }

POST/api/alerts/zapier/zapier-api-key

Generates a new API key for the user (replaces any existing key). Called from the Mapster dashboard before connecting to Zapier.

Auth: Clerk session (dashboard only)

Response: { api_key: { id, api_key, label, created_at } }

GET/api/alerts/zapier/surveys

Returns the user's surveys as a list. Zapier calls this to populate the survey dropdown when setting up a trigger.

Auth: x-api-key header

Response: [ { id: string, label: string } ]

GET/api/alerts/zapier/sample

Returns a static sample response payload. Zapier uses this during Zap setup so users can see and map available fields before any real responses exist.

Auth: x-api-key header

Response: [ { id, survey_id, survey_title, survey_responses, user_attributes, country, city, device_type, browser, submitted_at } ]

POST/api/alerts/zapier/subscribe

Registers a webhook URL with Mapster. Called automatically by Zapier when a user turns on a Zap. Mapster will POST to this URL whenever a new survey response is received.

Auth: x-api-key header

Body: { hookUrl: string, poll_id?: string }

Response: { id: string }

DELETE/api/alerts/zapier/unsubscribe

Removes a webhook subscription. Called automatically by Zapier when a user turns off a Zap.

Auth: x-api-key header

Query param: ?id={webhookId}

Response: { success: true }

Outbound Webhook Payload

When a new survey response is received, Mapster sends an HTTP POST to the hookUrl registered during subscribe. The request body is JSON with the following fields:

FieldTypeDescription
idstringUnique ID of this response
survey_idstringThe survey's shareable ID
survey_titlestringTitle of the survey
survey_responsesstringAll answers formatted as Question: Answer, separated by double newlines
user_attributesstring | nullCustom attributes passed at embed time (e.g. plan, company), formatted as key: value pairs. Null if none were passed.
countrystring | nullRespondent's country (from geo-IP)
citystring | nullRespondent's city (from geo-IP)
device_typestringdesktop, mobile, or tablet
browserstringBrowser name (e.g. Chrome, Safari)
submitted_atstringISO 8601 timestamp of when the response was submitted

If Zapier responds with HTTP 410 Gone, Mapster automatically removes the subscription.

Widget / Embed Endpoints

These endpoints are called by the Mapster widget embedded on your site. They are publicly accessible and support CORS from any origin.

GET/api/polls/get-poll

Fetches the survey definition for the embedded widget - questions, display settings, widget config, active/expired status, and branding options.

Auth: None (public)

Query params: poll_id - the survey's shareable ID

Response: { success: true, data: { poll_id, poll_id_to_share, questions, is_active, isExpired, response_limit_reached, display_settings, widget_config, show_mapster_branding } }

POST/api/polls/answer-poll

Submits a survey response. Called by the embedded widget when a visitor completes a survey. Validates the survey is active, rate-limits by IP, geo-locates the respondent, stores the response, and fires Zapier and Slack webhooks.

Auth: None (public)

Body: { answers: Answer[], user_attributes?: object, turnstile_token?: string, visitor_id?: string }

Response: { success: true, message: string }

POST/api/event

Tracks a widget analytics event (e.g. survey shown, survey skipped). Called by the widget to record visitor interactions.

Auth: None (public)

Body: { event: string, properties: { poll_id?, page_type?, url?, referrer?, session_id?, visitor_id?, timezone?, language? }, timestamp: number }

Response: { success: true, message: "ok" }

Dashboard Endpoints

These endpoints power the Mapster dashboard. They require an active Clerk session (the authenticated user's browser session) and are not intended for third-party integrations.

GET/api/polls/get-poll-votes

Returns paginated individual responses for a survey. Supports filtering by date range, vote source, and answer values.

Auth: Clerk session

Query params: poll_id, page, limit (max 1000), sort_order, filter_duplicates, date_range, vote_via_filter, question_filters

GET/api/polls/get-poll-stats-map

Returns geo-aggregated response data (country/city counts with coordinates) for rendering the map view in the dashboard.

Auth: Clerk session

Query params: poll_id, date_range, filter_duplicates, vote_via_filter, question_filters

GET/api/polls/get-poll-stats-nonmap

Returns aggregate answer statistics (counts, percentages, averages) for all questions in a survey, used by the dashboard charts.

Auth: Clerk session

Query params: poll_id, date_range, filter_duplicates, vote_via_filter, question_filters

GET/api/polls/get-poll-engagement-stats

Returns engagement metrics for a survey: total views, response count, completion rate, and device/browser breakdown.

Auth: Clerk session

Query params: poll_id, date_range, filter_duplicates, vote_via_filter

GET/api/polls/get-poll-rating-trends

Returns time-series average rating data for rating-type questions (NPS, star, emoji, scale), used to render trend charts.

Auth: Clerk session

Query params: poll_id, question_id, date_range, filter_duplicates

GET/api/polls/get-user-feedback-activity-stats

Returns account-level response activity stats (total responses, responses over time) across all of the user's surveys.

Auth: Clerk session

GET/api/polls/get-user-attributes

Returns the distinct custom attribute keys seen across all responses for a survey, used to populate the filter UI.

Auth: Clerk session

Query params: poll_id

DELETE/api/polls/delete-poll-answer

Deletes an individual survey response. Only the survey owner can delete responses from their own surveys.

Auth: Clerk session

Body: { poll_answer_id: string, poll_id: string }

POST/api/alerts/slack/webhook

Saves or removes a Slack incoming webhook URL for the user's account. When set, new survey responses are also POSTed to this Slack webhook.

Auth: Clerk session

Body: { webhook_url: string | null }

Need help Let us know