Connect Retool to SurveyMonkey using a REST API Resource with OAuth 2.0 authentication. Once configured, you can build interactive survey results dashboards that display response data, completion rates, and answer distributions — with Retool Charts for visualizations and Table components for drilling into individual responses that SurveyMonkey's native analytics do not support.
| Fact | Value |
|---|---|
| Tool | SurveyMonkey |
| Category | Analytics |
| Method | REST API Resource |
| Difficulty | Beginner |
| Time required | 20 minutes |
| Last updated | April 2026 |
Build a Custom Survey Analytics Dashboard on Top of SurveyMonkey
SurveyMonkey's native analytics are useful for quick result summaries, but they fall short when teams need to cross-filter responses, combine survey data with internal records, export custom views, or build department-specific dashboards that different stakeholders can access without a SurveyMonkey license. Retool bridges this gap by connecting directly to SurveyMonkey's REST API and presenting survey data in fully configurable Tables, Charts, and filters that match your exact reporting workflow.
The connection works through SurveyMonkey's API v3, which uses OAuth 2.0 for authentication. You register a SurveyMonkey developer application to obtain an access token, configure a single REST API Resource in Retool with that token, and then build queries for each data type you need — survey metadata, question definitions, and individual responses. Retool proxies all requests server-side, so the OAuth token is never exposed in the browser. Results from multiple survey queries can be joined using JavaScript transformers to produce unified views that SurveyMonkey's native reporting cannot create.
This integration is particularly valuable for research and HR teams that run recurring surveys. Once the Retool dashboard is built, non-technical stakeholders can access it through Retool's public app sharing or embedded access, filtering by date range, demographic attributes, or response status — without needing a SurveyMonkey seat. For enterprise survey programs with multiple active surveys, a single Retool app can surface all survey results in one place with consistent formatting and filtering.
Integration method
SurveyMonkey connects to Retool via a REST API Resource using OAuth 2.0 Bearer token authentication. You register an application in SurveyMonkey's developer portal to obtain an access token, then configure it once in Retool's Resources tab with api.surveymonkey.com as the base URL. All queries for surveys, responses, and question data are built visually in Retool's query editor. Retool proxies every request server-side, keeping your OAuth token off the browser.
Prerequisites
- A SurveyMonkey account with at least one survey containing responses
- A SurveyMonkey developer app created at developer.surveymonkey.com to obtain API credentials
- A Retool account (Cloud or self-hosted) with permission to create Resources
- Basic understanding of OAuth 2.0 tokens and REST API configuration
- For enterprise plans: SurveyMonkey Enterprise or Team plan required to access bulk response export endpoints
Step-by-step guide
Create a SurveyMonkey developer app and get an access token
Navigate to developer.surveymonkey.com and sign in with your SurveyMonkey account credentials. In the developer portal, click 'My Apps' in the top navigation bar, then click 'Add App'. Give your application a name (e.g., 'Retool Integration') and a short description. Under App Type, select 'Private App' — this type generates a long-lived access token that never expires, which is ideal for server-to-server integrations like Retool where you do not want users to go through an OAuth consent flow. Click 'Create App'. Once the app is created, you will be taken to its settings page. Navigate to the 'Credentials' tab. You will see a Client ID, Client Secret, and — most importantly for private apps — an Access Token field. The access token for a private app is pre-generated and acts as a Bearer token for all API requests authenticated as your SurveyMonkey account. Copy this access token and store it safely. Note: private app tokens have access to all surveys and responses owned by the account used to create the developer app. If you need to access surveys from multiple team members' accounts, you will need an Enterprise plan with shared team survey access or implement a full OAuth 2.0 authorization code flow — which is beyond the scope of this guide. For most team use cases, a private app token on an admin account that owns all shared surveys is sufficient.
Pro tip: SurveyMonkey private app tokens are long-lived and do not expire unless revoked. Store the token as a secret configuration variable in Retool rather than pasting it directly into the Resource — this makes rotation possible without editing the resource.
Expected result: A SurveyMonkey developer app is created with a private app access token visible in the Credentials tab. The token is copied and ready to configure in Retool.
Configure a REST API Resource in Retool
In Retool, navigate to the Resources tab from the left sidebar of your organization homepage. Click '+ Create new', scroll the connector list, and select 'REST API'. On the configuration screen, set the Name to something descriptive like 'SurveyMonkey API'. Set the Base URL to https://api.surveymonkey.com. Under Authentication, select 'Bearer token' from the dropdown and paste your SurveyMonkey private app access token in the token field. In the Headers section, click 'Add header' and add Content-Type with value application/json — this is required for any POST requests you might use for advanced filters. Leave all other fields at their defaults. Click 'Test connection' to verify that the base URL and token are valid. Retool makes a lightweight request to confirm connectivity. If the test passes, click 'Save resource'. The SurveyMonkey REST API Resource is now available to all apps in your Retool organization. Because Retool proxies all requests through its server-side backend, the Bearer token is never visible in browser network traffic, and users of your Retool app cannot extract the SurveyMonkey credentials from DevTools.
Pro tip: SurveyMonkey's API enforces rate limits of 120 requests per minute per app. For dashboards with many auto-run queries, add query caching (Query editor → Advanced → Cache results, set to 120 seconds) to avoid hitting rate limits during page loads.
Expected result: A REST API Resource named 'SurveyMonkey API' is saved in Retool with a successful test connection. The resource appears in the query editor dropdown when creating new queries.
Query the surveys list endpoint
Open a Retool app (or create a new one) and navigate to the Code panel at the bottom. Click '+ New query', select your SurveyMonkey API resource, and name the query getSurveys. Set the Method to GET and the URL path to /v3/surveys. Add URL parameters to control the response: set per_page to 50 (the maximum SurveyMonkey returns per page), include to the value response_count (this tells SurveyMonkey to include response counts in the survey list response, saving a separate API call per survey), and sort_by to date_modified and sort_order to DESC to see most-recently-updated surveys first. Click 'Run query' to test. SurveyMonkey returns a data array where each object includes the survey id, title, response_count, date_created, date_modified, and a links object with a self URL. Also note the total field at the root of the response and a per_page and page field for pagination. Create a JavaScript transformer (click Advanced → Transform results) to flatten the response and extract just the fields you need for a summary table. Drag a Table component onto the canvas and set its Data source to {{ getSurveys.data }} to display the survey list.
1{2 "method": "GET",3 "path": "/v3/surveys",4 "params": {5 "per_page": "50",6 "include": "response_count",7 "sort_by": "date_modified",8 "sort_order": "DESC",9 "page": "{{ Math.ceil((table1.paginationOffset || 0) / 50) + 1 }}"10 }11}Pro tip: The include=response_count parameter is essential for building a survey list dashboard without making N additional API calls — one per survey — to get response counts. Without it, you would need a second query per survey row.
Expected result: The query returns a JSON object with a data array of survey objects, each containing id, title, response_count, and date_modified. A Table component bound to this query displays all surveys in rows.
Fetch responses with question details for a selected survey
When a user clicks a row in the surveys Table, a second query should fetch the detailed responses for that survey. In the Code panel, create a new query named getSurveyResponses. Set the Method to GET and the URL path to /v3/surveys/{{ table1.selectedRow.id }}/responses/bulk. The bulk endpoint is critical — it returns complete response data including answers to all questions in a single call, unlike the paginated /responses endpoint which requires fetching each response individually. Add URL parameters: per_page set to 100 (maximum for the bulk endpoint), page for pagination, and sort_order set to DESC. Also create a third query named getSurveyDetails with path /v3/surveys/{{ table1.selectedRow.id }}/details — this returns the full survey structure including all question definitions, page layouts, and answer choice labels. You need this to map answer choice IDs back to human-readable text, since the responses endpoint returns choice IDs (numeric codes) rather than the text of each answer option. Set both queries to run automatically when the selected table row changes by enabling 'Run this query on page load' and adding an event handler on the surveys Table: Event: Row click → Action: Trigger query → select getSurveyResponses and getSurveyDetails. Both queries run server-side through Retool's proxy, so there is no CORS issue despite calling different API endpoints in parallel.
1{2 "method": "GET",3 "path": "/v3/surveys/{{ table1.selectedRow.id }}/responses/bulk",4 "params": {5 "per_page": "100",6 "page": "1",7 "sort_order": "DESC"8 }9}Pro tip: The /responses/bulk endpoint requires SurveyMonkey Advantage or higher (Team or Enterprise plan). If you are on a Basic plan, you can only access /responses which requires fetching each response individually — a much slower approach for large surveys.
Expected result: Clicking a survey row triggers both getSurveyResponses and getSurveyDetails queries. The responses query returns a data array of response objects, each with a pages array containing question answer data. The details query returns the full question structure with text and choice labels.
Transform response data and build the analytics dashboard
Raw SurveyMonkey response data is deeply nested — each response contains pages, each page contains questions, and each question contains answers as choice IDs. You need a JavaScript transformer to flatten this into analyzable data and build an answer distribution summary for display in Charts. Create a JavaScript query named analyzeResponses in the Code panel. This transformer accesses both getSurveyResponses.data and getSurveyDetails.data to join answers with their question text and choice labels. First, build lookup maps from the survey details: a map from question ID to question text, and a map from choice ID to choice text for multiple-choice questions. Then iterate over all responses and flatten each answer into a row with question text, answer text, and respondent metadata like date_modified and custom_variables if present. Return the flattened array. To build an answer distribution chart, create a second JavaScript query that groups the flattened responses by question ID and counts how many respondents selected each answer choice. Format the output as an array of objects with labels and values for binding to a Retool Chart component. Drag a Chart component onto the canvas, set its type to Bar, and bind its data source to {{ answerDistribution.data }}. For complex survey analytics dashboards combining multiple surveys with cross-tabulation and demographic filtering, RapidDev's team can help architect the full Retool solution.
1// Transform SurveyMonkey bulk responses + survey details into flat analyzable rows2const responses = getSurveyResponses.data?.data || [];3const details = getSurveyDetails.data;45// Build question lookup: question_id -> question text6const questionMap = {};7const choiceMap = {};8(details?.pages || []).forEach(page => {9 (page.questions || []).forEach(q => {10 questionMap[q.id] = q.headings?.[0]?.heading || `Question ${q.id}`;11 if (q.answers?.choices) {12 q.answers.choices.forEach(c => {13 choiceMap[c.id] = c.text;14 });15 }16 });17});1819// Flatten all responses into rows20const rows = [];21responses.forEach(response => {22 const respondentDate = new Date(response.date_modified).toLocaleDateString();23 (response.pages || []).forEach(page => {24 (page.questions || []).forEach(q => {25 (q.answers || []).forEach(answer => {26 rows.push({27 response_id: response.id,28 date: respondentDate,29 question: questionMap[q.id] || q.id,30 answer: choiceMap[answer.choice_id] || answer.text || answer.row_id || 'N/A'31 });32 });33 });34 });35});3637return rows;Pro tip: SurveyMonkey choice IDs are numeric strings that differ from choice text. Always join responses with survey details to display human-readable answer labels — presenting raw choice IDs in a dashboard confuses stakeholders.
Expected result: The JavaScript transformer outputs a flat array with one row per question-answer pair per respondent. Chart components bound to the distribution data show bar charts of answer frequencies. The Table below shows all individual responses with readable question and answer text.
Common use cases
Build an employee engagement survey dashboard
Your HR team runs a quarterly employee engagement survey in SurveyMonkey and wants a dashboard showing overall completion rate, scores by department, and a table of verbatim open-text responses. The Retool app queries SurveyMonkey's responses endpoint, calculates completion rate from total_respondent vs start_count, groups scores by a department demographic field, and presents open-text answers in a filterable Table — replacing an hours-long manual export and Excel pivot table process.
Build an HR dashboard that fetches all responses to a specific SurveyMonkey survey ID, calculates overall completion rate and average score per question, groups results by department (from a custom demographic field), and shows open-text responses in a filterable Table with a date range picker.
Copy this prompt to try it in Retool
Create a customer satisfaction tracking panel
Your support team sends a SurveyMonkey CSAT survey after every support ticket closes and wants to track satisfaction scores over time. The Retool app pulls weekly survey responses, calculates the weekly average CSAT score, and displays a time-series line chart. A Table below shows individual responses with the ticket ID and agent name pulled from your internal database — combining SurveyMonkey data with internal records in a way native SurveyMonkey reporting cannot achieve.
Build a CSAT dashboard that fetches SurveyMonkey responses for a satisfaction survey, groups them by week, calculates the average rating per week, and displays a Line Chart of weekly CSAT trends. Add a Table showing individual responses joined with ticket data from a PostgreSQL query using the ticket_id field.
Copy this prompt to try it in Retool
Build a multi-survey research management panel
Your market research team manages a dozen active SurveyMonkey surveys across different product lines. They need a single Retool panel showing all surveys, their response counts, completion rates, and the date of the most recent response — replacing manual checks in SurveyMonkey's dashboard. Clicking a survey row drills down into the individual survey's response data and question-by-question breakdown.
Build a survey management panel that lists all SurveyMonkey surveys from the /v3/surveys endpoint showing title, response_count, date_modified, and completion rate. Clicking a row in the table triggers a detail query that fetches full responses for that survey ID and displays them in a second Table below.
Copy this prompt to try it in Retool
Troubleshooting
Query returns 401 Unauthorized despite a valid-looking access token
Cause: The access token was generated for a different SurveyMonkey environment, the token was revoked, or the private app was deleted. SurveyMonkey also returns 401 if the Bearer token format is incorrect.
Solution: Navigate back to developer.surveymonkey.com → My Apps → your app → Credentials and verify the access token is still present and matches what you pasted into Retool. Regenerate the token if needed. Update the Bearer token in your Retool Resource configuration: Resources tab → select SurveyMonkey API → edit the token field → Save resource. Ensure the Authorization header format is 'Bearer YOUR_TOKEN' — the Bearer prefix is handled automatically by Retool's Bearer token auth type, so do not include it in the token field.
The /responses/bulk endpoint returns 403 Forbidden
Cause: The bulk responses endpoint requires SurveyMonkey Advantage, Team, or Enterprise plan. Free and Basic plan accounts can only access individual response endpoints, not the bulk export endpoint.
Solution: Upgrade your SurveyMonkey account to Team or Enterprise plan to unlock the bulk endpoint. As a workaround on Basic plans, use the /v3/surveys/{id}/responses endpoint with pagination and fetch responses page by page — this is significantly slower for surveys with many responses but works with lower-tier plans.
Response data shows numeric choice IDs instead of answer text
Cause: The bulk responses endpoint returns choice_id values (numeric codes) for multiple-choice answers rather than the human-readable choice text. The choice text is only available in the survey details endpoint.
Solution: Always fetch the survey details endpoint (/v3/surveys/{id}/details) alongside the responses endpoint, then join them in a JavaScript transformer using the choice IDs as lookup keys. Build a choiceMap object from the survey details answers.choices array and use it to translate IDs to text in the transformer.
1// Build choice lookup from survey details2const choiceMap = {};3(getSurveyDetails.data?.pages || []).forEach(page => {4 (page.questions || []).forEach(q => {5 (q.answers?.choices || []).forEach(c => {6 choiceMap[c.id] = c.text;7 });8 });9});Dashboard shows no data when switching between surveys in the Table
Cause: The detail queries (getSurveyResponses, getSurveyDetails) are not configured to re-run automatically when the selected Table row changes. They run once on page load with an undefined survey ID and do not refresh on row selection.
Solution: In the surveys Table component properties, navigate to the Event Handlers section and add a Row Click event handler. Set the Action to 'Trigger query' and select getSurveyResponses. Add a second Row Click handler for getSurveyDetails. Both queries will then re-run with the newly selected survey ID each time a row is clicked.
Best practices
- Store the SurveyMonkey access token as a secret configuration variable in Retool (Settings → Configuration Variables, marked as secret) and reference it in the Resource as {{ retoolContext.configVars.SURVEYMONKEY_TOKEN }} — this prevents the token from being visible in the Resource configuration UI to non-admin Retool users.
- Use the include=response_count parameter on the /v3/surveys endpoint to get response counts in the survey list without making additional API calls — this significantly reduces API call volume for dashboards showing many surveys.
- Enable query caching on the getSurveys query (Query editor → Advanced → Cache results, 120 seconds) to avoid hitting SurveyMonkey's 120 requests/minute rate limit when multiple users load the dashboard simultaneously.
- Always fetch survey details (/v3/surveys/{id}/details) alongside bulk responses to translate choice IDs into human-readable answer text — never display raw numeric choice IDs to end users in Tables or Charts.
- Use SurveyMonkey's date_modified filter parameter (start_modified_at, end_modified_at) on the responses endpoint for dashboards that only need recent responses — fetching all historical responses for large surveys with thousands of respondents is slow and generates many API calls.
- For recurring survey programs, build a Retool Workflow with a Schedule trigger that exports survey responses to your internal database on a daily basis. This creates a local cache of survey data that dashboard queries can run against, completely eliminating SurveyMonkey API rate limit concerns for reporting.
- Test your dashboard against a survey with diverse question types (multiple choice, rating scales, open text, matrix) before deploying — each question type returns different answer structures in the API and requires specific transformer handling.
Alternatives
Typeform is better suited for conversational, single-question-at-a-time form experiences and connects to Retool via personal access token with webhook support for real-time response processing.
Qualtrics is an enterprise-grade survey and experience management platform with more advanced analytics and is a better fit for large organizations with complex research methodologies and compliance requirements.
Google Analytics tracks website and app behavior data rather than survey responses, and is the better choice when you need user behavior insights rather than structured survey feedback data.
Frequently asked questions
Does Retool have a native SurveyMonkey connector?
No. Retool does not have a dedicated native connector for SurveyMonkey as of 2026. The connection is made through a generic REST API Resource using SurveyMonkey's v3 API and OAuth 2.0 Bearer token authentication. This works fully — all surveys, responses, and analytics endpoints are accessible through the REST API Resource.
Which SurveyMonkey plan do I need to use the API?
API access requires at minimum the Advantage plan. The free and Basic plans do not include API access. The bulk responses endpoint (/v3/surveys/{id}/responses/bulk) requires Team or Enterprise plan. If you are on Advantage, you can access individual responses one at a time through paginated endpoints, which works but is slower for large surveys.
Can I display open-text survey responses in Retool?
Yes. Open-text responses are returned in the answers array of each response as text fields (not choice IDs). Your JavaScript transformer can extract these directly and display them in a Retool Table with text wrapping enabled. You can also add a TextArea component that shows the full open-text response when a row is selected in the Table.
How do I handle surveys with hundreds of responses?
SurveyMonkey's bulk endpoint returns up to 100 responses per page. For surveys with more responses, implement pagination using the page URL parameter. In Retool, enable Table pagination and bind the page parameter to the Table's pagination state. Alternatively, use a Retool Workflow on a schedule to export all responses to your internal database incrementally, then build the dashboard against your database instead of calling SurveyMonkey's API directly for each page load.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation