Our existing UNZIP
function has been extended to recognize and decompress 7z archives, including password-protected ones.
UNZIP
function now supports 7z archivesWe're excited to share the ability to log HTTP requests with redacted credentials.
With this feature, you can now see the exact request being made without compromising security by including credentials. Any credentials that are referenced in the request are automatically redacted from the logs, ensuring that sensitive information is not captured.
With this, we released a bonus feature: copy request as cURL command
with redacted credentials. This is useful for debugging and troubleshooting. It allows you to quickly and easily share the request with others without exposing any sensitive information.
ROTATE
functionROTATE
moves the first element in an array to the back of the array. Multiple rotations and reverse rotations can be performed by using the steps argument.
A nice quality of life improvement to creating Tines API keys. When you are setting up a Tines API key, you can choose to save the API key as a credential when you create it. The credential saves to your draft credentials and can be moved to a team at any time.
When you create action groups, you could only pass data that was an object
, plaintext
, or checkbox
. This meant, to pass a formula or number, you needed to take additional steps.
Now, we've expanded this to include formulas
and numbers
to simplify how you work with group actions.
Previously, you could only see when an action finished running by the event indicator on the action card. Now, when an action is running, there is a loading symbol on the action card. This allows you to easily see which actions are currently running.
SET_KEY
functionSET_KEY
adds a new key/value pair in an object or updates the value of an existing key. It can be performed on nested objects by providing a dot-separated path to the key.
NUMBER
function works with negative numbersThe NUMBER
function converts text representing numbers into integers (whole numbers, like 15) and floats (decimal numbers, like 1.5). Before it only took representations of positive numbers, but now it also works with negative numbers.
PUSH
, INSERT
, and DELETE
RANDOM_STRING
functionRANDOM_STRING
returns a string of random characters. The contents of the string are determined by the mode being used. There are 5 modes.
Alphanumeric
mode (default): all uppercase and lowercase letters in the Latin alphabet and all digits are used (a-z, A-Z and 0-9)
Letters
mode: all uppercase and lowercase letters in the Latin alphabet are used (a-z and A-Z)
Numbers
mode: all digits are used (0-9)
Hex
mode: all hexadecimal characters are used (0-9 and a-f)
Custom
mode: a user-provided string is used as the character-set. In addition to letters and digits, this string can include punctuation (!
, &
, -
, etc.), emojis (😊, 👍, 👀, etc.), and characters from non-Latin alphabets (И, 卵, 金, ز, etc.).
FILTER
function fully mirrors REJECT
The FILTER
function now works with objects and arrays.
Objects: it filters based on the values of each key-value pair within the object.
Arrays: it's possible to pass in an array of values to match against instead of a lambda function
This makes FILTER
a perfect mirror of the REJECT
function. FILTER
includes matches while REJECT
excludes matches.
Historically, deduplication functioned with a tolerance of one. This meant the second time a same value event is received, it would be treated as a duplicate.
Now, you can define the tolerance in the build pane using TOLERANCE
. With TOLERANCE,
you can specify how many times an event can run before it is considered a duplicate.
A great use of this is for rate limiting. Combining TOLERANCE
with PERIOD
, you can define when to count an event as duplicate within a set time period. For example, 5 times within 10 seconds.
Now, you can easily configure a story with webhook responses through a dedicated API settings section on the build pane. This removes the need to enable send to story. Simply enable the webhook API responses
switch in the story build pane.
Additionally, we introduced the ability to specify options for multiple API entry hooks.
All of this makes building an API in Tines more intuitive.
Earlier this year we introduced time-to-live (TTL) on HTTP credentials to reduce the number of requests made to a third party service. We introduced TTL with a 2 minute lifespan.
Today, we extended this to store a credential for up to 24 hours. Meaning instead of refreshing a token 720 times per day, you can refresh it once.
This further decreases your account usage with third-party services and improves overall reliability.
no match
branch for trigger actionsWe introduced a secondary path for trigger actions, no match
. This secondary path will trigger when the events do not match the trigger criteria.
This makes managing powerful If/Else
or Match/No match
flows far more intuitive by removing the need to manually create duplicate inverse trigger actions.
Review the docs to learn more.
DIFFERENCE
, INTERSECTION
, and UNION
array functionsThese three new functions compare the content of two arrays.
DIFFERENCE
: Returns an array of items that appear in the first array but not in the second array
INTERSECTION
: Returns an array of items that appear in both arrays
UNION
: Returns an array of items that appear in either array.
The contents of the returned arrays are unique (zero duplicates) and retain their original order, with the first array's content coming first.
APPEND
and CONCAT
functions accept multiple argumentsNow the APPEND
function, which adds strings together, and the CONCAT
function, which adds arrays together, can take more than two arguments.
This means that instead of writing:
APPEND("a", APPEND("b", "c"))
CONCAT([1, 2], CONCAT([3, 4], [5, 6])
You can now write:
APPEND("a", "b", "c")
CONCAT([1, 2], [3, 4], [5, 6])
Read the docs for multiple examples of applying these functions: APPEND
and CONCAT
OBJECTS_TO_CSV
functionThe new OBJECTS_TO_CSV
function converts an array of objects into a CSV-formatted string – the reverse of CSV_PARSE_TO_OBJECTS
.
Tines now supports touch controls platform-wide. This enables you to build, modify, and interact with your workflows on the go from any touchscreen device.
All features work as expected following best practices such as: connect or drag actions with your finger, pinch to zoom, undo with a two-finger tap, redo with a three-finger tap, et cetera.
This makes it easier to manage and share your Tines workflows from anywhere.
Now, you can have your pages automatically submit after a specified duration, or even instantly when they render.
Use this capability for progressive loading experiences, or combine with actions in a loop to poll a remote data resource until it's ready.
A small quality-of-life improvement: now, by holding the shift key when clicking checkboxes, you can select a range of events to re-emit or delete.
We added three new formulas to more easily incorporate asymmetric cryptography into your workflows.
GENERATE_RSA_KEYS
: This formula generates a pair of public and private keys using the RSA encryption algorithm. You can choose a key size of 2048 or 4096, with the default being 2048.
RSA_DECRYPT
: This formula decrypts binary data that has been encrypted with a public key. You simply provide the encrypted data and the public key, and the formula returns the decrypted message.
RSA_ENCRYPT:
This formula encrypts plain message using a private key. You provide the plain message and the private key, and the formula returns the encrypted message. After using our RSA_ENCRYPT
formula to encrypt your data, you will receive a binary output. This output needs to be converted to base64 format before it can be transmitted or stored. Base64 encoding ensures that the data is transmitted or stored in a text format that can be read by a wide range of systems.
We hope you find these helpful, and we welcome any feedback!
For dedicated stack cloud accounts, the ability to setup your own domain for Tines links now also includes webhook URLs.
If you already configured your custom domain for pages and prompts, this will carry over to your webhook URLs.
To configure a custom domain, reach out to our support team or your customer success manager who will walk you through the process.
Request the content type for webhook response data when it's enabled on a story.
Using the HTTP accept
header, you can specify between JSON, CSV, plaintext, and file handling. Find out more in our docs.
Our paragraph page element has been renamed to rich text, and now supports Markdown. Format your text with italics and boldface, add links and lists, and much more.
Now, you can anonymize page submissions. Turning on the switch prevents storing page header data (i.e., email address, IP address, user agent). Anonymizing a page can encourage people to submit information, such as feedback or requests, in situations where it's more comfortable doing so anonymously.
The feature is only available if the header data is not referenced in downstream actions.
Tenant owners with multiple teams can now easily manage story capacity by allocating story limits by team. To do this, navigate to the top menu and choose Team story allocation
.
We've rolled out a new look for groups and templates. Now, you can easily spot group actions or when an action is created from a template.
And, you can customize groups with icons, colors, logos, and images!
You can now tag your Stories, making them easy to search for and find.
Following some feedback, users can now refine their searches within the story or team they're viewing. These filters can be typed or selected from the command bar. We also added shortcut hints to summon the command bar for increased visibility.
For any action on the diagram, you can now rapidly search and filter its recent events – up to 100 – for a fragment of text. We previously only supported searching by event ID, which continues to work also.
PARQUET_PARSE
functionWe’ve added PARQUET_PARSE
, a function for parsing binary data in the Apache Parquet columnar storage format.
Parquet is commonly used to transport data between systems, for example in Amazon Security Lake.
We've added the ability to set a TTL (time-to-live) on HTTP credentials, up to a maximum of 2 minutes. This feature enables actions to store the token that is retrieved, thereby avoiding the need to make multiple requests.
HTTP credential TTL field
HEX_PARSE
and TO_HEX
functionsWe’ve added a pair of functions for working with hexadecimally encoded strings (also known as base16 encoding):
Previously, when an HTTP request failed after exhausting all retry attempts, we logged the action and stopped the story run.
Now, in addition to logging the action, an error will be emitted to enable downstream story actions to handle the error.
YAML_PARSE
, TO_YAML
and TO_XML
functionsWe've added 3 new functions to Tines formula library
YAML_PARSE: Parse YAML text into an object
TO_YAML: Convert an object into YAML text
TO_XML: Convert an object into XML text
For dedicated stack cloud accounts, you now have the ability to set up your own domain for your Tines instance's public links, such as pages and prompts.
This means that you can now use your own domain name to personalize your Tines instance. With this feature, you will be able to create recognizable, trusted pages that showcase your brand more effectively.
To set up a custom domain, please contact our customer support team or your customer success manager who will guide you through the process. Once the domain setup is completed, you will be able to see your domain name in the Manage
dropdown menu.
Previously, all webhook actions would immediately respond to requests, before kicking off downstream actions or producing outcomes.
Now, for Stories enabled with Send to Story, you can optionally wait until the workflow has finished running, before return data from the exit action as a HTTP response. This allows you to leverage and integrate your Tines stories in more places across the web, by exposing responsive HTTP APIs.
To turn on, use the "Return exit action data" checkbox in Send to Story configuration. Read more about configuration and limits in our Send to Story docs.
Now, for quicker access, you can double click any Send to Story action to open the Story it calls in a new tab.
GZIP
and GUNZIP
functionsWe now support compressing (our GZIP
function) and decompressing (GUNZIP
) text using the gzip compression format.
For tenants using SSO, we now support optional just-in-time provisioning of user accounts (as well as team memberships, roles, and tenant owner status). Once enabled, users who are present in specific groups in your remote SAML or OIDC identity provider can sign into your tenant without needing to be invited first. Read more and see setup information in the docs.
The logical operators AND
and OR
have been added to the formulas language. This will allow for writing more readable and expressive formulas:
// old way
IF(AND(foo, bar), "foo and bar were true")
IF(OR(foo, bar), "either foo or bar were true")
// new way
IF(foo AND bar, "foo and bar were true")
IF(foo OR bar, "either foo or bar were true")
The operators may also be written as &&
and ||
for those more used to this style from other languages.
These operators work in a manner similar to python, javascript and ruby so you can use them to quickly provide a fallback in cases where a value may be null:
// old way
DEFAULT(maybe_null_value, "value if null")
// new way
maybe_null_value || "value if null"
We've added the ability to use formulas in keys from within the builder.
We’ve added the ability to add a custom validation with the Regular Expression (ECMA flavour) to our fields on Pages: short text, long text, email, url, date and number.
From now it is possible to customise the field by setting the RegEx, connecting it with the Default Value and if needed the Helper Text.
Possible use cases:
Short text/long text: do not use numbers or any special characters, RegEx example: ^[A-Za-z\\s]*$
Email: accept only company email, RegEx example: (.*)@tines.io$
Url: accept only https urls, RegEx example: ^https(.*)
Date: accept dates only between 1900-2999, RegEx example: ^(?:0[1-9]|[12]\d|3[01])([\/.-])(?:0[1-9]|1[012])\1(?:19|20)\d\d$
Number: accept only numbers from 1 to 5, RegEx example: ^[1-5]+$
You can now use array and object literal syntax in formulas to create objects and array.
// old way
ARRAY(1, 2, 3)
// new way
[1, 2, 3]
// old way
OBJECT("key1", "value1", "key2", "value2")
// new way
{ key1: "value1", key2: "value2" }
You can omit quotes around object keys unless they are needed (e.g. if using a key with a space in it)
Edit, sort, and delete page elements by selecting them directly on the page in the editor. And add new elements by dragging them from the left panel and onto the page.
Tines offers a variety of ways to customise the look of your pages. Now it's easier than ever to share visual preferences between your pages with themes.
Themes store the logo, colour, and width settings for a page so they can be applied to other pages. You can create a new theme by opening an existing page and clicking on the theme dropdown. Then you can apply that theme by navigating to another page and selecting that theme from the same dropdown.
You can also apply themes to multiple pages in the same story through the action bar.
We've tidied up the search experience and gave it a fresh coat of paint. You'll be able to summon the command bar via ⌘K
or Ctrl+K
from anywhere in the tenant and take advantage of the quick actions we've added.
When using Pages in "Move to next page" mode, users can now set the message displayed when navigating to the next page. This message is shown below the loading spinner after the page has been submitted.
We’ve added the ability for you to customise your page even further by introducing a width mode. Toggle between Small and Large to find what works best for you.
You can now configure monitoring for your entire Story and customise individual actions right from the Story panel.
We've added the ability to export a Story as an image. This should make it easier to share screenshots of you Stories with your teams or include them in reports.
INDEX_OF
FunctionWe've added a new function that returns the first index at which a given element or substring can be found in an array or string, respectively. The INDEX_OF
function returns NULL
if the specified element is not present.
For more information, see our documentation.
An action's memory can now be cleared via a Tines API endpoint. More information on how to utilize this endpoint can be found in the Tines API documentation.
You can now expand an entire sub-tree of event data by holding down the Shift ⇧
key when expanding data in the events console. You can also focus by closing all other trees using the Option ⌥
or Alt ⎇
key and you can use both together.
Also, when navigating between actions with similar event structures, the events console will remember what paths have been expanded and carry that over to other actions.
Tines tenant owners can now choose how long Tines should wait before considering a user's session inactive and logging them out.
With this feature now available, we will reduce the default session timeout on newly-created tenants from 1 month to 1 day in the coming days.
For stories that have change control enabled, you can now use the Live events “overlay” that allows you to overlay all the events from a corresponding Live environment on your Test environment.
You can use the Live events in the builder for auto-complete and inspecting the data. You can view Live events in the event console and send the Live events to the corresponding action in your Test environment.
We've introduced a new Editor
team role to Tines. This role gives the user read and write permissions to most objects on the team, allowing them to build and maintain Stories, without full management control of the team.
Specifically, editors:
can create and edit stories, resources, and credentials
cannot perform any destructive actions, manage team members, or push changes to change controlled Stories live
See full information on the team roles we support in our docs.
Events can now be imploded based on time. By adding the seconds option to an implode, you can now specify the amount of time that an implode action should collect events for before emitting an event. You can read more information on time based implode in our docs.
Pressing ⇧ + K in the story builder will now show you the list of available keyboard shortcuts.
You can also opt-in to get helpful reminders about shortcut keys whenever you do something with the mouse that you could possible do with the keyboard.
The keyboard shortcuts directory is also available from the Help and support menu.
Similar to the story descriptions, by adding “descriptions” to actions, we can describe them now!
Back in June we added the audit logs API, offering insights into the changes being made on your tenants. We've now added an (admin-only) UI to make it easier than ever to observe these audit logs. Simply click the link in the main menu to get started.
We first added forms to Tines way back in the summer of 2020. Since then, they've become one of the most popular parts of the product – allowing end-users to kick off an automated workflow with structured input.
More recently, we've been aggressively investing in improving forms, based on your feedback and our own intuition:
Back in September, we made it possible to add multiple forms to a Story, and began visually representing them on the diagram.
Then in October, we began supporting sequences of forms, downstream of actions and other forms, bringing a new level of flexibility.
Finally, just last month, we started allowing parts of forms to output dynamic, upstream information from actions.
Now, we've added the biggest update yet, and the time has finally come to rename these objects to better reflect their roles. So, (re)introducing pages!
With today's release, you can now:
Style and brand pages with your company logo and color scheme
Add new rich page elements like headings, paragraphs, images, and dividers
Use formulas everywhere, whether that's providing a default value to a form input, or powering an image or text in a paragraph.
We’ll be sharing much more soon – including adding plenty of examples of what you can now do with pages to our Story library.
Any existing forms have been automatically converted to pages, without any differences for your end users or breaking changes.
You can also use all of the new features on your existing forms, once you're ready to try them out.
You can read more about pages in our docs.
We can't wait to see what you build!
Tines actions can be scheduled to run periodically, with helpful patterns for cases like "every day at 9am" or "once a week". Now, for situations where you need more precise control over scheduling, our UI now additionally supports using a cron expression.
LEVENSHTEIN_DISTANCE
functionLevenshtein distance is a classic way to compare the similarity of two strings, and it's now available in Tines.
Although this a generally useful utility when working with text, it can be particularly handy in security contexts, for example when correlating similar-but-different strings or IOCs between different contexts.
For more information, see our documentation.
Now, you can explicitly set a time zone when scheduling actions, for complete control.
Additionally, we tell you precisely when the next run will occur, in UTC, for consistency with timestamps throughout the product.
Now, you can easily discover objects that other teams have made available to your team in Tines – resources, credentials, and send-to-stories.
In each case, you’ll find a new “shared with your team” section that lists them all. From there, you can copy a formulas expression to use the object in your stories.
Now, you can invite team members with read-only permissions. This is useful for situations where a colleague or auditor needs oversight or understanding of an automated workflow, without the ability to alter it – or even accidentally break it.
Viewers have read-only access to most objects throughout the team, including Stories, actions, and events, but can't create or edit any objects whatsoever.
We have redesigned the team user management page and moved it into a modal for easy access without having to navigate away from your current page.
To make the change history of your important Stories easier to understand you can now add custom messages when you push changes from your test environment to your live environment.
Now, you can specify default values for your form fields to give your users a starting point. For example, use a default value to provide a template for the type of input you’d like.
Now, you can power the list of options a form presents using formula expressions. This means you can provide a dynamic list of options for your users to choose from whenever required. For example, you could fetch the latest options from an external API, or populate with a list stored in a resource.
All credentials and resources contained within a story's groups are now included in the list of credentials and resources on the story panel.
This will help easily identify missing credentials or resources and simplify their replacement throughout a story.
REJECT
functionWe have added a new function that removes values from a given array or object based on either a provided list of values or LAMBDA
: https://www.tines.com/docs/actions/formulas/functions/reject