October 21, 2019 v2.50.4

  • GraphQL queries now correctly return errors!
  • Download your query results in the Query Playground as CSV or JSON
  • Fixed a bug where MSSQL resources needed SSL to write back
  • Fixed a bug with how Retool processes and returns large Salesforce SOQL queries
  • Made the Query editor more responsive

If your team is trying to build apps around processes that require approval — budget increases, large purchases, or anything that requires approval from another specific user — please reach out to [email protected]! We’re working on making these flows easier to build and have something that might make your life easier.

October 15, 2019 v2.50.3 — Reusable queries!

You can use the same query in multiple apps with Reusable Queries. Often, you want the same functionality across apps, but don’t want to copy paste a query over and over again. Reusable queries help you avoid code duplication, version control queries, and share queries with your team.


  • Add and edit headers in GraphQL queries
  • Pressing ESC correctly deselects your components
  • Performance fixes around the query editor and autocomplete

October 9, 2019 v2.49.0 — Notes, queries, columns, and new resources

Retool managed notes — beta

If you’ve ever thought, “I wish I could just write a quick note about this user, but don’t want to create a table or add a column for it,” you should try the Note component. The component lets you comment on any row your database. For example, you can write a note (e.g. “duplicate user!”), attach it to userid_42, and retrieve it later. This is still in beta, so we’d love your feedback!

Playground updates: shared queries and variables

You can now share your Playground queries with the rest of the team! Once a query has been shared, all the editors in your team will be able to see, run, and edit the query.

Also new: variables in queries. Use double curly braces {{ }} in your playground queries to define parameters to your queries. To run parameterized queries in the playground, pass in values to variables on the right hand side.

Coming soon — import queries from the playground into your apps, so you can stay DRY and avoid copy/pasting queries 🙂

Calculated table columns

Ever wished you had Javascript in Excel? Now you have Retool! The Table component now lets you add columns populated by calculations (such as ones that reference other values in the table). And, of course, you get the power of JS with the {{ }}.

New resources: OpenAPI + CosmosDB + S3-compatible storage providers

We’ve added three new resources:

  1. API that has an OpenAPI specification (e.g. certain Google Cloud Endpoints)
  2. Azure CosmosDB
  3. You can now pass in a different base URL to the S3 resource to connect to any S3 compatible storage provider (ex: DigitalOcean Spaces or Wasabi)

Revert to an older release

You can now directly revert to an older release in the app editor, without searching through your entire history. (If your end users are not on the latest release, reverting to an older version will not revert their published version.)

Other improvements

  • SAML JIT user provisioning for Okta (if you know, you know)
  • You can now pass in SSL certificates to connect to RethinkDB
  • We added utils.copyToClipboard to let you copy text in Javascript queries
  • We now support various eastern european characters in our font, such as ľščťžřňěůôä for our Czech friends
  • Our MySQL and Postgres resources now accept self signed certificates — this is useful if you’re on GCP
  • Small fixes for containers in mobile mode, the DateTimePicker, and authentication for REST Queries
  • Various performance fixes

August 25, 2019 – v2.43.0

Improved backend logging

For on-prem customers, we’ve improved backend logging by emitting logs as a JSON object. We include all details (e.g. query response times, whether it succeeded or failed, etc) so you can track what happened across an entire request.

This logging improvement enables you to connect a monitoring service (i.e. Datadog) to read the logs and build reports and alerts around them.

Here’s an example of logs for a successful and unsuccessful query:


{"requestId":"8aa9df50-78bc-4f95-b1f5-eb798c57888b","email":"[email protected]","organizationId":1,"organizationName":"[email protected]","message":{"type":"REQUEST","method":"POST","url":"/api/pages/uuids/3e9e40fa-ad86-11e9-a2e7-bf5202eb3fb8/query?queryName=query2","hostname":"http://localhost:3000"},"level":"info","timestamp":"2019-07-29T17:47:41.646Z"}
{"requestId":"8aa9df50-78bc-4f95-b1f5-eb798c57888b","email":"[email protected]","organizationId":1,"organizationName":"[email protected]","message":{"type":"QUERY_RESULT","success":true,"isPreview":false,"pageUuid":"3e9e40fa-ad86-11e9-a2e7-bf5202eb3fb8","queryName":"query2","resourceName":"hammerhead_production","resourceType":"postgresql","environment":"production","queryResponseTimeMs":"27.0771"},"level":"info","timestamp":"2019-07-29T17:47:41.771Z"}


