Skip to main content
RapidDev - Software Development Agency
retool-integrationsREST API Resource

How to Integrate Retool with Doodle

Connect Retool to Doodle using a REST API Resource with a Bearer token. Once configured, you can pull poll results, participant responses, and scheduling outcomes into Retool dashboards — building a meeting scheduler panel that aggregates Doodle polls with calendar data to surface optimal meeting times across your organization.

What you'll learn

  • How to generate a Doodle API token and configure a REST API Resource in Retool
  • How to query Doodle polls and retrieve participant responses via GET requests
  • How to use JavaScript transformers to reshape Doodle's nested response format into flat table data
  • How to build a meeting scheduler dashboard combining poll results with availability data
  • How to surface optimal meeting times using Retool Table and Chart components
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Beginner16 min read15 minutesProductivityLast updated April 2026RapidDev Engineering Team
TL;DR

Connect Retool to Doodle using a REST API Resource with a Bearer token. Once configured, you can pull poll results, participant responses, and scheduling outcomes into Retool dashboards — building a meeting scheduler panel that aggregates Doodle polls with calendar data to surface optimal meeting times across your organization.

Quick facts about this guide
FactValue
ToolDoodle
CategoryProductivity
MethodREST API Resource
DifficultyBeginner
Time required15 minutes
Last updatedApril 2026

Build a Centralized Meeting Scheduler Dashboard with Doodle and Retool

Scheduling meetings across large teams is one of the most common operational friction points. Doodle solves the coordination problem with group availability polls, but once you have dozens of active polls spread across an organization, tracking outcomes, following up on non-respondents, and correlating scheduling patterns becomes difficult inside Doodle's own interface. Retool gives operations and executive assistant teams a centralized view: all active polls, response rates, and finalized meeting times in a single admin panel.

The integration works through Doodle's REST API, which exposes endpoints for listing polls, retrieving participant responses, and accessing poll metadata. In Retool, you configure a REST API Resource once with your Doodle API credentials, then build queries that populate Table components with poll data and participant lists. Because Retool proxies all requests server-side, there are no CORS issues and your credentials never appear in browser network traffic.

Beyond simple poll listing, a Retool-Doodle integration enables operational workflows that Doodle's native UI does not support: filtering polls by creator or date range, tracking which polls have no confirmed time yet, bulk-sending follow-up notifications via a connected messaging Resource, and building historical reports of meeting scheduling velocity across departments.

Integration method

REST API Resource

Doodle connects to Retool via a REST API Resource using Doodle's REST API with a Bearer token for authentication. You configure the base URL and token once in the Resources tab, then build individual queries to fetch poll data, participant responses, and scheduling results. Retool proxies all requests server-side, so your token never reaches the browser.

Prerequisites

  • A Doodle account with existing polls or the ability to create new ones
  • A Retool account (Cloud or self-hosted) with permission to create Resources
  • A Doodle API access token obtained from the Doodle developer portal or your account settings
  • Basic familiarity with Retool's query editor and component panel
  • The poll IDs or organizer email for the polls you want to surface in Retool

Step-by-step guide

1

Obtain a Doodle API access token

Before configuring anything in Retool, you need API credentials from Doodle. Doodle's API access is available through their developer program. Navigate to the Doodle developer documentation at doodle.com/api/v2.0/doc and review the authentication requirements. Doodle issues OAuth 2.0 access tokens or API tokens depending on your account type and plan level. For organizational or team accounts, you can typically generate a token through your Doodle account settings under the API or integrations section — look for 'API Access' or 'Developer Settings'. If you are on a business plan, contact Doodle support to request API access, as it may need to be enabled for your organization. Once you have your Bearer token or OAuth access token, copy it somewhere safe temporarily. You will paste it into Retool in the next step. Note that Doodle's API may require HTTPS and enforces rate limits — typically allowing several hundred requests per hour depending on your plan tier. If your organization does not yet have API access, Doodle's basic polling data can also be accessed through their public API for specific poll IDs without authentication, though authenticated access gives you full organizational visibility across all polls created by your team.

Pro tip: If your Doodle account is under a business plan, API access may need to be enabled by your account administrator before you can generate tokens.