{"requestId":"91497c47-22d2-4417-8b8b-ad5bc2054231","email":"[email protected]","organizationId":1,"organizationName":"[email protected]","message":{"type":"REQUEST","method":"POST","url":"/api/pages/uuids/3e9e40fa-ad86-11e9-a2e7-bf5202eb3fb8/query?queryName=query1","hostname":"http://localhost:3000"},"level":"info","timestamp":"2019-07-29T17:47:49.426Z"}
error: duplicate key value violates unique constraint "blocks_name_organizationId_key"
    at Connection.parseE (/retool_backend/node_modules/pg/lib/connection.js:601:11)
    at Connection.parseMessage (/retool_backend/node_modules/pg/lib/connection.js:398:19)
    at Socket.<anonymous> (/retool_backend/node_modules/pg/lib/connection.js:120:22)
    at Socket.emit (events.js:189:13)
    at Socket.EventEmitter.emit (domain.js:441:20)
    at addChunk (_stream_readable.js:284:12)
    at readableAddChunk (_stream_readable.js:265:11)
    at Socket.Readable.push (_stream_readable.js:220:10)
    at TCP.onStreamRead [as onread] (internal/stream_base_commons.js:94:17)
{"requestId":"91497c47-22d2-4417-8b8b-ad5bc2054231","email":"[email protected]","organizationId":1,"organizationName":"[email protected]","message":{"type":"QUERY_RESULT","success":false,"isPreview":false,"pageUuid":"3e9e40fa-ad86-11e9-a2e7-bf5202eb3fb8","queryName":"query1","resourceName":"hammerhead_production","resourceType":"postgresql","environment":"production","queryResponseTimeMs":null,"errorMessage":"duplicate key value violates unique constraint \"blocks_name_organizationId_key\""},"level":"info","timestamp":"2019-07-29T17:47:49.491Z"}
Error in a microservice { error: true,
   'duplicate key value violates unique constraint "blocks_name_organizationId_key"' }

Push groups from Okta*, Ping Identity, OneLogin, etc

You can now manage groups in your SSO provider and sync changes to Retool.

  • Assign new users to groups in Retool when you provision their accounts in your SSO provider.
  • Remove users from groups in Retool when you do so in you SSO provider.
  • Create & destroy new groups in Retool when you do so in you SSO provider.

*Okta coming soon! Check our next release notes for an update.

Improved navigation between different elements in Edit Mode

  • Retool now highlights the selected element (e.g., query, component, temporary state, or transformer) in the left-hand panel model browser.
  • Also, each element referenced in a query or text input is hyperlinked to its detail view. For example, if you reference query2.data.name in a transformer, you can click on query2 to navigate to it.

Expose column indexes for faster querying

We now show a ⚡ icon next to column names in the query panel database schema when that column has an index. Queries that use indexed columns often run faster than they otherwise would.

Descriptions for releases

Now you can add a description when creating a new release (aka version) of an app. That way if you have to roll back to an old version, you’ll know which version to pick.

Improved SQL autocomplete

The query editor autocomplete now handles handles camelcase, non-lowercase letters, numbers, and underscores in table names.

New & Improved

  • Added an optional MaxKeys parameter to AWS S3 queries to limit the number of objects returned.
  • Updated Google Sheets integration to read, append, and update beyond 26 columns.
  • Updated Datetime Picker to re-trigger queries after selecting a new date or time.
  • Updated sign in button to read “Sign In” for customers with SSO enabled.
  • Added resource icons to query tabs.
  • Fixed the Bounding Box component to calculate the correct (x,y) coordinates for landmarks.
  • Fixed JSON Schema Forms to respect when form elements have a required flag
  • Form submit buttons now prevent accidental multiple submissions.
  • Improved performance of Javascript queries.

2.42.3 — Transformers for query data, improvements to copy and paste, performance enhancements for queries, and more

Transformers for query data

Queries now have built-in transformers, which let you write JS to “transform” the result of any query. For example, if your API returns data in a column-based format, but you want to “transform” the data into an array of objects, you can write a transformer directly in the query. Then, when you use {{ query1.data }} elsewhere, it’ll be transformed, so you won’t have to write the same JS in multiple places.

  • Click “enable” next to the “Transformer” section below your query.
  • Use data in the Query Transformer to access the query results.
  • In the rest of the app, access the transformed results with the data property inside {{ }}, for example with {{ query1.data }}.
  • If you need to, you can still access the original response of the query with {{ queryName.rawData }}.

Note: you can disable the query transformer by clicking the “disable” button.

Example of using the Transformer to filter User IDs with a dynamic slider. Example of using the Transformer to filter User IDs with a dynamic slider.

Click to copy the green “evaluation preview”

Retool now supports copying the content from an “evaluation preview” textbox. ​​

​​For example, in the GIF below, we’re copying the actual live results of a query into a JSON Explorer, so we can inspect it.

Copying the green “evaluation preview” text to inspect the data in a JSON explorer component.

Copying the green “evaluation preview” text to inspect the data in a JSON explorer component.

Copy & paste containers with their children

You can now copy and paste Containers with of their children.

  • Select the parent Container (or Tabbed Container) component.
  • Copy with ⌘ + C on Mac (or CTRL + C on Windows / Linux).
  • Click on the canvas to deselect the Container.
  • Paste with ⌘ + V on Mac (or CTRL + V on Windows / Linux).

Copy and paste containers with their children!

Copy and paste containers with their children!

Paste components inside existing containers

Also, you can also now paste components directly into Container or Tabbed Container components.

  • Click the component and copy it with ⌘ + C on Mac (or CTRL + C on Windows / Linux).
  • Select the Container or individual tab of a Tabbed Container where you want the copy to go.
  • Paste the component with ⌘ + V on Mac (or CTRL + V on Windows / Linux).

Copy and pasting a button from one container to another. Copy and pasting a button from one container to another.

New & improved

Performance enhancements

Last week, we spent a lot of time working on making Retool faster; now some of that work has been released. Edit mode and Presentation mode are faster, more complex apps should feel snappier, and even tables with custom cell colors & mapped values will load quicker too!

New minor features

  • Added ability to control staging vs. production environment with a URL parameter.
  • Added an onboarding checklist for new users! (If you complete it, we’ll mail you a Retool T-shirt 👕).
  • Updated visual cue to make it more obvious when components reference unsaved queries.
  • Added sms:// and facetime:// to our list of allowed protocols in HTML links.
  • Added option to disable introspection for GraphQL resources.
  • Added ability to specify an audience parameter in OAuth 2.0 authentication for HTTP and GraphQL APIs.
  • Added ability to clear the PDF Viewer component programmatically with .clear().
  • Added better support for newlines when copying text and components to the clipboard.
  • Added option to hide the clear button in Select components (aka Dropdown components).
  • Added option for scroll on the Modal component.

Small fixes

  • Fixed the the display for the “Always show download button” option on Table components.
  • Fixed upsert action for querying Snowflake databases.

2.41.20 Copy & paste components, staging environment visual cue, timer component, and more

Copy and paste components between apps

  • Copy & paste entire components from one app to another!

Visual cue for staging environment

  • Added a yellow banner for both Editor and Presentation modes when staging mode is selected
  • Only available for apps that have a staging environment configured

Visual cue for staging environment


  • Start, stop, resume, and reset a stopwatch-style timer timer component

New & Improved

  • Added triggeredby``Id attribute to manually-triggered queries so you know what triggered it
  • Added button to Settings > Advanced page to download Retool’s public key for git syncing
  • Added support for auto-pagination for DynamoDB resources
  • Added ability to specify GCS bucket in resource editor
  • Added ability to specify more than 1 permitted file type for S3 Uploader components
  • Added onchange query trigger for Radio Group components
  • Added write-back capability for BiqQuery resources
  • Added setValue function to Editable Text component
  • Added autocomplete for JS query utility libraries
  • Now displaying hints for common SQL query gotchas in query editor
  • Various performance improvements for big Retool apps
  • Better UX in Query Playground for long queries