Expected result: A Doodle API access token ready to paste into the Retool resource configuration.

2

Create a REST API Resource in Retool

In Retool, navigate to the Resources tab in the left sidebar of your organization homepage. Click '+ Create new' or '+ Add resource', scroll through the connector list, and select 'REST API'. On the resource configuration screen, fill in the following fields: in the Name field, enter something descriptive like 'Doodle API' so it is easy to identify in the query editor later. In the Base URL field, enter https://api.doodle.com/api/v2.0 — this is the base path for Doodle's REST API v2. For Authentication, select 'Bearer token' from the dropdown and paste your Doodle access token into the token field. If Doodle requires additional headers for your account type, click 'Add header' and enter any required values such as Accept: application/json or Content-Type: application/json. Leave all other fields at their defaults for now — no additional URL parameters or custom auth flows are needed for basic poll access. Scroll down and click 'Save resource'. Retool saves the resource and makes it available to all apps in your organization. All requests made through this resource are proxied server-side by Retool's backend, meaning your Bearer token is never transmitted to end users' browsers. If you need to connect to a different Doodle environment or test with a separate set of credentials, simply create an additional REST API resource with a different name.

Pro tip: Test the connection after saving by creating a quick GET query to /polls to verify your token is valid and the base URL is correct.

Expected result: A saved REST API Resource named 'Doodle API' appears in your Resources list and is available for use in Retool app queries.

3

Write a query to list polls and retrieve poll details

Open the Retool app where you want to display Doodle data, or create a new app from the Apps tab. In the Code panel at the bottom, click '+ New query' and select your Doodle API resource. For listing all polls associated with your account, set the Method to GET and the URL path to /polls. Add any relevant URL parameters: the Doodle API may support filtering by status (open, closed), by organizer, or by date range — check the specific query parameter names in Doodle's API documentation. For fetching details of a specific poll including participant responses, create a second query with Method GET and URL path /polls/{{ pollIdInput.value }} — where pollIdInput is a TextInput component on your canvas. This returns the full poll object including the list of options, participants, and their availability selections. Name your list query getPolls and your detail query getPollDetails. Run each query by clicking the Run button to confirm the responses are structured as expected. Doodle's API returns JSON with poll objects containing fields for id, title, organizer, options (time slots), participants, and status. Use the response preview in the query editor to understand the exact field names before building your transformer in the next step.

query-config.json
1{
2 "method": "GET",
3 "path": "/polls",
4 "params": {
5 "status": "open",
6 "limit": "50"
7 }
8}

Pro tip: Doodle poll IDs are typically alphanumeric strings. You can find the poll ID in the Doodle poll URL — it is the string after /poll/ in the address bar.

Expected result: The getPolls query returns a JSON array of poll objects. The getPollDetails query returns a single poll object with options and participant response data.

4

Transform poll responses into a flat table structure

Doodle's API returns poll data in a nested format that is not directly suitable for Retool's Table component. Each poll contains an array of options (time slots) and a participants array where each participant has an array of preference values (yes, yes_if_need_be, no) corresponding to each time slot. You need a JavaScript transformer to flatten this into rows suitable for display. In the query editor for your getPolls query, click the 'Advanced' tab and toggle on 'Transform results'. Write a transformer that maps each poll object to a flat row with the key metadata fields. For the detail view showing participant responses per time slot, write a second transformer on getPollDetails that pivots the data — creating one row per participant with columns for each time slot option and that participant's preference. Drag a Table component from the component panel onto the canvas. Set its Data source to {{ getPolls.data }} to display the list of polls. Add a column for response rate (calculated as respondents / total invitees * 100). When a row is clicked, the getPollDetails query fires via an event handler, and a second Table below or a Container with TextInput components shows the detail view. Configure the Table's row selection event handler: click the Table component → Event Handlers → Add handler → Action: Trigger query → select getPollDetails.