2.41.3 View concurrent users, delete apps, and more

Concurrent developer warnings

  • Added a notification to the header that shows who else is modifying the same Retool app.
  • You can use this to avoid overwriting changes that your team mates are making to the Retool app.

Screen Shot 2019-06-03 at 2.19.47 PM.png

Deleting apps

  • Added ability for admins to permanently delete apps that are in the archive folder.

Screen Shot 2019-06-03 at 2.21.58 PM.png


  • Added the option to specify the ACL for files uploaded to Google Cloud Storage
  • Added option to allow users to define custom values in Multiselects. Enable this by using the "Allow user defined values" option in Multiselects.

Screen Recording 2019-06-03 at 02.25 PM.gif

2.40.4 Control resource access levels, and more

Resource access levels

  • Extended the access control levels in Retool to allow admins to restrict access to Resources connected in Retool.
  • You can use this feature to do things like:
    • Only allow analysts to use readonly database connections.
    • Only allow developers to use apis / databases that they manage.

Screen Shot 2019-06-03 at 1.54.16 PM.png

Here, the group lets the "Awesome Intern" use the onboarding_db (readonly) and onboarding_api resources to create / modify apps

Query playground

  • Added the Query Playground which lets developers write queries quickly without having to create an app. Screen Shot 2019-06-03 at 2.02.33 PM.png

  • Coming soon: reusing queries you write in the playground within your Retool apps.

Tile homepage view

  • Added a new tile-based home screen for Retool apps
  • You can customize the image you use for each tile.
  • You can also "favorite" your most frequently used apps so that always appear at the top of the page.

Screen Shot 2019-06-03 at 2.08.00 PM.png


  • Added support for deleting S3 files.
  • Added support for S3 bucket URLs in APIs that use the AWSv4 authentication method.
  • Increased maximum timeout for queries to 10 minutes.


  • Fixed how custom redirect flows in "Custom Auth" APIs work in "staging" environments.
  • Fixed POST/PUT/DELETE requests in the Stripe integration that have an empty body.

2.39.7 Query caching and more

Query Caching

  • Added query caching as a way to optimize the performance of Retool apps.
  • Queries can have its results cached for up to one day (the cache TTL)
    • The first time you run a cacheable query, it will run the query normally and then remember the query result.
    • Anytime anybody runs the query again the remembered result gets returned instantly.
    • The remembered result is deleted after the cache TTL expires.
  • You can configure this option in the "Advanced options" section of the query editor.

Screen Shot 2019-05-20 at 7.36.17 AM.png

Retool community!

New and Improved

  • Added lastUploadedFileName to the S3 Uploader component. Works similarly to the lastUploadedFileUrl.
  • Added live warnings to make it easier to write Javascript scripts.
  • Added a utils.downloadFile function to Javascript scripts. Use this to with API queries that return pdfs / docx / xlsx / etc. to download the files returned. Docs here.


  • Changed the MongoDB insertOne queries to also return the created object, including the MongoDB _id.
  • Fixed deadlink on the Permissions dashboard.

2.39.2 RethinkDB, Lambda Integrations, and more

RethinkDB Integration

  • Added RethinkDB as a Retool integration.
  • Run get, insert, update, delete, and find queries on your database.
  • Let us know what else we can add.

Lambda Integration

  • Added AWS Lambda as a Retool integration.
  • Invoke lambda functions with whatever payload you need.
  • See more info in our docs here.


  • Added support for sharded Microsoft SQL Server databases.
  • Improved the user management screen in Retool. Disabled users are greyed out, and we show accurate last active dates for each user.


  • Fixed how Custom Auth API integrations work in staging environments
  • Fixed how non-string values are passed in FormData API requests.
  • Fixed error that Slack webhooks would return in on premise Retool.
  • Disabled overly aggressive cache headers in on premise Retool.
  • Fixed editing JSON columns in editable tables.