transformer.js
1// Transformer: flatten poll list into table rows
2const polls = data.polls || data || [];
3return polls.map(poll => ({
4 id: poll.id,
5 title: poll.title || 'Untitled Poll',
6 organizer: poll.organizer?.name || poll.organizer || 'N/A',
7 status: poll.state || poll.status || 'unknown',
8 options_count: (poll.options || []).length,
9 respondents: (poll.participants || []).filter(p => p.availability).length,
10 total_invitees: (poll.participants || []).length,
11 response_rate: (poll.participants || []).length > 0
12 ? Math.round(((poll.participants || []).filter(p => p.availability).length / (poll.participants || []).length) * 100) + '%'
13 : 'N/A',
14 created: poll.created ? new Date(poll.created).toLocaleDateString() : 'N/A',
15 finalized_time: poll.finalizedSlot ? new Date(poll.finalizedSlot).toLocaleString() : 'Not yet finalized'
16}));

Pro tip: Use console.log(data) in the transformer editor to inspect the exact field names from Doodle's API response before writing the final transformation logic.

Expected result: The Table component displays a row for each active Doodle poll with columns for title, organizer, status, response rate, and finalized time. Clicking a row triggers the detail query.

5

Build the participant response detail view

For a fully functional scheduler dashboard, you need a detail view that shows exactly which participants are available for which time slots. This view is best built as a Container component below the poll list table, shown only when a poll is selected. Drag a Container component onto the canvas and position it below the polls Table. Inside the container, add a second Table component. Set its Data source to {{ getPollDetails.data }} — this table will show one row per participant with their availability for each time slot. Add a Text component at the top of the container showing 'Responses for: {{ pollTable.selectedRow.title }}' to provide context. To show the count of 'Yes' responses per time slot, add a JavaScript transformer on getPollDetails that aggregates availability counts: iterate over all time slot options, count how many participants selected 'yes' for each slot, and return an array of slot objects with title and yes_count. Bind a Bar Chart component to this aggregated data to visually highlight the most popular time slots. Add a Button component labeled 'Copy Best Time' with an event handler that calls clipboard copy on the slot with the highest yes count. For teams managing many polls simultaneously, consider adding a filter TextInput above the polls table that dynamically filters by organizer name using {{ getPolls.data.filter(p => p.organizer.includes(filterInput.value)) }}. For complex integrations involving multiple scheduling tools, custom transformers, and notification workflows, RapidDev's team can help architect and build your Retool solution.

slot-aggregator.js
1// Transformer: aggregate yes votes per time slot
2const poll = data;
3const options = poll.options || [];
4const participants = poll.participants || [];
5
6return options.map((option, idx) => {
7 const yesCount = participants.filter(p => {
8 const pref = Array.isArray(p.availability) ? p.availability[idx] : null;
9 return pref === 1 || pref === true || pref === 'yes';
10 }).length;
11 const ifNeededCount = participants.filter(p => {
12 const pref = Array.isArray(p.availability) ? p.availability[idx] : null;
13 return pref === 2 || pref === 'yes_if_needed';
14 }).length;
15 return {
16 slot: option.start ? new Date(option.start).toLocaleString() : `Option ${idx + 1}`,
17 yes_votes: yesCount,
18 if_needed_votes: ifNeededCount,
19 total_available: yesCount + ifNeededCount,
20 no_votes: participants.length - yesCount - ifNeededCount
21 };
22}).sort((a, b) => b.total_available - a.total_available);

Pro tip: Sort the aggregated slots by total_available descending so the best meeting time always appears at the top of the chart and table.

Expected result: Clicking any poll in the top table loads its participant responses below. A Bar Chart shows vote counts per time slot, with the most popular slot highlighted. The detail container is hidden when no poll is selected.

6

Handle authentication errors and add query refresh logic

Production Doodle dashboards need proper error handling and data refresh logic. Doodle API tokens may expire depending on the authentication method used — OAuth 2.0 tokens typically expire after an hour, while longer-lived tokens may need periodic rotation. Implement the following patterns in your Retool app. First, add error handling on your main getPolls query: in the Query editor → Failure tab, add an event handler that shows a notification with the message 'Failed to load polls — token may have expired. Update the Doodle API resource credentials.' using Show notification action. Second, add a Refresh button above the polls table: drag a Button component labeled 'Refresh Polls', and in its onClick event handler, trigger the getPolls query. This allows users to manually reload data without refreshing the entire browser page. Third, enable automatic query refresh: in the getPolls query editor → Advanced tab, check 'Run query on a schedule' and set the interval to 300000 ms (5 minutes) so the dashboard stays current without manual refreshes. Fourth, configure the query's Trigger mode — set it to 'Automatic' so it runs when the app loads. For apps where users need to filter polls by date range, add two DatePicker components and pass their values as URL parameters on the getPolls query using {{ datePicker1.value }} and {{ datePicker2.value }}. Retool will re-run the query automatically whenever the date picker values change if the query is set to trigger on input change.

Pro tip: Use Retool's configuration variables (Settings → Configuration Variables) to store your Doodle API token rather than pasting it directly into the resource. This allows token rotation without editing the resource configuration.

Expected result: The dashboard automatically refreshes poll data every 5 minutes. Manual refresh works via the Refresh button. Authentication errors display a clear notification with guidance on how to resolve the issue.

Common use cases

Build a poll response tracking dashboard

Your executive assistant team manages dozens of Doodle polls across multiple departments. You need a Retool panel that shows all active polls, their response rates, and which polls are overdue for a decision. The dashboard lets admins click into any poll to see individual participant responses and mark the poll as finalized.

Retool Prompt

Build an admin panel that lists all active Doodle polls with columns for poll title, creator, creation date, number of participants who responded, and whether a time has been selected. Add a row click handler that opens a side panel showing individual participant availability for the selected poll.

Copy this prompt to try it in Retool

Create a meeting time optimization report

Your ops team wants to analyze scheduling patterns across the organization — which time slots are most popular, how long polls typically take to finalize, and which teams have the lowest response rates. Retool can query completed Doodle polls, transform the response data, and display a Chart component showing availability patterns across the week.

Retool Prompt

Build a scheduling analytics dashboard that pulls all Doodle polls from the last 90 days, uses a JavaScript transformer to count participant votes per time slot, and displays a Bar Chart showing the most popular meeting time slots. Add a Table below with poll completion rates sorted by department.

Copy this prompt to try it in Retool

Build a non-respondent follow-up panel

For important polls, you need to identify invitees who haven't responded and trigger follow-up notifications. A Retool app can query a Doodle poll's participant list, compare it to the responders list, and surface the gap — then optionally trigger a Slack or email notification via a connected Retool Resource.

Retool Prompt

Build a follow-up tool that takes a Doodle poll ID from a text input, fetches the poll details and all participants, compares invitees to responders, and displays a table of non-respondents. Add a 'Send Reminder' button that triggers a Slack message Resource query to notify each non-respondent.

Copy this prompt to try it in Retool

Troubleshooting

Query returns 401 Unauthorized or 403 Forbidden

Cause: The API token is invalid, expired, or the account does not have API access enabled. Doodle's API may require a business or premium account with API features explicitly activated.

Solution: Verify the token in your Retool resource configuration by navigating to Resources tab → select your Doodle resource → check the Bearer token field. Regenerate the token in Doodle's developer settings if it may have expired. If you are on a free or basic Doodle plan, contact Doodle support to confirm API access is available for your plan tier.

Transformer returns empty arrays or 'undefined' for participant fields

Cause: The field names in Doodle's API response do not match what you are accessing in the transformer. Doodle's API may return participants as 'participants', 'attendees', or nested differently depending on the endpoint version.

Solution: Open the query editor, run the query, and click 'State' in the query result panel to inspect the raw response structure. Use console.log(JSON.stringify(data, null, 2)) in the transformer to print the full structure. Update field access paths in your transformer to match the actual response keys.

typescript
1// Safe transformer with fallback field access
2const polls = data?.polls || data?.items || (Array.isArray(data) ? data : []);
3return polls.map(poll => ({
4 id: poll.id,
5 title: poll.title || poll.name || 'Untitled',
6 participants: (poll.participants || poll.attendees || []).length
7}));

Queries time out or return rate limit errors (429)

Cause: Doodle's API enforces per-hour request limits. Frequent automatic refresh queries or multiple users triggering queries simultaneously can exceed the limit.

Solution: Increase the query refresh interval from 5 minutes to 15 or 30 minutes. Add query caching in the Advanced tab of each query with a cache duration matching your refresh interval. For dashboards with multiple simultaneous users, consider fetching data through a Retool Workflow that caches results in Retool Database, reducing direct API calls.

Poll detail query returns 404 for a valid poll ID

Cause: The poll ID passed to the detail endpoint may be malformed, or the poll has been deleted or expired. Doodle polls that are older than a certain period may no longer be accessible via the API.

Solution: Verify the poll ID by copying it directly from the Doodle poll URL. Ensure the TextInput or table row reference used in the dynamic path is returning a clean string value without leading or trailing whitespace. Add .trim() to the Retool expression: /polls/{{ pollIdInput.value.trim() }}.

Best practices

  • Store your Doodle API token as a secret configuration variable in Retool (Settings → Configuration Variables, mark as secret) and reference it in the resource rather than hardcoding the token value directly.
  • Enable query caching on the getPolls query (Advanced tab → Cache results, 5-minute TTL) to reduce API calls for dashboards with multiple concurrent users.
  • Use Retool's scheduled query refresh at a reasonable interval (10-15 minutes) rather than triggering queries on every user interaction, to stay within Doodle's API rate limits.
  • Add error handling event handlers on all Doodle queries so users see a clear notification when API calls fail, rather than empty tables with no explanation.
  • Filter polls server-side using API query parameters (status, date range) rather than fetching all polls and filtering in a transformer — this keeps API payloads small and query performance fast.
  • Create separate Retool Resources for test and production Doodle accounts if your organization uses both, and use Retool's environment configuration to switch between them without changing app code.
  • Document the Doodle poll ID format in a Text component or tooltip on your dashboard so operations team members know where to find poll IDs when using the detail view.

Alternatives

Frequently asked questions

Does Doodle have a public REST API for all account types?

Doodle's API availability depends on your account plan. Business and enterprise accounts typically have full API access. Free and basic accounts may have limited or no API access. Contact Doodle support or check their developer documentation to confirm what API features are available for your plan. For some use cases, Doodle's public poll API (which does not require authentication) can retrieve data for specific polls using their ID.

Can I create Doodle polls directly from Retool?

Yes, if Doodle's API exposes a POST /polls endpoint with your account tier, you can build a Retool form that collects the poll title, time slot options, and participant emails, then submits a POST request to create the poll programmatically. Configure the POST query body with the required fields from Doodle's API documentation and wire a Form component's submit button to trigger the create query.

Can Retool receive real-time updates when poll responses come in?

Retool itself does not maintain a persistent WebSocket connection to external APIs. For near-real-time updates, configure the getPolls query to run on a schedule (every 1-5 minutes) using the Advanced tab's 'Run query on a schedule' option. For true real-time notifications, use a Retool Workflow with a webhook trigger that Doodle can call when participants submit responses — if Doodle supports outbound webhooks.

How do I display the best meeting time from a Doodle poll in Retool?

Use a JavaScript transformer on your poll detail query to count 'yes' votes per time slot option. Sort the resulting array by yes_count descending and bind the first item to a Text component or highlight it in a Chart. The transformer returns a flat array of slot objects with vote counts that can be bound to a Bar Chart to visually compare options.

Is it possible to send follow-up emails to non-respondents from Retool?

Yes. Build a Retool query that compares the full participant list from a Doodle poll against those who have submitted responses, producing a list of non-respondents. Add a connected email resource (SendGrid, Mailchimp, or similar) to Retool and create a 'Send Reminder' button that triggers a POST query to the email API for each non-respondent. Alternatively, use a Retool Workflow to automate this process on a schedule.

RapidDev

Talk to an Expert

Our team has built 600+ apps. Get personalized help with your project.

Book a free consultation

Integrations are where projects stall

We wire Retool integrations like this one every week — auth, webhooks, edge cases included. Fixed-price builds from $13K, delivered in 6–10 weeks.

Talk to an integration engineer

We put the rapid in RapidDev

Need a dedicated strategic tech and growth partner? Discover what RapidDev can do for your business! Book a call with our team to schedule a free, no-obligation consultation. We'll discuss your project and provide a custom quote at no cost.