Only this pageAll pages
Powered by GitBook
Couldn't generate the PDF for 1027 pages, generation stopped at 100.
Extend with 50 more pages.
1 of 100

rewst.help

Loading...

Documentation

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Rewst Dashboard

The Rewst Dashboard is the home screen you'll see when you first log into the platform. Click the drop-down organization selector in the top right to choose which org's information will be displayed in the dashboard at any given time.

Use the dashboard to easily digest key metrics for every workflow executed within a selected timeframe and better understand how Rewst is bringing you value. Identify usage patterns, success rates, and estimated time savings.

The top of the Rewst Dashboard screen

Choose to view the data in your desired timespan by clicking the relevant button at the top right of the dashboard for either Weekly or Monthly views. Note that the default for the dashboard timeline is monthly. Click < or > next to the indicated date to skip between date ranges. Click Download CSV to export the report to a file.

Additional options to view metrics on a daily basis are coming soon!

The Tasks Performed chart shows all tasks performed in the prior month or week for your selected organization.

The Time Saved chart shows the total time saved by using your Rewst automations in the prior month or week for your selected organization.

This estimate is generated from the time saved number entered in your workflow's settings, as well as Rewst's baseline assumption of the manual effort required without automation for prebuilt automations like Crates. An estimate of zero means your estimate was never filled out. To resolve a zero estimate, navigate to the workflow and enter the time saved estimate there.

The Workflows menu shows stats for how many workflows in your selected time period were running, as well as how many executions were successful and how many errors were given. The time period selected at the top of your dashboard will determine the time period displayed in the widget.

Scroll further down the Rewst Dashboard page to see the Workflows widget. The data in this section updates daily.

This section of the dashboard provides a centralized view of individual workflow usage metrics in separate columns: Success Rate, Total Executions, Total Tasks, and Time Saved. Click on any individual workflow in the widget's workflow list to open that workflow in the workflow builder canvas. Use the fields at the top of each column to enter search and filtering parameters to find your desired workflows. Click Download CSV to export the workflow data to a file.

A user interface displaying a table of word counts with columns for total words, word generations, and other related metrics. The table has a dark background with light text, showcasing various entries and pagination controls at the bottom.
The lower workflow widget, viewable at the bottom of the Rewst Dashboard page
A data dashboard displaying two bar graphs. The top graph represents performance metrics with light blue bars, while the bottom graph shows time spent with purple bars. Both graphs have numeric values and axes, indicating various data points.

Welcome to Rewst documentation

Explore our guides and recordings to start automating in Rewst today. Click through our recommended shortcuts below, or use the nav menu to the left, organized to match the left side menu in Rewst.

Get started with Rewst

Not sure where to begin? We recommend these resources. Click on Cluck University links to launch that course in a new tab. Click on documentation links to take you directly to that page in this documentation site.

Cluck University intro courses

Documentation on Rewst platform basics

Rewst Support

Contact and customer resources for help with using Rewst

Rewst Open Mic

Recordings and invites to our recurring live community hangouts

Cluck University

Sign up for training in Cluck University to learn how to use Rewst

Integrations

Setup and user instructions to integrate all your favorite tools with Rewst

Crates

Browse available Crates in our collection of unpacking and user guides

Agent Smith

Our open-source command executor that fits into your Rewst workflows

An image of the Rewst Onboarding course title slide: There is a cartoon image of a blue sky and darker blue rolling hills. Over this are various colorful brand logo icons for all the tools that interact with Rewst,  in addition to a turquoise and orange cartoon Rooster head for Stewart, Rewst's mascot.

Rewst onboarding

Learn how to set up your Rewst environment and integrate your tech stack

An image of the title of the course, Process Engineering, over a cartoon image of a blue sky with green grassy field. To the right is an image of the instructor Lauren Campbell, a woman with brown curly hair posing over a dark grey photo background.

Process engineering

Learn to recognize automation opportunities, and map out processes with clarity

An image for the Automation Basics course, containing the title over a cartoon image of a blue sky and green grassy field. To the right is a headshot of the instructor Eddie Chow, a man with glasses and a beard.

Automation basics

Learn key concepts for building smarter, more efficient workflows in Rewst

🤝 What is an integration?

🔀 What is a workflow?

✅ What is an action?

📁 What is an organization?

📦 What is a Crate?

📝 What is a form?

📄 What is a template?

⌨️ What is Jinja?

🧑‍🤝‍🧑 What are users in Rewst?

Cover
Cover
Cover
Cover
Cover
Cover

Automations

Subworkflows

A subworkflow is a workflow that is also a part of another workflow. This collection of subworkflows has been pre-built by the Rewst team for your use. For more on subworkflows, see our workflow docs.

Average transform action

Use case

You received a list of users from an API that contains the user's ages.

You have mapped to the age attribute of the user dictionaries and would like to calculate the average of the new list of integers to get the average age of the users.

Overview

Returns the average, or arithmetic mean, of a list of numbers.

Parameters

Parameter
Description
Required

Usage

Example: Calculate the average of a list

Inputs: List: [2,3,3,5,7,10]

Results output

Result of example:

Generate friendly password transform action

Use case

You are resetting a user's password and would like to generate a friendly password.

Overview

This action generates an easy password with adjective, name, number, symbol and random caps.

Parameters

There are no parameters for this transform.

Usage

This transform has no parameters, so no usage examples can be given.

Results output

Example 1:

Example 2:

Example 3:

Add or subtract from DateTime transform action

Use case

You would like to programmatically determine what the date was thirty days ago.

Overview

Forms

What is a form?

In Rewst, every automation starts with a single click. Forms are powerful tools used to collect the information your workflows need to start. They streamline the data collection process by gathering key details from users such as names, dates, or options. Forms can be manually created, or added as part of .

Rewst's form functionality is designed to empower users with the tools to build interactive, responsive, and customizable forms.

Get list length transform action

Use case

You have a list of user's that has been returned from an API, you would like to determine the count of user's in the list.

Overview

Any transform action

Use case

You are reviewing a list of users and you need to determine if any of the users are enabled. The previous list has been mapped using the map transform action to the attribute enabled , providing a list of boolean True/False values to check against.

Embed a form into an iFrame

Embed forms

There is often a need to embed a form in an iframe to give users the ability to complete a form and trigger automation. The form can be embedded into other web pages that use iFrame links.

To get the dynamic form URL, make sure your form is already set up as a trigger for a workflow.

Extract part of a date transform action

Use Case

You have received a date in a response from an API, you are going to use this to dynamically specify the year in another request based on what was received in the response.

Overview

Set variable transform action

Use case

You would like to set a variable for use later in the workflow

Overview

Trigger use cases and examples

Customize PSA ticket triggers
Use webhook triggers

List

List to average

A photo of the text header in the transform menu of the workflow builder for generate friendly password
Measures the length of a List. It will return the number of elements of that list.

Parameters

Parameter
Description
Required

List to Measure

The array/list to get the length of.

Usage

Example: Getting the count of numbers in a list

Inputs:

List to Measure: [1,2,3,4,5]

Results output

Result of Example:

A screenshot of the get list length transform action, seen in the actions list menu of the workflow builder canvas.
Set a variable as an action.

This transform will allow you to set a variable using an action vs. setting a data alias in a transition.

The name of the variable will be set via the Publish Result As field.

Parameters

Parameter
Description
Required

Variable Contents

The value of the variable you are setting.

Usage

Example 1: Set a Variable

Inputs:

Variable Contents: I am a test!

Results output

Result from Example:

A screenshot of the set variable transform action, seen in the actions list menu of the workflow builder canvas.
5
FAirBAnDIcooT39!
GREENBoNoBo73=
KINDSNakE41$
5
I am a test!

Add or Subtract from a DateTime


Parameters

Parameter
Description
Required

DateTime to add or subtract from

Use https://strftime.org/ for various options

Days to add or subtract

Integer value for how many days to add or subtract.

Hours to add or subtract

Integer value for how many hours to add or subtract.

Microseconds to add or subtract

Integer value for how many microseconds to add or subtract.

Usage

Example: Get 30 days from today's date

Inputs:

DateTime to add or subtract from: {{ now("UTC","%m-%d-%Y") }}Days to add or subtract: 30

The rest of the inputs in this example are blank.

Results output

Result from Example 1 (if run on 04/16/2025):

Why use forms?

Forms collect data in one simple step, reducing manual data entry and saving you time. They can also function as triggers in Rewst when building workflows, allowing for seamless transitions and increased efficiency.

Expand the reach of your forms by embedding them into various web pages, providing increased accessibility to users. Tailor forms to specific scenarios through cloning and modification, ensuring the right fit for every situation.

View forms in Rewst

Access all forms, be they manually created by you or obtained as part of unpacking Crates, by navigating to Automations > Forms in the left side menu.

An example of what your forms page might look like

Export and import forms

You can export a form to share with other Rewst customers, or create your own hard copies of form backups. To export a form as a JSON bundle, click ⋮ > Export next to your relevant form in the total form list.

To import a form bundled as a JSON file, click in the top right navigation bar of the forms page. Then, drag and drop your file into the upload dialog that appears.

Request a forms feature update

We’re constantly adding new features to Rewst. If you have a suggestion for what we could add to our forms functionality, add a request or upvote other existing suggestion posts in our Canny.

Want to learn more? Search for the How to build forms course in Cluck University.

Crate unpacking
Overview

This transform action will look at a list of boolean values and return true if any of the elements are true.


Parameters

Parameter
Description
Required

List

List of boolean values to check against.

Usage

Example 1: Confirm Any Items In List Are True

List to Check (input):

Results output

This transform will output a boolean value.

Example output from Example 1:

Get an embeddable link

Follow these steps to get the embeddable link:

  1. Navigate to Automations > Workflows.

  2. Click on the Workflow that includes the form trigger.

  3. Click Edit Trigger in the top menu.

  4. Click on Copy Embeddable iFrame code.

This copies the embeddable Iframe code. Paste the code into your compatible webpage editor.

Given a date or date time string, extract a part of the date.

Parameters

Parameter
Description
Required

Date Time String

The original date time string to extract a part from.

Part to Extract

The part of the date to extract. Defaults to year.

Usage

Example 1: Extract the year from a date

Inputs: Date Time String: 2025-06-27T00:05:24.000 Part: Year (4 digits)

Example 2: Extract the day from a date

Inputs: Date Time String: 2025-06-27T00:05:24.000 Part: Day

Results output

Result from Example 1:

Result from Example 2:

Troubleshoot unpacked Crate forms

For more information on unpacking Crates, see our Crate documentation here.

If a form field of a form unpacked from a Crate isn't populating with information, you have two options.

  1. Identify the issue by digging into the form.

  2. Open a support ticket with Rewst's support team and have them troubleshoot the issue for you.

Either option will require you to collect information from the form by completing the following steps. As an example, we're using the [Rewst Master v3] User Onboarding Minimalistic form.

  1. Navigate to Automations > Forms.

  2. Open the form in question.

  3. Scroll down in the right side menu. Click on any field that's further down in the field list.

  4. Click on the field. This will open its information in the right side menu.

  1. Scroll down to see if the field is a dynamic field. If it is, Dynamic Options will be toggled on.

  2. Confirm if the field has Workflow Generated toggled on. If so, look at the options generator in the Workflow field beneath it.

  3. Open the options generator by clicking .

Document with RoboRewsty

Effortlessly create high-quality documentation for your workflow actions without getting caught up in details.

RoboRewsty has expanded! As of October 2025, our RoboRewsty capabilities now help you with knowledge search and product education. See our general page on RoboRewsty here to learn more.

RoboRewsty is your go-to tool for simplifying the creation of comprehensive documentation for your workflow tasks. It takes care of the process behind the scenes, freeing you to focus on building your workflow while ensuring that the documentation is handled seamlessly.

How does RoboRewsty work?

RoboRewsty integrates with the workflow builder canvas. It takes your workflows' JSON objects, and sends them to a private OpenAI Azure instance. The result is a quickly presented, well structured documentation breakdown of all selected tasks in your workflow.

RoboRewsty does not replace the existing note feature in the workflow builder. You can either add notes manually, or use RoboRewsty to help you do some of the heavy lifting.

Use RoboRewsty

Via workflow builder

  1. Click in the top toolbar of the workflow builder to start a note for the entire workflow. To add notes on specific elements, drag around an area on the canvas while holding down ctrl + left click , or right click and select Add Note within the workflow builder.

  2. Click Generate Auto-Documentation to generate documentation for the entire workflow.

  3. A waiting message will display while it runs on your workflow. This may take a moment, if your request holds a large number of tasks.

Via publish workflow

RoboRewsty is also available to help when you publish a workflow. Click on the RoboRewst icon to generate a detailed change log, then Submit.

Convert from epoch transform action

Use case

You have received a time value in epoch time from an API and would like to convert it to a date time string representation.

Overview

Given an integer for epoch time, convert it to a date time string.

Parameters

Parameter
Description
Required

Usage

Example: Convert epoch time value

Input: Epoch Time Value: {{ now() }}

Results output

For this example the now( ) method is feeding in a value of 1747395397.

Get days between dates transform action

Use case

You would like to get the count of days between dates.

Overview

Get the number of days between two dates.

Parameters

Parameter
Description
Required

It is important to note that the end date is exclusive in the returned count. Only start date is inclusive in the count.

Usage

Example: 07/01/2025 through 07/07/2025

Inputs:

Start Date: 07/01/2025

End Date: 07/07/2025

Holidays:

Country: United States of America

Results output

Result of Example:

Compare dates transform action

Use case

You are building a workflow that checks if the tickets closed date is greater than the expected close date and would like to know if action is needed based on a true/false value.

Overview

This transform will take two dates and an operator, it will then perform a comparison based on the operator and return a boolean value.


Parameters

Parameter
Description
Required

Usage

Example 1: Greater Than

Inputs:First Date: 2025-03-13T04:00:00.000ZSecond Date: 2025-03-14T04:00:00.000ZComparison Operator: >Day First: NoneFuzzy Parsing: TrueIgnore Timezone: FalseYear First: None

Results output

The expected output for this transform is a boolean value based on the comparison of the two dates.

Result Output for Example 1:

Convert DateTime to timezone transform action

Use case

You are working with an API that returns a time in UTC, you would like to localize this value to your timezone or a specific timezone.

Overview

Convert a DateTime to a different timezone.

Parameters

Parameter
Description
Required

Some timezone values are timezone naive, such as EST. If you would like to use a timezone aware value then, as an example, you should use America/New_York or US/Eastern.

Usage

Example: Convert a UTC timestamp to EST/EDT

Inputs:

DateTime to convert: 2025-04-16T09:00:30.000Z

Timezone to return: US/Eastern

Results output

Result of Example:

Conditional fields

You'll often have forms that you want to use across a multitude of clients, but sometimes fields may not be relevant to them all. Rewst has conditional fields that can be used to determine whether you show another field.

Conditional field example

In our example, we will look at the Supervisor field when creating a new user. In the image below, no Supervisor is set, and therefore the following field is another drop-down for further information.

You can then see that if we add content to that supervisor drop-down, which is a list of users pulled dynamically from Microsoft365, a new field appears.

This boolean field is then checked on, which gives access to another relevant field.

Rather than giving fields to a user that bear no relevance, you only give them fields they must fill in.

These conditional fields are set by clicking the field on the form and clicking Set Conditional Field, which presents you with the below.

Jinja for field conditions in forms

There are times where you may need to use criteria for a form condition that is not accounted for by the available drop-down selections, such as when organization information or organization variables are part of the criteria. At these times, you might instead opt to use a Jinja condition, such as {{ ORG.VARIABLES.variable_name == "value" }}.

Another case where the use of Jinja may be required is when multiple conditions need to be met, even if those conditions are normally available in the drop-down selections. An example of this would be {{ (CTX.field_name_1 == "value_1") and (CTX.last_name != "value_2") }} .

Get DateTime transform action

Use case

You would like to get the current date/datetime.

Overview

Returns the current date/time in the requested timezone.

Parameters

Parameter
Description
Required

Some timezone values are timezone naive, such as EST. Say you would like to use a timezone aware value. Following that example, you should use America/New_York or US/Eastern.

A good point of reference is: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

Usage

Example: Get Current DateTime for US Eastern

Inputs:

DateTime format to return: %Y-%m-%dT%H:%M:%SZ

Timezone to return: US/Eastern

Results output

Results of Example:

Get string length transform action

Use case

There is a character limit on a field in an upcoming API call, you would like to check the length of the input prior to making the call.

Overview

Measures the length of a String. It will return the number of characters in that string.

Parameters

Parameter
Description
Required

Usage

Example: Getting the count of numbers in a string

Inputs:

String to Measure: The quick brown fox jumps over the lazy dog

Results output

Result of Example:

Workflows actions

Available workflows actions

The Workflows actions accordion menu contains any existing workflows in the workflow list for the related child organization. This actions menu is what powers Rewst's subworkflow functionality, by letting you reuse existing workflows as individual tasks in a more broadly scoped integration.

The available actions in this submenu will be different for each of your child organizations. Each time you create a new workflow, the list will grow.

An example of an org's Workflows action accordion menu

Unpacking a Crate will also add the workflows in that Crate to the Workflows actions accordion menu. You'll gain many of the common automations our team has pre-built workflows for, and can use them to build your own custom workflows.

Note that most workflows actions will use . If present, these will appear in the Parameters tab of the task.

[PROD - TASK] Duo: Get User Counts

This workflow queries Duo Security to retrieve a comprehensive count of users across all client accounts, serving as a critical building block for MSPs to automate billing, license management, and security compliance reporting. It's particularly valuable for MSPs who bill per user, need to verify MFA deployment completeness, or must generate regular security compliance documentation for clients requiring multi-factor authentication. Technically, the workflow functions by first listing all Duo accounts, then retrieving all users from the Duo platform, and finally merging this data to generate accurate user counts that can feed into reporting systems, PSA tools, or client-facing dashboards.

This workflow contains 7 tasks.

Inputs

This sub workflow has no inputs.

Outputs

  • automation_log: Standardized Rewst automation log

  • duo_user_count: List of DUO companies and their counts.

Key tasks

  • build automation log: Logging

  • get_user_count: Data retrieval

  • duo_list_accounts: Duo integration: List Accounts

  • duo_list_users: Duo integration: List Users

Jinja examples

Example 1

Used in setting the duo_accounts alias.

Split text transform action

Use case

You have a string that you would like to split each word/character by a delimiter to create a list.

Overview

Splits text on a delimiter into a list of strings.

Parameters

Parameter
Description
Required

Usage

Example: Splitting a string to get each word in a sentence or phrase

Inputs:

Max Splits: -1

Seperator: (no value was provided so default of space will be used)

Text to split: The quick brown fox jumps over the lazy dog

Results output

Result of Example:

Base64 Decode transform action

Use case

An API has returned a value that is base64 encoded and you would like to decode it.

Overview

Decode a base64 encoded string.

Parameters

Parameter
Description
Required

Usage

Example 1: Decoding a String

Inputs: **String**: VGhpcyBAaXMgbXkgdGVzdCBzdHJpbmcteWVlZWVoYXc= **URL Safe**: false **As Bytes**: false

Results output

Result of Example 1:

[PROD - PROCESS] M365: M365 User License Launcher

This workflow serves as a foundational building block that retrieves Microsoft 365 user license information and makes it available for consumption by larger automation processes, functioning as a standardized entry point to license data. MSPs can leverage this component for critical scenarios including license auditing, user onboarding/offboarding processes, license optimization to prevent over-provisioning, and generating automated client billing reports. Technically, the workflow executes by calling the "[PROD TASK] M365: Get User Licenses" task to fetch license data from Microsoft 365 tenants, presenting structured license information that other workflows can consume for decision-making and automation tasks.

This workflow contains 4 tasks.

Inputs

  • company_id - string; This would be a Microsoft Entra tenant ID.

Outputs

  • automation_log: Standardized Rewst automation log

  • license_counts: List of Rewst orgs and their license counts in Office 365.

Key tasks

  • BEGIN: Core integration: noop

  • workflows_365_get_users: Data retrieval

  • Create Automation Log: Creation/initialisation

Jinja examples

Example 1

Example for input parameter 'company_id'

Example 2

Used in publishing 'license_counts'

All transform action

Use case

You are reviewing a list of users, and want to determine if all of the users are enabled. The previous list has been mapped using the map transform action to the attribute enabled , providing a list of boolean True/False values to check against.

Overview

This transform action will look at a list of boolean values and return true if all of the elements in the list are true.


Parameters

Parameter
Description
Required

Usage

Example 1: Confirm All Items In List Are True

List to Check (input):

Results output

This transform will output a boolean value.

Example output from Example 1:

URL decode transform action

Use case

You have a string that is URL encoded and you would like to get the original decoded value.

Overview

When given a URL encoded string, this will decode it.

Parameters

Parameter
Description
Required

Usage

Example: Decode a string

Inputs: String: This-is-%40-test%21

Results output

Results of Example 1:

[PROD - TASK] Auvik: Get Counts

This workflow serves as a foundational building block that retrieves and quantifies all network devices tracked in Auvik across your client base, providing essential inventory metrics that can be leveraged in reporting, billing automation, or compliance verification processes. For MSPs, this function delivers critical visibility when performing quarterly business reviews, validating managed device counts against service agreements, or identifying growth opportunities within existing clients' networks. Technically, the workflow first retrieves all tenant details from Auvik, then calls a device listing task for each tenant, and finally merges these device counts with company information to produce comprehensive device statistics by client - all accessible via API for integration with your PSA, documentation system, or custom reporting tools.

This workflow contains 7 tasks.

Inputs

This sub workflow has no inputs.

Outputs

  • automation_log: Standardized Rewst automation log

  • auvik_user_count: List of auvik companies and their counts.

Key tasks

  • workflows_dev_task_auvik_list_devices: Workflows integration: [DEV TASK] Auvik: List Devices

  • BEGIN: Core integration: noop

  • build automation log: Logging

  • merge_counts_with_company: Core integration: noop

Jinja examples

Example 1

Used in input parameter 'id'

[PROD - PROCESS] Datto: Get RMM Device Count Loader

This workflow automatically retrieves and compiles device counts across all client sites in Datto RMM, serving as a foundational data-gathering component that can feed into billing automation, asset reporting, or resource allocation workflows. It's particularly valuable for MSPs who need accurate device counts for usage-based billing, license management, or regular client reporting without manual inventory checks. Technically, the workflow calls the Datto RMM API to list all sites, then leverages a specialized task to gather device counts across these sites, making this data available for consumption by other automation processes in your MSP operations.

This workflow contains 5 tasks.

Inputs

This sub workflow has no inputs.

Outputs

  • automation_log: Standardized Rewst automation log

  • rmm_user_count: List of Datto RMM companies and their counts.

Key tasks

  • Get_Datto_RMM_Device_Counts: Data retrieval

  • datto_rmm_list_sites: Datto RMM integration: List Sites

  • build automation log: Logging

  • BEGIN: Core integration: noop

Jinja examples

Example 1

Used in input parameter 'site'

[PROD - TASK] Proofpoint: Get Counts

This workflow serves as a foundational building block that queries and retrieves organization count data from Proofpoint's email security platform, enabling MSPs to programmatically access client protection metrics for use in larger automation processes like reporting or security audits. It's particularly valuable for MSPs managing multiple clients' email security postures, supporting scenarios such as automated security reporting, license management verification, and identifying gaps in protection across client environments. Technically, the workflow operates by connecting to the Proofpoint API, retrieving organization data using the "proofpoint.get_organization" action which lists all sub-organizations for a specified domain, then processes this data to extract relevant count information while incorporating error handling for reliability. This automation component eliminates manual data collection steps for technical staff and can feed directly into client-facing security reports, RMM dashboards, or PSA ticketing systems to maintain consistent email security monitoring across the MSP's client base.

This workflow contains 7 tasks.

Inputs

This sub workflow has no inputs.

Outputs

  • automation_log: Standardized Rewst automation log

  • proofpoint_user_count: List of ProofPoint companies and their counts.

Key tasks

  • handle failure actions: Core integration: noop

  • Get Proofpoint Counts: Data retrieval

  • build automation log: Logging

  • proof_point_list_organizations: ProofPoint integration: List Organizations

Jinja examples

Example 1

This Jinja expression creates a formatted list of dictionaries containing Proofpoint license information for each managed organization. It accesses the proofpoint_orgs data from the context (CTX) object and extracts key metrics like organization name, active user count, license count, and primary domain for reporting or further processing.

Trim variable transform action

Use case

You have a string that has been grabbed from an API return, however due to bad formatting the string starts or ends with extra spaces that need removed.

Overview

Trim whitespace characters from a variable.

Parameters

Parameter
Description
Required

Usage

Example: Trimming a string

Variable Contents: This is a test starting and ending with 3 spaces each

Results output

Result of Example:

In the above return the " characters were kept to show the spaces being removed. These would not be present in the actual return. Only the original string without whitespaces would be returned.

[PROD - TASK] Datto PSA: Create Ticket

This workflow functions as a reusable building block that creates tickets in Datto Autotask PSA with proper contact association, enabling MSPs to programmatically generate standardized tickets across various automation scenarios. It's particularly valuable for integrating monitoring alerts with ticket creation, automating customer request handling, standardizing ticket generation across technicians, and incorporating ticket creation into complex workflows like onboarding/offboarding processes. Technically, the workflow first validates contact information by searching Datto PSA's contact database, then creates a properly formatted ticket with all required fields and associations, making it a reliable foundation for any automation that requires ticket generation within your PSA.

This workflow contains 8 tasks.

Inputs

  • board - string

  • summary - string

  • company_id - string

  • contact_id - string

  • category_one - string

  • category_two - string

  • category_four - string

  • child_company - string

  • contact_email - string

  • category_three - string

  • ticket_item_id - string

  • ticket_type_id - string

  • ticket_priority - string

  • ticket_subtype_id - string

  • initial_description - string

  • default_status_override - string

Outputs

  • automation_log: Standardized Rewst automation log

  • success: Boolean; States if workflow was successful.

  • ticket_id: Returns the ticket ID of the created ticket.

  • ticket_data: Return the ticket object of the created ticket.

Key tasks

  • BEGIN: Core integration: noop

  • create_ticket: Creation/initialisation

  • format_output: Core integration: noop

  • failed: Core integration: noop

Jinja examples

Example 1

Task: set_variables | Context: Used in publishing 'company_id'

Example 2

Task: set_variables | Context: Used in publishing 'issue_type_id'

[PROD - TASK] Pax8: Get License Counts

This workflow acts as a powerful building block that queries the Pax8 platform to retrieve comprehensive license counts across all client companies, providing essential data for license management, billing verification, and reporting workflows. By connecting to Pax8's API to list companies, gather product information, and enumerate active subscriptions, the workflow delivers accurate license quantity data that MSPs can leverage to identify unused licenses, verify billing accuracy, or trigger procurement processes. MSPs can integrate this into larger automation sequences that generate client-facing license reports, reconcile billing data between Pax8 and their PSA, or build automatic notifications when licenses need attention. The technical implementation is straightforward yet powerful - listing managed companies in Pax8, retrieving product details, and collecting subscription information to create a complete picture of license utilization across the entire client base.

This workflow contains 7 tasks.

Inputs

This sub workflow has no inputs.

Outputs

  • automation_log: Standardized Rewst automation log

  • subscription_name_and_quantity: List of Pax8 companies and their counts.

Key tasks

  • BEGIN: Core integration: noop

  • handle failure actions: Core integration: noop

  • pax_8_get_product: Data retrieval

  • pax_8_list_companies: Pax8 integration: List Companies

Jinja examples

Example 1

Used in publishing 'subscription_name_and_quantity'

[PROD - TASK] CWA: Get Counts

This workflow serves as a fundamental building block that queries ConnectWise Automate to retrieve company and computer counts, providing essential inventory data that can be consumed by larger automation processes for reporting, billing, or compliance purposes. MSPs will find this function valuable for client onboarding/offboarding validation, license reconciliation, automated billing workflows, and generating executive dashboards showing managed device statistics across their client base. Technically, the workflow executes by first retrieving the complete list of companies from CWA, then obtaining all managed computers, calculating the relevant counts, and presenting the data in a standardized format that other workflows can easily reference when making automation decisions or populating reports.

This workflow contains 7 tasks.

Inputs

This sub workflow has no inputs.

Outputs

cwa_counts: This output will contain a list of companies from Automate along with their counts.

Key tasks

  • connect_wise_automate_list_companies: ConnectWise Automate integration: List Companies

  • connect_wise_automate_list_computers: Calculation

  • build automation log: Logging

  • calculate_final_count: Calculation

Jinja examples

Example 1

Task: connect_wise_automate_list_companies

This expression creates a formatted list of company data by iterating through all companies available in the ConnectWise Automate integration. It extracts each company's name and ID, transforming them into a structured JSON array that can be easily consumed by other workflow steps or displayed in a dashboard.

The expression accesses the CTX.companies object provided by Rewst's ConnectWise Automate integration, which contains all the company records with their properties like Name and Id. MSPs can modify this to include additional company properties by adding more key-value pairs to the dictionary such as \"location\": company.Location or \"contact\": company.PrimaryContact.

Clone an existing form

There may be times when you want to take an existing form and make slight modifications to apply it to another use case. For example, you may be using the Client: New Employee workflow to onboard new users, and want to have two different forms:

  1. One for when you hire internal users at your organization

  2. One for adding users for your customers

How to clone and edit a form

  1. Navigate to Automations > Forms.

  2. Click ⋮ and select the Clone option on the form you want to clone.

  3. Rename your form to something unique and define a few other fields:

Shallow clone a form

Shallow cloning is a feature of the Rewst platform that allows you to create a copy of an existing workflow or form. This is useful if you have a workflow that is very similar to another workflow, but which requires a few small changes.

Standard cloning copies the entire resource pack— workflow, forms, templates, triggers, etc— and when cloning into your own org, you end up with multiple duplicates of the same resource. Shallow cloning copies that single selected resource, but re-uses all of the dependencies that it has. If you have a sub-workflow that's part of a main workflow, and you shallow clone that sub-workflow, you will end up with a copy of the sub-workflow. This lets you make changes to the sub-workflow without affecting the original workflow.

There is no difference between the steps to clone or shallow clone a resource. Rewst will automatically detect if you are cloning something into your own org. If so, the platform will shallow clone it instead. Note that this removes the Synchronize button on the dialog, and instead shows a text to explain.

Parse text to JSON transform action

Use case

You have received an API response of a JSON string instead of a JSON object and would like to convert it to a JSON object.

Overview

Parse Text Data into JSON.

Parameters

Parameter
Description
Required

You can utilize the Is JSON transform to test whether the string is valid JSON prior to parsing it with this transform.

Usage

Example: Parsing a JSON String

Inputs:

String Contents:

Results output

Result of Example:

Is JSON transform action

Use case

You are working with an API and the return comes back as a JSON string instead of being a JSON object. You would like to verify that the string is valid JSON before attempting to convert it to JSON.

Overview

This transform will check whether or not a string provided via the 'String to Check' input is a valid JSON string.

Parameters

Parameter
Description
Required

This transform is useful for confirming a string is a valid JSON string prior to converting it to json using a filter such as |json

Usage

Example 1: Providing a valid JSON string

Input:

Example 2: Providing a invalid JSON string

Input:

Results output

This transform will output a boolean value (True/False) based on whether or not the string is a valid JSON string.

Return from Example 1:

Return from Example 2:

Base64 Encode transform action

Use Case

You have a string value of a CSV file and you are looking to send it as an attachment using the Send Mail As Impersonated User action via the Microsoft Graph integration which requires the CSV string to be base64 encoded.

Overview

Encode a string in base64.

Parameters

Parameter
Description
Required

Usage

Example 1: Encoding a String

Inputs: **String**: This @is my test string-yeeeehaw **URL Safe**: false

Results output

Result of Example 1:

Return element transform action

Use case

You have a list of users and you would like to grab the first user in the list.

Overview

Returns the Nth element of a string or list

Parameters

Parameter
Description
Required

Usage

Example 1: Return the first user in a list of users

Input:

Element: 0

Input String or List:

Results output

Result of example 1:

[PROD - TASK] Rewst: Send Email with Attachment

This workflow provides a reliable method for sending emails with attachments through Rewst, functioning as a critical communication component that can be called from other automations to deliver documents, reports, or files to clients or team members. MSPs can leverage this building block to automate client communications for service completion notifications, scheduled security reports, license renewals, or documentation delivery—all with proper attachments and consistent branding. Technically, the workflow accepts inputs including recipient addresses, subject, body content, and attachment details, then determines whether to send via standard email or through Microsoft Graph (allowing for user impersonation), with built-in error handling for failed deliveries or missing user accounts. This reusable component eliminates the need to rebuild email functionality in every workflow, allowing MSPs to standardize client communications while focusing on building more complex automation processes.

This workflow contains 13 tasks.

Inputs

  • send_to - array (Required)

    • Default: {{ [ ] }}

  • subject - string

  • send_as_guid - string (Required)

  • use_failover - boolean

    • Default: {{ true }}

  • attachment_name - string

  • attachment_type - string

  • encoded_contents - string

  • message_contents - string

  • no_failover_attachment - boolean

    • Default: {{ false }}

Outputs

  • automation_log: Standardized Rewst automation log

  • output: Outputs a dictionary object with a key for success, the value for success is a boolean value indicating whether the workflow was successful or not.

Key tasks

  • check_sendas_field: Communication/notification

  • Send_Email: Communication/notification

  • core_sendmail: Communication/notification

  • microsoft_graph_get_user: Data retrieval

Jinja examples

Example 1

Used in input parameter 'subject'

[PROD - TASK] Huntress: Get License Counts

This workflow queries the Huntress security platform to retrieve and compile license usage data across all client organizations, serving as a critical building block for license management, billing reconciliation, and capacity planning automations. For MSPs, this function provides essential visibility for client billing accuracy, license compliance tracking, and identifying opportunities to optimize security coverage across the client base. Technically, the workflow first authenticates with Huntress, then retrieves the complete list of managed organizations, calculates agent deployment counts per organization, and compiles this data for integration with other systems like PSAs for billing or reporting tools for client reviews. This data can be particularly valuable when integrated with onboarding/offboarding workflows or when preparing for quarterly business reviews to assess security tool adoption and coverage gaps.

This workflow contains 6 tasks.

Inputs

Outputs

  • automation_log: Standardized Rewst automation log

  • huntress_count: List of Huntress companies and their counts.

Key tasks

  • huntress_list_organizations: Huntress integration: List Organizations

  • get_huntress_agent_count: Data retrieval

  • build automation log: Logging

  • BEGIN: Core integration: noop

Jinja examples

Example 1

This expression creates a structured list of all client organizations with their Huntress agent deployment statistics. It iterates through each organization in your Huntress integration (CTX.huntress_orgs), extracting the company name, agent count, and company ID into a list of dictionaries, with the |d filter providing empty string defaults for any missing values.

[PROD - TASK] Ninja: Get Device Counts

This workflow functions as a data-gathering utility that connects to NinjaRMM, retrieves all managed organizations, and calculates the total count of workstations and servers for each client. As a building block, it provides standardized device inventory data that can be consumed by other workflows for billing automation, client reporting, compliance verification, and device management processes. The workflow executes in three main technical steps: first retrieving the organization list from NinjaRMM, then making separate API calls to collect workstation and server device lists, and finally calculating the per-organization device counts for consumption by other systems. MSPs will find this particularly valuable for usage-based billing automation, reconciling device counts against agreements, generating executive reports for clients, and tracking environment growth trends across their client base.

This workflow contains 8 tasks.

Inputs

This sub workflow has no inputs.

Outputs

  • automation_log: Standardized Rewst automation log

  • ninja_device_counts: List of Ninja RMM companies and their counts.

Key tasks

  • BEGIN: Core integration: noop

  • ninja_rmm_list_organizations: NinjaRMM integration: List Organizations

  • list_workstations: NinjaRMM integration: List Devices

  • list_servers: NinjaRMM integration: List Devices

Jinja examples

Example 1

This expression creates a detailed inventory report by iterating through all organizations in NinjaRMM and counting their workstations, servers, and network devices. It accesses NinjaRMM data stored in the CTX variable (context), filtering devices by organization ID to generate accurate device counts for each client.

[Rewst Master v2] PSA-Datto: Get Queues

This workflow retrieves queue information from Datto PSA, serving as a critical building block for more complex ticket routing and management automations. MSPs can leverage this function when implementing automated ticket assignment processes, workload balancing between teams, or creating custom reporting dashboards that provide visibility into queue status and performance. Technically, the workflow executes a simple API call to Datto PSA's resource role queues endpoint, retrieving the field definitions and structure of available queues, which other workflows can then consume to make intelligent routing decisions or gather queue metrics for service delivery improvements.

This workflow contains 1 task.

Inputs

  • choose_variable - string

Outputs

  • options: Array of queues.

Key tasks

  • datto_psa_resource_role_queues_query_field_definitions: Datto Autotask PSA integration: resource_role_queues_query_field_definitions

Jinja Example

This is used to populate the queues data alias.

[Rewst Master v2] PSA-Halo: Get Agents

This workflow serves as a fundamental data retrieval building block that pulls a complete list of technicians/agents from Halo PSA, providing essential personnel data that can be utilized in more complex automation sequences. MSPs would find this function valuable when building ticket assignment workflows, creating technician availability reports, implementing skill-based routing, or developing any automation that requires filtering or assigning work based on agent attributes. Technically, the workflow executes a straightforward API call to Halo PSA that retrieves all agent records, returning them as a structured array that other workflows can filter, iterate through, or use for decision-making processes without requiring administrators to manually extract this information each time it's needed.

This workflow contains 1 task.

Inputs

  • choose_variable - string

Outputs

  • options: Array of agent objects.

Key tasks

  • list_agents: HaloPSA integration: List Agents

Jinja examples

Example 1

[Rewst Master v2] PSA-Datto: List Ticket Subtypes

This workflow retrieves all available ticket subtypes from Datto Autotask PSA, serving as a critical reference component for any automation that needs to create, route, or categorize tickets programmatically. MSPs will find this building block invaluable when developing automated ticket creation from RMM alerts, implementing intelligent ticket routing based on issue type, or synchronizing ticket classifications between different platforms. Technically, it executes a simple query to the Datto PSA API that returns all defined ticket subtypes and their associated picklist values, making these values available as variables for other workflows. This standardized method for accessing ticket classification data ensures that downstream automations always use valid subtype values, preventing errors when integrating with the PSA.

This workflow contains 1 task.

Inputs

  • ticket_type - string

  • choose_variable - string

Outputs

  • options: Array of ticket subtype objects.

Key tasks

  • list_ticket_subtypes: Datto Autotask PSA integration: List Ticket Fields with Picklists

Jinja example

This is used in publishing the ticket_subtypes data alias.

[PROD - TASK] MyGlue: Get License Counts

This workflow automatically pulls organization and user data from IT Glue, matches users to their respective organizations, and calculates license utilization across client sites - serving as a foundational building block for license management, billing verification, and capacity planning automations. MSPs will find this particularly valuable for reconciling monthly MyGlue license billing, identifying underutilized licenses for reassignment, preparing client reviews with accurate license metrics, and ensuring compliance with license agreements. Technically, the workflow functions by retrieving a comprehensive list of organizations and users from IT Glue's API, processing this data to match users with their organizations, calculating per-site license counts, and then producing a structured output that can feed into reporting tools, PSA systems, or other automated processes.

This workflow contains 8 tasks.

Inputs

This sub workflow has no inputs.

Outputs

  • automation_log: Standardized Rewst automation log

  • glue_counts: List of ITGlue companies and their counts.

Key tasks

  • it_glue_list_organizations: IT Glue integration: List Organizations

  • it_glue_list_users: IT Glue integration: List Users

  • BEGIN: Core integration: noop

  • calculate_site_counts: Calculation

Jinja examples

Example 1

Creates a list of organizations that have the attribute my-glue-account-id populated.

Data aliases

To understand this topic, you'll need to first complete Lesson 3 of the Cluck University course Automation Basics. This will introduce you to JSON and teach you how to both understand and use JSON in Rewst. If you haven't done your coursework yet, start there, then come back to this document.

What are Data aliases?

A data alias is a shortcut that extracts specific pieces of information from a JSON response and stores them in an easy-to-use

Map to an attribute within a list transform action

Use case

You are trying to create a list of users from a Microsoft Graph return and want to create a flat list of all the display names for the users.

Overview

Remove duplicates from list transform action

Use case

You are working with a list of users however, the dataset contains multiple objects with the same GUID, you would like to remove the duplicates from the list.

Overview

Task transitions

What are task transitions?

Task transitions are the bridges that connect different tasks, ensuring that workflows move forward as designed. They're represented by the small rectangles found directly beneath each task. Depending on the criteria set, one task might branch out to multiple subsequent tasks. When you interact with these rectangles by clicking on them, a configuration menu appears. Note that this is a different menu from what is seen when you click on the task itself.

Refang transform action

Use case

You have an email with a defanged URL inside of it similar to something like: hXXps[:]//rewst[.]io/aprilfools/surprise.html

You would like to refang it and make the URL directly usable.

Overview

Get business days between dates transform action

Use case

You would like to get the count of business days between dates.

Overview

Defang transform action

Use case

You have a email with a URL in it similar to something like: https://rewst.io/aprilfools/surprise.html You would like to defang it and make it not directly usable.

Overview

[PROD - TASK] Immybot: Get User Count

This workflow retrieves the total count of devices managed in ImmyBot, serving as a critical data-gathering building block that can feed into larger workflows for billing, license management, or resource planning automations. It's particularly valuable for MSPs needing to automate client billing based on device count, reconcile asset inventory across platforms, or trigger conditional processes based on current managed device thresholds. Technically, the workflow executes an API call to ImmyBot using the "list_computers" action, processes the returned device data, and makes the count available for downstream automation consumption - creating a simple yet powerful integration point between ImmyBot and your broader automation ecosystem.

This workflow contains 6 tasks.

Inputs

This sub workflow has no inputs.

URL encode transform action

Use case

You are writing query parameters and the API you are sending them to requires them to be URL encoded.

Overview

When given a string this transform will URL encode it.

Format date time transform action

Use case

You have received a date time string representation from an API, you would like to utilize this value in another API, however the new API expects it to be in a certain date format.

Overview

[Rewst Master v2] PSA-Datto: Get Priorities

This workflow retrieves the standardized list of ticket priorities from Datto Autotask PSA, serving as a fundamental building block that other automations can leverage when creating, updating, or processing tickets. MSPs will find this function valuable when building ticket creation workflows with conditional priority assignment, implementing SLA-based escalation processes, or ensuring consistent priority values across integration points with other tools. Technically, the workflow executes a single API call to Datto Autotask PSA using the "List Ticket Fields with Picklists" action, retrieving the current priority options configured in your PSA. By centralizing this function, MSPs can maintain consistent priority handling across their entire automation ecosystem while easily adapting if priority configurations change in Autotask.

This workflow contains 1 task.

Inputs

[Rewst Master v2] PSA-Datto: Get Company Status

This workflow pulls all company status values from Datto PSA with a single API call, making it a key reference point for automations that depend on client status. MSPs can use it to filter clients, trigger conditional actions, or validate status fields before updates. By returning standardized status options, it avoids hardcoding and keeps automations flexible, even when custom statuses are added, ensuring reliable, status-aware workflows across your PSA environment.

This workflow contains 1 task.

Inputs

  • choose_variable

Range transform action

Use case

You want to generate an array of integers from 1 to 100 to use in the With Items field of an action. This will cause the action, such as an API call, to run once for each number in the array. During each run, you can reference the current number using item() and use it to dynamically construct values like usernames. For example, the first run would use "User1", the second "User2", and so on up to "User100".

[PROD - TASK] SentinelOne: Get License Counts

This workflow acts as a critical building block by querying the SentinelOne platform to retrieve client site information, enabling MSPs to effectively track and manage endpoint security licenses across multiple clients. It delivers essential visibility into license distribution and utilization, which directly supports compliance management, client billing accuracy, and renewal planning for cybersecurity services. The workflow functions by connecting to the SentinelOne API, retrieving a comprehensive list of all managed client sites, and preparing this data for license count analysis in subsequent automation processes. MSPs managing multiple SentinelOne deployments can leverage this automation to eliminate manual license auditing processes, proactively identify licensing gaps, and generate accurate reports for both internal operations and client discussions.

This workflow contains 5 tasks.

Inputs

This sub workflow has no inputs.

[Rewst Master v2] PSA-Datto: Get Company Classification

This workflow retrieves all available company classification types from Datto Autotask PSA, serving as a foundational building block for more complex automation processes that need to categorize or filter clients. MSPs would find this function valuable when automating client onboarding workflows, implementing classification-based automation rules, or synchronizing client categorization between systems. Technically, the workflow executes a single API call to Datto PSA using the "companies_query_field_definitions" action, which returns the standardized classification options configured in your PSA that can then be used in dropdown menus or conditional logic within other workflows. This reusable component eliminates the need to hardcode classification values, ensuring your automations remain current even when PSA configurations change.

This workflow contains 1 task.

Inputs

[PROD - TASK] Rewst: Get All Integration Ids

This utility workflow collects all integration IDs from your Rewst instance, mapping organizations to their connected systems and Microsoft tenant IDs, serving as a fundamental building block for other automation workflows that need to interact with your integrated PSA, RMM, or Microsoft 365 environments. It's particularly valuable for MSPs when creating cross-platform automation workflows, conducting integration audits, or troubleshooting connection issues where accurate integration identifiers are required. Technically, the workflow retrieves all organizations in your Rewst instance, lists the integrations for each organization, collects relevant organization variables, and specifically identifies Microsoft tenant IDs—creating a comprehensive integration mapping that other workflows can reference when executing actions against specific client environments.

This workflow contains 6 tasks.

Inputs

This sub workflow has no inputs.

"2025-05-16T00:00:00+00:00"
{{ [true, false, true, true] }}
True
2025
27
New Name: the new name of the cloned form, make sure this is something unique and describes the use case for the form.
  • Organization: the organization that the form will reside under.

    • This doesn’t necessarily mean that you want to select the customer that the form will be for. The best practice is to have the form live at the top-level organization. The customers are tied to the relevant form by a trigger in the workflow. More information can be found in the Intro to Triggers article.

  • Click the Clone button to see your cloned form.

  • View the notes generated in your Notes menu. Sections will include:

    1. What's Occurring: Task Overview: Each documentation response begins with a clear and concise overview, providing users with a high-level understanding of the task's purpose and context.

    2. Expected Outcome: Task's Expected Result: Information about the expected outcome or result of the task or group of tasks is presented. This section helps users anticipate the outcomes when the workflow executes the associated tasks.

    3. Special Considerations: Any Crucial Factors: Special considerations or crucial factors related to the tasks are included. These details ensure that users have all the necessary information to understand the workflow path successfully.

    4. An accordion list of all included tasks

    A completed RoboRewsty note

    Minutes to add or subtract

    Integer value for how many minutes to add or subtract.

    Months to add or subtract

    Integer value for how many months to add or subtract.

    Seconds to add or subtract

    Integer value for how many seconds to add or subtract.

    Years to add or subtract

    Integer value for how many years to add or subtract.

    input variables
    The parameters tab of a workflows task, when there are inputs

    Epoch Time Value

    Epoch time value to convert to a date time string.

    Start Date

    The start date; This day is inclusive in the returned count.

    End Date

    The end date; This day is exclusive in the returned count.

    A screenshot of the get days between dates transform action, seen in the actions list menu of the workflow builder canvas.

    Fuzzy Parsing

    Whether to allow fuzzy parsing, allowing for string like "Today is January 1, 2047 at 8:21:00AM"

    Ignore Timezone

    If set True, time zones in parsed strings are ignored and a timezone naive datetime object is returned.

    Year First

    Whether to interpret the first value in an ambiguous 3-integer date (e.g. 01/05/09) as the year. If True, the first number is taken to be the year, otherwise the last number is taken to be the year. If set to None, this value is retrieved from the current parserinfo object (which itself defaults to False).

    First Date

    This should be a valid datetime string representation.

    Second Date

    This should be a valid datetime string representation.

    Comparison Operator

    The operator to use in the comparison.

    Day First

    Whether to interpret the first value in an ambiguous 3-integer date (e.g. 01/05/09) as the day (True) or month (False). If yearfirst is set to True, this distinguishes between YDM and YMD. If set to None, this value is retrieved from the current parserinfo object (which itself defaults to False).

    DateTime to convert

    Use https://strftime.org/ for various options

    Timezone to convert

    Use https://en.wikipedia.org/wiki/List_of_tz_database_time_zones for various options not listed

    DateTime format to return

    Use https://strftime.org/ for various options

    Timezone to return

    The timezone you would like to have the date returned in.

    An image of the get datetime transform action in the actions menu in the workflow builder canvas.

    String to Measure

    The string to get the length of.

    A screenshot of the get string length transform action, seen in the actions list menu of the workflow builder canvas.

    BEGIN: Core integration: noop

    Max Splits

    The maximum number of splits. If not specified or -1, then there is no limit on the number of splits (all possible splits are made)

    Seperator

    Character or sequence of characters to split on (default is ), such as ' , ',':', etc.

    Text to split

    The string to be split.

    A screenshot of the split text transform action, seen in the actions list menu of the workflow builder canvas.

    String

    String to decode.

    URL Safe

    Whether the base64-encoded has been encoded in URL-safe format.

    As Bytes

    Whether to return the raw bytes, instead of decoding the bytes as a UTF-8 string.

    List

    List of boolean values to check against.

    String

    String to URL decode.

    auvik_list_tenants_detail: Auvik integration: List Tenants Detail

    BEGIN: Core integration: noop

    Variable Contents

    Variable to trim

    A screenshot of trim variable objects transform action, seen in the actions list menu of the workflow builder canvas.

    find_contact_id: Datto Autotask PSA integration: List Contacts by Search v2

    pax_8_list_subscriptions: Pax8 integration: List Subscriptions

    handle failure actions: Core integration: noop

    String Contents

    String to convert.

    A screenshot of the parse test to JSON transform action, seen in the actions list menu of the workflow builder canvas.

    String to Check

    The string to validate.

    String

    String to encode

    URL Safe

    Whether to return a URL-safe base64 format. '-' is used instead of '+', and '_' instead of '/'.

    Element

    Element number to Return, starting at 0 for the first element. -1 will return the last element

    Input String or List

    String or list that you would like to return the element of.

    A screenshot of the set return element transform action, seen in the actions list menu of the workflow builder canvas.

    user_not_found: Core integration: noop

    action_error: Core integration: noop

    calculate_org_device_counts: Calculation

    match_users_to_org: Core integration: noop

    Outputs
    • automation_log: Standardized Rewst automation log

    • immy_counts: List of ImmyBot companies and their counts.

    Key tasks

    • BEGIN: Core integration: noop

    • get_device_count: Data retrieval

    • immy_bot_list_computers: Calculation

    • build automation log: Logging

    • action_error: Core integration: noop

    Jinja examples

    Example 1

    This expression creates a structured report of device counts by company, iterating through a list of companies and counting matching Immybot devices for each. It's accessing company names from company_list and device data from CTX.listed_immy_devices, using list comprehensions and filters to match devices to their respective companies.

    choose_variable - string

    Outputs

    • options: Array of priorities.

    Key tasks

    • get_priorities: Data retrieval

    Jinja example

    This is used in publishing the all_priorities data alias.

    - string

    Outputs

    • options: Array of company statuses.

    Key tasks

    • get_company_statuses: Data retrieval

    Jinja example

    This is used in publishing all_company_statuses

    Outputs
    • automation_log: Standardized Rewst automation log

    • sentinel_counts: List of SentinelOne companies and their counts.

    Key tasks

    • sentinel_one_list_sites: SentinelOne integration: List Sites

    • Begin: Core integration: noop

    • build automation log: Logging

    Jinja examples

    Example 1

    choose_variable - string

    Outputs

    • options: Array of company classifications.

    Key tasks

    • get_company_classifications: Data retrieval

    Jinja example

    This is used in publishing 'all_classifications'

    Outputs
    • all_integration_ids: Outputs a list of organizations, the organization object includes org info and their integration mappings.

    Key tasks

    • rewst_list_organizations: Rewst integration: List Organizations

    • rewst_list_integrations_for_organization: Rewst integration: List Integrations For Organization

    • rewst_list_organization_variables: Rewst integration: List Organization Variables

    • BEGIN: Core integration: noop

    • workflows_get_ms_tenant_ids: Data retrieval

    Jinja examples

    Example 1

    This expression creates a list of all enabled organization IDs across your MSP environment, plus the current organization's ID. It accesses the CTX.all_orgs collection to gather all enabled organizations (org.is_enabled == true) and adds the current organization ID (ORG.ATTRIBUTES.id) to ensure it's included regardless of its enabled status.

    Expression 2

    Example 2

    This expression finds the first default configuration ID for any integration pack containing "csp" in its name (cloud service provider), returning None if none exists. It performs a nested loop through integration packs and their configurations, filtering for default configurations within CSP-related integration packs.

    2025-05-16T11:36:37+00:00
    6
    False
    "2025-04-16T05:00:30-04:00"
    2025-04-16T08:07:04Z
    43
    {{ CTX.accounts.response }}
    [
      "The",
      "quick",
      "brown",
      "fox",
      "jumps",
      "over",
      "the",
      "lazy",
      "dog"
    ]
    This @is my test string-yeeeehaw
    {{ CTX.company_id |d }}
    {{ RESULT.license_counts }}
    {{ [true, false, true, true] }}
    False
    This-is-@-test!
    {{ item().id }}
    {{- item().uid -}}
    {{ [ { "company": org.name, "active_users": org.active_users, "count": org.user_licenses, "company_id": org.primary_domain } for org in CTX.proofpoint_orgs ] }}
    "This is a test starting and ending with 3 spaces each"
    {{ (CTX.child_company|d) or (CTX.company_id|d) or (ORG.VARIABLES.datto_company_id|d) }}
    { - CTX.ticket_type_id|d or ORG.VARIABLES.psa_datto_default_issue_type | d or ORG.VARIABLES.psa_new_user_ticket_type | d - }
    {{ CTX.subscription_data }}
    {{ [ { "company": company.Name, "id": company.Id } for company in CTX.companies ] }}
    {"id":"676e061a-8004-4f60-ad37-cb0b2be25635","user":"Sean","age":32,"bio":"Hi, my name is Sean.\nI love hiking."}
    {
      "id": "676e061a-8004-4f60-ad37-cb0b2be25635",
      "user": "Sean",
      "age": 32,
      "bio": "Hi, my name is Sean.\nI love hiking."
    }
    {"test":"test"}
    I am not a JSON string!
    True
    False
    VGhpcyBAaXMgbXkgdGVzdCBzdHJpbmcteWVlZWVoYXc=
    [
        {
            "id": 1,
            "user": "Bob"
        },
        {
            "id": 2,
            "user": "Kim"
        },
        {
            "id": 3,
            "user": "Magnus"
        },
        {
            "id": 4,
            "user": "Karin"
        },
    ]
    {
    	"id": 1,
    	"user": "Bob"
    }
    {{ CTX.subject|d }}
    {{ [ { "company": org.name |d, "count": org.agents_count |d, "company_id": org.id |d } for org in CTX.huntress_orgs ] }}
    {{ [ { "company": org.name, "company_id": org.id, "workstation_count": [item for item in CTX.ninja_workstations if item.organizationId == org.id] | length, "server_count":[item for item in CTX.ninja_servers if item.organizationId == org.id] | length, "network_device_count": [item for item in CTX.ninja_network_devices if item.organizationId == org.id] | length, } for org in CTX.ninja_orgs ] }}
    {%- set all_queues = [] -%}
    
    {%- for item in RESULT.result.fields -%}
      {% if item.isPickList == true %}
        {%- set tmp = item.picklistValues | list -%}
        {% for queues in tmp %}
          {%- set is_default = queues.value|int == ORG.VARIABLES[CTX.choose_variable]|d|int -%}
          {%- set tmp2 = all_queues.append({"name": queues.label, "id": queues.value, "default": is_default}) -%}
        {% endfor %}
      {% else %}
      {% endif %}
    {% endfor %}
    
    {{- all_queues | list -}}
    
    {{ [{"id": agents.id, "label": agents.name, "default": true if agents.id == ORG.VARIABLES[CTX.choose_variable]|d|int else false} for agents in TASKS.list_agents.result.result] }}
    {%- set all_subissues = [] -%}
    
    {%- for item in CTX.list_all_types -%}
    
    {%- if CTX.ticket_type|d == item.type_id|d -%}
    
    {%- set is_default = item.value|d == ORG.VARIABLES[CTX.choose_variable]|d -%}
    
    {%- set _ = all_subissues.append({"label":item.subType_name, "id":item.subType_id, "default":is_default}) -%}
    
    {% endif %}
    
    {%- endfor -%}
    
    {{- all_subissues -}}
    {{ [ org for org in CTX.glue_orgs if org.attributes['my-glue-account-id'] ] }}
    {{ [ { "company": item, "company_id": [device.company_id for device in CTX.listed_immy_devices if device.company_name == item] | first |d, "count": [device for device in CTX.listed_immy_devices if device.company_name == item] | length } for item in company_list ] }}
    {%- set all_priorities = [] -%}
    
    {%- for item in RESULT.result.fields -%}
      {% if item.isPickList == true and item.name == "priority" %}
        {%- set tmp = item.picklistValues | list -%}
        {% for priority in tmp %}
          {%- set is_default = priority.value|int == ORG.VARIABLES[CTX.choose_variable]|d|int -%}
          {%- set tmp2 = all_priorities.append({"name": priority.label, "id": priority.value, "default": is_default}) -%}
        {% endfor %}
      {% else %}
      {% endif %}
    {% endfor %}
    
    {{- all_priorities | list -}}
    {%- set all_company_statuses = [] -%}
    
    {%- for item in RESULT.result.fields -%}
      {% if item.isPickList == true and item.name == "companyType" %}
        {%- set tmp = item.picklistValues | list -%}
        {% for companystatuses in tmp %}
          {%- set is_default = companystatuses.value|string in ORG.VARIABLES[CTX.choose_variable]|d -%}
          {%- set tmp2 = all_company_statuses.append({"name": companystatuses.label, "id": companystatuses.value, "default": is_default}) -%}
        {% endfor %}
      {% else %}
      {% endif %}
    {% endfor %}
    
    {{- all_company_statuses | list -}}
    
    {{ [ { "company": site.name, "count": site.activeLicenses, "sku": site.sku, "company_id": site.id |d } for site in CTX.all_sites ] }}
    {%- set all_classifications = [] -%}
    
    {%- for item in RESULT.result.fields -%}
      {% if item.isPickList == true and item.name == "classification" %}
        {%- set tmp = item.picklistValues | list -%}
        {% for classifications in tmp %}
          {%- set is_default = classifications.value|string in ORG.VARIABLES[CTX.choose_variable]|d -%}
          {%- set tmp2 = all_classifications.append({"name": classifications.label, "id": classifications.value, "default": is_default}) -%}
        {% endfor %}
      {% else %}
      {% endif %}
    {% endfor %}
    
    {{- all_classifications | list -}}
    
    {{ [org.id for org in CTX.all_orgs if org.is_enabled == true] + [ORG.ATTRIBUTES.id] }}
    {{ [ config.id for pack in CTX.packs for config in pack.pack_configs if config.default == true and \"csp\" in pack.name|lower ] | first or None }}
    Click View results for workflow.
  • View the list of all times the workflow has run. Errors will be denoted by Failed.

  • Click on failed execution rows to see more information.

  • Click on any of the failed actions in the list at the bottom of the page to examine its Workflow Execution log.

    1. If troubleshooting the issue yourself, find the errors in the workflow execution and correct them.

    2. If creating a ticket for Rewst support, copy the URL of your browser while viewing this information, and paste it into your support ticket.

    3. You can also ask RoboRewsty to help you troubleshoot your execution results.

  • The view of an expanded form field, open for editing
    variable
    . Instead of navigating the entire JSON structure every time, a data alias pulls out exactly what you need—like a user’s name or email—and makes it accessible throughout your workflow. Think of data aliases
    as custom labels you assign to specific data.

    Recall that the context is where all data generated, captured, or used in a workflow is stored. Think of it as a shared memory for a specific workflow. Data aliases are stored in the context, making them available for reuse at any step in your workflow without re-fetching the data.

    For example, imagine that you've set up your Microsoft Graph integration. You send a request via API call to get info about a user. The response comes back to you in JSON format, which can be lengthy and time consuming to search through. A data alias would let you get all of the information, or pinpoint specific information like the user's name or email address, and store it in a simpler variable in the context for use.

    Together, variables, data aliases, and the context make your workflows in Rewst more efficient, organized, and adaptable. These tools help you reuse workflows, reduce manual work, and customize data handling to fit any automation need.

    Data alias requirements

    When adding a new data alias, you'll need the following:

    • Key: The name you assign to specific data.

    • Value: The actual data it corresponds to. The code editor button allows for the use of Jinja customization for intricate data or expressions.

    Data alias context example

    If you set an alias such as my_task_result -> {{ RESULT }}, later tasks can refer to this data using {{ CTX.my_task_result }}.

    You can also use a data alias to extract specific information and manipulate data. Expanding on our example from above, take the input from the Microsoft Graph get user action and extract the user's name and user principal name for ease of use.

    1. Drag the Get User action onto the workflow builder canvas.

    2. Add your user into the User ID field.

    3. Set your context variable name under Publish Result As. The workflow action results will be stored as the value.

    4. Add your data alias name. Click to open the Jinja editor and set up your data alias.

    5. Use the following Jinja to create a new dictionary object and set the displayName and userPrincipalName keys.

    6. Run the workflow. Then, click View Results

    7. Click Load Context.

    8. Expand the context to see our data alias filtered_user_details now only showing the displayName and userPrincipalName .

    Add a data alias to a workflow

    Data aliases are added via transitions. See more about how to use transitions in workflows here.

    1. Click to add your data alias.

    2. Paste the key into the key field. Click to open the Jinja editor and set up your data alias.

    3. Click to remove a data alias.

    4. Click and to move multiple data aliases up and down in the data alias list.

    Access data aliases in a workflow

    1. Navigate to Automations > Workflows.

    2. Search for your desired workflow.

    3. Click > to the far right of that workflow to open its workflow builder canvas.

    4. Click to open the Data Aliases menu. This will display a complete list of all data aliases for that workflow.

    Map to an attribute for each dictionary object in a list.

    Parameters

    Parameter
    Description
    Required

    Attribute

    The attribute to map to, dot notation can be used. For example, result.result

    List

    The list you would like to perform the map on.

    This is useful for working with results returned from actions running with items so you don't have to worry about the nested result keys.

    Usage

    Example 1: Mapping to usernames in a response

    Inputs:

    Attribute: result.result.data.username

    List:

    Results output

    This transform is expected to return a new list that is mapped to the selected attribute.

    Example of result for Example 1:

    Returns a list of unique items from the given list/iterable.

    Parameters

    Parameter
    Description
    Required

    Attribute

    Filter objects with unique values for this attribute; Only required for lists of objects.

    Case Sensitive

    Treat upper and lowercase strings as distinct.

    List

    List to remove duplicates from.

    For nested field names, separate them by dots (e.g., details.age).

    Usage

    Example 1: Filter List For Unique Objects Based On Username

    Inputs

    Attribute: username Case Sensitive: False List:

    Example 2: Filter List of Integers For Unique Integers

    Inputs

    Attribute: username Case Sensitive: False List:

    Results output

    The expected output for this transform is a new list of the unique items from the previous list.

    Result of Example 1:

    Result of Example 2:

    Task transition configuration options
    • Edit Transition: Buttons beside the Edit Transition title give you options to either clone the current transition or remove it if it's no longer needed.

    • Custom Label: An editable field allowing you to give a meaningful name to the transition, aiding clarity as your workflow grows.

    • Move Left/Right: These are controls that allow you to rearrange the sequence in which transitions are evaluated and executed. Transitions are evaluated from left to right, so order them carefully.

    • Condition: This criteria governs the task's progression based on the options defined below. Depending on the outcome of this task, this rule determines which path to follow next. Left to right, these are:

      • Success: if the task succeeds

      • Failure: if the task fails

      • Always: regardless of the outcome of the task

      • Custom Condition: set custom, with Jinja

    • : Clicking the + button lets you define an easy-to-use variable that stores the results of the task transition.

    In the advanced options in the workflow body, you can opt to either follow the first left to right transition condition that returns true, or to follow all transitions from the action.

    Transition modes

    For information on how these work, see our documentation for advanced workflow operations.

    A task transition, nested under a generic task

    Given a defanged URL, this action will refang the url by removing the added characters that prevent it from being directly usable.

    Parameters

    Parameter
    Description
    Required

    URL

    URL to refang

    Usage

    Example 1: Refang hXXps[:]//rewst[.]io/aprilfools/surprise.html

    Inputs:

    Colon: True

    Dots: True

    URL: https://rewst.io/aprilfools/surprise.html

    Results output

    The expected result of this transform is a standard url.

    Result from Example 1:

    Get the number of business days between two dates.

    Parameters

    Parameter
    Description
    Required

    Start Date

    The start date; This day is inclusive in the returned count.

    End Date

    The end date; This day is exclusive in the returned count.

    Holidays

    A list of holidays

    Country

    Country Specific Holidays to remove from the set.

    It is important to note that the end date is exclusive in the returned count, only start date is inclusive in the count.

    Usage

    Example 1: 07/01/2025 through 07/07/2025 excluding US Holidays

    Inputs:

    Start Date: 07/01/2025

    End Date: 07/07/2025

    Holidays:

    Country: United States of America

    Example 2: 07/01/2025 through 07/07/2025 not excluding US Holidays

    Inputs:

    Start Date: 07/01/2025

    End Date: 07/07/2025

    Holidays:

    Country:

    Results output

    Result of Example 1:

    Result of Example 2:

    A photo of the text header in the transform menu of the workflow builder for get business days between dates

    Given a URL, this action will 'defang' the url by adding characters to prevent it from being directly usable.

    Parameters

    Parameter
    Description
    Required

    URL

    URL to defang

    Colon

    If true defang colons.

    Dots

    If true defang all dots.

    Usage

    Example 1: Defang the url https://rewst.io/aprilfools/surprise.html

    Inputs:

    Colon: True

    Dots: True

    URL: https://rewst.io/aprilfools/surprise.html

    Results output

    The expected result of this transform is a defanged url.

    Result from Example 1:

    Parameters

    Parameter
    Description
    Required

    String

    String to URL encode.

    Usage

    Example: Encode a string

    Inputs: String: This-is-@-test!

    Results output

    Given a date or date time string, format it to a different date time string. Custom input can be used, please refer to https://strftime.org/ for the format string options.

    Parameters

    Parameter
    Description
    Required

    Date Time String

    The original date time string that needs formatted differently.

    Day First

    Whether to interpret the first value in an ambiguous 3-integer date (e.g. 01/05/09) as the day (True) or month (False). If yearfirst is set to True, this distinguishes between YDM and YMD. If set to None, this value is retrieved from the current parserinfo object (which itself defaults to False).

    Year First

    Whether to interpret the first value in an ambiguous 3-integer date (e.g. 01/05/09) as the year. If True, the first number is taken to be the year, otherwise the last number is taken to be the year. If set to None, this value is retrieved from the current parserinfo object (which itself defaults to False).

    Fuzzy Parsing

    Whether to allow fuzzy parsing, allowing for string like "Today is January 1, 2047 at 8:21:00AM"

    You can provide a custom format by manually entering your strftime string into the format field. For placeholder references please visit https://strftime.org/ .

    Usage

    Example 1: Change date of 2025-05-25T07:00:00.000Z to YYYY-MM-DD

    Inputs: Date Time String: 2025-03-13T04:00:00.000Z Day First: None Fuzzy Parsing: True Ignore Timezone: FalseY ear First: None Desired String Format: YYYY-MM-DD

    It's important to note that YYYY-MM-DD is a select-able value in the drop down for the field. If you were to do this via a custom input, then it would be: %Y-%m-%d

    Results output

    Example output from Example 1:

    Overview

    This transform will return a list of integers from start to end.

    Parameters

    Parameter
    Description
    Required

    Start

    The starting value of the range, inclusive. Default is 0 if not provided.

    End

    The ending value of the range, exclusive. Default is 0 if not provided.

    Step

    The step size for the range. Defaults to 1 if not provided.

    The end field value is exclusive, so if you would like to have the end value of the array be 100 (as an example) then you would need to provide an end value of 101.

    Usage

    Example: Create an array with 1 to 25

    Inputs:

    Start: 1 End: 26 Step: 1

    Results output

    Result of Example:

    Option generator workflows

    When automating certain processes, it's important to use dynamic options that adjust based on the input. Using the same list of options every time can lead to errors by applying choices that don't fit the situation. When an automation gets information from a form, it's important that the data on the form be dynamic, and adjust based on previous inputs or selections on that same form.

    An option generator workflow will always be connected to a form, and allows you to provide tailored, dynamic options for specific fields in that form. For example, in an automation that updates a user's group memberships, the list of groups is tailored to the input. You wouldn't want to add an individual to a group that they're already a member of, nor would you want to remove them from a group that they're not a member of. To add a user to a group, you would generate a list of groups that are not already part of the user's group memberships. To remove a user from a group, you would generate the user's current list of group memberships.

    The order of operations for creating the pieces needed to pull off an option generator is flexible. You can create the option generator workflow first, or the form that connects to the option generator workflow. In the below example, the workflow is made first.

    Ultimately, an option generator workflow needs three things:

    1. A workflow designated as an option generator in the workflow configuration.

    2. Workflow output configuration that sets the value of options to the relevant workflow context variable.

    3. A Rewst form that contains a form field connected to the option generator workflow and its trigger.

    Create an option generator workflow

    Before you begin, decide which options need to be displayed based on the user’s selection. For this example, the list of groups will change depending on whether the action is to add or remove a user.

    1. .

    2. Click in the top menu bar of your workflow's workflow builder canvas.

    3. Click the Workflow Type drop-down selector.

    4. Select Option Generator.

    Create a form to be used with the workflow

    Remember, workflow generated options allow forms to be highly dynamic. When a form field is connected to an option workflow, it will return a list of options based on the input.

    See the documentation for how to use our form builder to achieve this step .

    How the form and workflow come together to generate options

    1. When the workflow runs, it should result in a context variable {{ CTX.options }} that contains a list of items with key-value pairs that will be referenced in the form editor.

    2. The values here will be used in the Label Field an Value Field for a form field.

      1. The Label is what gets shown to the user who fills out the form as an available choice.

    Boolean logic in Rewst workflows

    Boolean values and their role in automation

    Boolean values represent simple yes/no conditions, like on/off or true/false. They define rules and logic in workflows by evaluating conditions.

    Boolean values are fundamental in automation workflows, controlling decision-making and process flow. Understanding Boolean logic helps ensure that workflows are efficient, reliable, and easy to maintain.

    Key boolean concepts

    • Boolean values: Represent true or false, similar to 1 (on) and 0 (off).

    • Logical operators: and, or, not determine conditions in workflows.

    Boolean operators in Rewst workflows

    Boolean logic controls workflow decisions using these key operators:

    • and – Requires both conditions to be true.

      • Example: user_logged_in and is_admin

    • or – Requires at least one condition to be true.

    Boolean logic in action

    • True and false = false – Both conditions must be true for and to return true.

    • True or false = true – Only one condition needs to be true for or to return true.

    • Not false = true – Flips the Boolean value to its opposite.

    Best practices for boolean logic in Rewst

    To ensure efficiency and maintainability, follow these best practices.

    Structuring logical conditions

    • Group logic with parentheses: Ensures conditions execute in the correct order.

      • Example: (is_admin and is_active) or is_super_admin

    • Use in for cleaner conditions:

    Simplifying boolean expressions

    • Use ternary operators for concise logic:

      • Syntax: variable = value_if_true if condition else value_if_false

      • Example: status = "Active" if is_active else "Inactive"

    For more on how boolean values relate to Rewst, complete our Clean Automation course in Cluck University.

    Form organization variables

    Form organization variables are implemented with specific forms that come from Crates. They can be used to set form_org_vars so that you can have specific default values for fields on a form.

    Variable Name
    Description
    Valid Values

    form_default_supervisor

    Used so that if the form forces a default, this is the value supplied in the if statement

    string

    form_default_orgunit

    Used so that if the form forces a default, this is the value supplied in the if statement. Example is [{"id": "fb53fb9f-208f-451c-9391-6092eb7c4e1b","label":"OU=Disabled Users,OU=Pedro Users,OU=Pedro Ltd,DC=ad2,DC=pedroaviary,DC=com"}]

    list

    form_default_location

    YAML parse transform action

    Use case

    An API has returned a YAML formatted string and you would like to convert it to a JSON object.

    Overview

    Parses a YAML string and returns the resulting data structure in JSON.

    Parameters

    Parameter
    Description
    Required

    This transform is utilizing the yaml_parse filter, which will only work with one document.

    If your YAML string contains multiple documents you should process them individually.

    Usage

    Example: Parse a YAML string

    YAML input:

    Results output

    Flatten list transform action

    Use case

    You are working with a list of users, however the users are nested in a list.

    You would like to flatten the list of lists so it ends up as a list of objects.

    Overview

    Flatten a nested List.

    Parameters

    Parameter
    Description
    Required

    Usage

    Example: Flattening nested lists

    Input:

    Array variable to flatten:

    Results output

    Result of Example:

    Convert list to object transform action

    Transforms a list into an object with extracted key-value pairs.

    Overview

    This transform action allows you to convert a list of objects into a single object, creating each object's property using user-defined key-value pairs extracted from the list, and simplifying the handling of complicated list structures.

    Configure a webhook trigger for CORS requests

    Though this is related to triggers, it's most often used in conjunction with App Builder. Learn more about Rewst's App Builder in our documentation .

    What is a CORS request?

    When referencing a Rewst web hook in JavaScript in an App Builder page— or outside of Rewst— you may see the error TypeError: Failed to fetch.

    Transform actions

    Transform actions, or transforms for short, are a simplified way to achieve commonly required Jinja filters without writing complex code, while providing flexibility to adapt in the Live Editor for more advanced Rewst users. They offer the ability to modify, combine, and reshape the data you are working with in your workflows. These actions are particularly useful when dealing with complex data structures, such as nested lists and objects. They empower you to transform data according to your needs without additional coding.

    Click through to each of the following pages to learn more about the relevant transform actions.

    Use webhook triggers

    What is a webhook trigger?

    Webhook triggers are an effective way to kick off a workflow with context from external systems. By sending an API request to a webhook trigger, Rewst will fire the workflow and include any data and or queries included in the request.

    Anatomy of a webhook URL

    [
      {
        "result": {
          "result": {
            "data": {
              "username": "amorton"
            }
          }
        }
      },
      {
        "result": {
          "result": {
            "data": {
              "username": "bmorton"
            }
          }
        }
      },
      {
        "result": {
          "result": {
            "data": {
              "username": "cmorton"
            }
          }
        }
      },
      {
        "result": {
          "result": {
            "data": {
              "username": "dmorton"
            }
          }
        }
      },
      {
        "result": {
          "result": {
            "data": {
              "username": "emorton"
            }
          }
        }
      }
    ]
    [
      "amorton",
      "bmorton",
      "cmorton",
      "dmorton",
      "emorton"
    ]
    [
      {
        "member": true,
        "username": "Dan"
      },
      {
        "member": true,
        "username": "DAn"
      },
      {
        "member": true,
        "username": "dan"
      },
      {
        "member": true,
        "username": "DaN"
      },
      {
        "member": false,
        "username": "Bob"
      }
    ]
    
    
    ```json
    [ 1, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5 ]```
    [
      {
        "member": true,
        "username": "Dan"
      },
      {
        "member": false,
        "username": "Bob"
      }
    ]
    [
      1,
      2,
      3,
      4,
      5
    ]
    https://rewst.io/aprilfools/surprise.html
    3
    4
    hXXps[:]//rewst[.]io/aprilfools/surprise.html
    This-is-%40-test%21
    2025-05-25
    [
      1,
      2,
      3,
      4,
      5,
      6,
      7,
      8,
      9,
      10,
      11,
      12,
      13,
      14,
      15,
      16,
      17,
      18,
      19,
      20,
      21,
      22,
      23,
      24,
      25
    ]

    Comparison operations: Evaluate conditions (e.g., user_role == "admin").

  • Custom conditions in workflows: Enable transitions based on Boolean evaluations.

  • Example: is_manager or is_admin

  • not – Inverts a Boolean value.

    • Example: not user_logged_in (returns true if user_logged_in is false).

  • Before: if role == "admin" or role == "super_admin"

  • After: if role in ["admin", "super_admin"]

  • Leverage short-circuit evaluation:
    • Skips unnecessary checks by placing the most likely condition first.

    • Example: if user_logged_in and is_admin: (Skips is_admin check if user_logged_in is false.)

    Ignore Timezone

    If set True, time zones in parsed strings are ignored and a timezone naive datetime object is returned.

    Desired String Format

    Defaults to YYYY-MM-DDTHH:MM:SSZ if left empty.

    Used so that if the form forces a default, this is the value supplied in the if statement

    string

    form_default_email_domain

    Used so that if the form forces a default via workflow input, this is the value supplied in the if statement

    string

    form_default_selection_email_domain

    Will return the domain specified as the default selection for the workflow [Rewst Master v2] M365: List Email Domains-Actual

    string

    form_default_licence_sku

    Used so that if the form forces a default, this is the value supplied in the if statement

    list

    form_default_aad_groups

    Used so that if the form forces a default, this is the value supplied in the if statement. Example is [{"id": "68c2878a-6739-438c-bf5a-d8c2bea39573","label": "AAD Group One"},{"id": "936eb764-36c4-4ac6-b264-c532caeb217c","label": "Group Me Up Buttercup - Group"}]

    list

    form_default_distribution_aad_groups

    Used so that if the form forces a default, this is the value supplied in the if statement. Example is [{"id": "68c2878a-6739-438c-bf5a-d8c2bea39573","label": "Dist Group Two"},{"id": "936eb764-36c4-4ac6-b264-c532caeb217c","label": "Group Me Up Buttercup - Distribution"}]

    list

    form_default_onprem_groups

    Used so that if the form forces a default, this is the value supplied in the if statement. Example is [{"id": "68c2878a-6739-438c-bf5a-d8c2bea39573","label": "Local AD Group One"},{"id": "936eb764-36c4-4ac6-b264-c532caeb217c","label": "Another Local AD Group"}]

    list

    form_default_security_aad_groups

    Used so that if the form forces a default, this is the value supplied in the if statement. Example is [{"id": "68c2878a-6739-438c-bf5a-d8c2bea39573","label": "Security Group One"},{"id": "936eb764-36c4-4ac6-b264-c532caeb217c","label": "Security Group Two"}]

    list

    form_default_department

    Used so that if the form forces a default, this is the value supplied in the if statement. Example is [{"department": "HR"},{"department": "Finance"}]

    list

    form_default_phone_number

    Used in the workflow itself that if the org var is specified, it'll use it if none on the form

    string

    Add or subtract from DateTime

    All transform

    Any transform

    Append with items results

    Compare dates

    Convert DateTime to timezone

    Convert list to object

    Defang

    Diff lists

    Flatten list

    Format date time

    Generate friendly password

    Get business days between dates

    Get DateTime

    Get days between dates

    Get list length

    Get string length

    Is JSON

    Map to an attribute within a list

    Merge lists

    Parse CSV

    Parse text to JSON

    Refang

    Remove duplicates from list

    Return element

    Select attribute

    Set list field value

    Set variable

    Sort

    Split text

    Transform list objects

    Trim variable

    Yaml parse

    Click on ... under errors to expand error information
    Data Aliases

    YAML Input

    The YAML string to parse.

    Array variable to flatten

    The array you would like to flatten

    {{
    {
    "displayName": CTX.user_details.data.value.displayName,
    "userPrincipalName": CTX.user_details.data.value.userPrincipalName
    }
    }}
    version: 2.1
    
    # Define the jobs we want to run for this project
    jobs:
      build:
        docker:
          - image: cimg/base:2023.03
        steps:
          - checkout
          - run: echo "this is the build job"
      test:
        docker:
          - image: cimg/base:2023.03
        steps:
          - checkout
          - run: echo "this is the test job"
    
    # Orchestrate our job run sequence
    workflows:
      build_and_test:
        jobs:
          - build
          - test
    {
      "jobs": {
        "test": {
          "steps": [
            "checkout",
            {
              "run": "echo \"this is the test job\""
            }
          ],
          "docker": [
            {
              "image": "cimg/base:2023.03"
            }
          ]
        },
        "build": {
          "steps": [
            "checkout",
            {
              "run": "echo \"this is the build job\""
            }
          ],
          "docker": [
            {
              "image": "cimg/base:2023.03"
            }
          ]
        }
      },
      "version": 2.1,
      "workflows": {
        "build_and_test": {
          "jobs": [
            "build",
            "test"
          ]
        }
      }
    }
    [
        [
            {
                "user": "Dan"
            }
        ]
    ],
    [
        [
            {
                "user": "Bob"
            }
        ]
    ],
    [
        [
            {
                "user": "Sheryl"
            }
        ]
    ],
    [
        [
            {
                "user": "Sarah"
            }
        ]
    ],
    [
        [
            {
                "user": "Sean"
            }
        ]
    ]
    [
      {
        "user": "Dan"
      },
      {
        "user": "Bob"
      },
      {
        "user": "Sheryl"
      },
      {
        "user": "Sarah"
      },
      {
        "user": "Sean"
      }
    ][
      {
        "user": "Dan"
      },
      {
        "user": "Bob"
      },
      {
        "user": "Sheryl"
      },
      {
        "user": "Sarah"
      },
      {
        "user": "Sean"
      }
    ]
  • Click next to Output Configuration to create an output variable. Name the variable options. Every option generator workflow must have an output variable called options, which will contain the context variable that holds the data that you want to display.

  • Click Submit. This will launch the workflow builder.

  • Set up a trigger for the workflow.

  • The Value field will be set to the value of the Field Name when that form is submitted. Workflows will reference this as {{ CTX.<field_name> }}

  • Using the Default Selected Field will evaluate an attribute of the options list for truthiness. Items which evaluate true will be selected by default when this field populates.

  • Create a new workflow
    here
    An example of an options generator workflow for one of our unpacked Crates
    Parameters
    Parameter
    Description
    Required

    List to Transform

    The list of objects you want to transform into a single object. Each item in the list should be a object with key-value pairs.

    Field to use as Key

    The field name from the items in your list that you want to use as keys in your new object.

    Field to use as Value

    The field name from the items in your list that you want to use as values in your new object.

    For nested field names, separate them by dots (e.g., details.age).

    Usage

    The Convert List to Object transform provides a powerful way to reshape your data to meet specific requirements. The ability to define keys and values, including the ability to access nested data, makes it versatile for a range of scenarios. Let's go through a couple of use-case examples to demonstrate how this transform can be applied to your data.

    Example 1: Simple Key-Value Conversion

    Let's assume we have this list of objects called mylist:

    Action Parameters:

    We want to create a new object where the keys are the name field and the values are the age field. We would use the following parameters:

    Jinja2 Equivalent:

    Example 2: Nested Key-Value Conversion

    Now, let's consider a list of objects where some fields are nested:

    Action Parameters:

    In this case, the age field is nested under the details object. So, to create an object where the keys are the name field and the values are the age field nested under details, we would use the following parameters:

    Jinja2 Equivalent:

    Results output

    In both of these examples, your new output object would look as follows:

    This transform is especially useful when dealing with data structures like ConnectWise PSA Custom Fields or Communication Items.

    This happens when the browser blocks your request because it does not allow
    cross-origin
    requests by default.

    To make your webhook accessible from a web page, you must configure CORS (Cross-Origin Resource Sharing) headers and enable OPTIONS requests on your webhook.

    Note that wait for webhook cannot be set to true for this to work

    Add CORS headers to your web hook response

    1. Open your webhook trigger inside the workflow.

    2. Open the response headers.

    3. Add the following headers:

    Important - Match the exact origin of your site.

    ✅ https://bclimer-cors-test.rew.st

    ❌ https://bclimer-cors-test.rew.st/

    Avoid using * unless the webhook is fully public and returns no sensitive data.

    Reference table

    Header
    Description
    Example

    Access-Control-Allow-Origin

    Defines which site may call your webhook

    Access-Control-Allow-Methods

    Lists allowed HTTP verbs

    GET, POST, OPTIONS

    Access-Control-Allow-Headers

    Lists allowed custom headers

    Content-Type

    OPTIONS

    Preflight permission check

    Must return 200 with headers

    Handle OPTIONS preflight requests

    Browsers send an OPTIONS request before certain POST or PUT requests to confirm that CORS is allowed. Your webhook must allow OPTIONS requests for this to succeed.

    Add OPTIONS under the Allowed Methods field of your Trigger Parameters menu in workflow settings.

    Troubleshoot the CORS webhook trigger

    Trailing slash in origin

    Try removing the slash from the end of your domain.

    Missing OPTIONS handler

    Add the OPTIONS method to the webhook.

    here

    Webhook URLs are formatted consistently using the trigger ID and organization ID. The format is as follows: https://engine.rewst.io/webhooks/custom/trigger/{{ Trigger ID }}/{{ Organization ID }}

    Using this information, you can craft webhook links on the fly for organizations where a webhook trigger is enabled. This may be useful for invoking certain workflows using links in a PSA ticket note or email, for example

    Create the workflow

    In the Rewst platform:

    1. Navigate to Workflows > Create.

    2. Enter a workflow name, like My First Webhook Trigger.

    3. Click Submit to proceed to a blank workflow creation screen.

    4. Add a single no-op action to the canvas. Name it BEGIN

    5. Click Publish to save your workflow. No other actions are needed, as you'll just be working with triggers.

    6. Click Add Trigger at the top of your workflow builder.

    Create the trigger

    1. Name your trigger.

    2. Toggle Enable on.

    3. Choose the trigger type Core - Webhook.

    Set trigger parameters

    The following parameters are available for editing:

    • Allowed methods

      • Used to define which HTTP request method is accepted by the trigger. Attempting to send a request with a method not in this list will result in an error

    • Include raw body

      • Whether to include the raw string sent in the request body in the results as raw_body

    • Response body

      • Content to return in response body. {{ REQUEST }} may be used to access request data.

    • Response headers

      • HTTP headers to include in response. {{ REQUEST }} may be used to access request data.

      • TIP: Set your content type here if returning a specific format of data, such as text\html

    • Response status

      • HTTP status to return in response. {{ REQUEST }} may be used to access request data.

    • Secret key

      • Required to Wait For Results. This value must be included in the header as x-rewst-secret when making calls to this webhook. You will receive a 401 if this field is filled out and the secret key is not provided when making the request. Secrets can be defined in the Organization Variables section of the UI

    • Wait for results

      • If true, calls to the trigger endpoint will redirect to a results endpoint that will return the output of the workflow.

    Access data in a webhook trigger request

    When a webhook receives a request, it will include data received in the following schema:

    Data can then be pulled from this as context variables. For example, to access the value for test sent to the webhook as:

    The value can be accessed at {{ CTX.body.test }}.

    Similarly, if a URL parameter is sent as ?test=Hello, this can be accessed at {{ CTX.params.test }}

    Completion handlers and workflow wrappers

    Completion handlers

    Completion handlers are workflows that execute after another workflow has been completed. They provide a mechanism to extend or modify existing workflows without altering their core structure. These workflows have a context variable that can be used to reference previous contexts from the workflow that was completed. Configure completion handlers to either trigger another workflow after the existing one finishes, or execute the current workflow when another workflow is completed.

    You might hear some of our support staff or customers who present on our Open Mics refer to completion handlers as workflow listeners. Listener is a more coding-focused term that they're already familiar with. A completion handler and workflow listener are the same thing.

    Example workflow use cases for completion handlers

    Let's look at a few use cases for using completion handlers:

    • Taking additional steps after the onboarding workflow is complete

      • Add additional functionality to an existing synced workflow without having to unsync it from the template.

    • Alerting for failed workflow executions, like kicking off the completion handler based on a failed status

    Configure a completion handler in a workflow

    1. Navigate to Automations > Workflows.

    2. Locate the existing workflow that you want to address. Click Workflow Completion Handlers.

    3. Note the two options in the Completion Handlers section. You'll need to choose which one you want to use:

    Access the context of the previous workflow

    Contexts from the previously run workflow can be accessed with the COMPLETED_WORKFLOW variable. You can access most info via the context including ORG and CTX such as:

    1. {{ COMPLETED_WORKFLOW.ORG.VARIABLES.cw_manage_company_id }}

    2. {{ COMPLETED_WORKFLOW.CTX.user.username }}

    Completion handlers will always run in the context of the parent organization. If you are taking actions on a suborganization in the workflow, then you must utilize the run-as-organization functionality and overrides set at the completion handler level.

    The organization ID that was used in the previous workflow context can be referenced with the following Jinja:

    {{ COMPLETED_WORKFLOW.ORG.ATTRIBUTES.id }}

    Test completion handlers

    Completion data is hard to fake for testing because it's represented as COMPLETED_WORKFLOW. instead of CTX.COMPLETED_WORKFLOW. Rather than running an entire workflow multiple times to test just this one element, create a that sets the test data, and use it to trigger your completion handler.

    In the noop, set all of the variables that will be used in your completion handler in the On Success transition as data aliases.

    It’s important that the names of the data aliases you create in the On Success transition of the noop match both:

    • the names of the variables that will be used in your completion handler

    • the names of the variables that will be used in the live parent workflow that your completion handler is triggered by

    Add static values that represent a good test case for ensuring that your completion handler functions the way you expect.

    Example

    In the example below, we’ve created a workflow with a single noop. In the On Success transition, we’ve added several data aliases that represent user data that could be used to test a completion handler, which could be used after a user is onboarded or offboarded.

    Once you’ve created the noop and added the correct data, attach this workflow to your workflow completion handler as another parent workflow that will trigger the completion handler. This will enable testing.

    Click Test to run the workflow. This will feed the variables that you’ve set with your completion handler and trigger it to run, allowing you to confirm if the variables are used as expected. If you need to run your test workflow for organizations other than your parent MSP organization, add a trigger to the workflow which will allow you to select which organization the test workflow runs for.

    Alternatively, re-run from the workflow result page of the workflow that kicks off the completion handler. This would still run the workflow in total, but would be a simpler way to achieve it with fewer clicks.

    Workflow wrappers

    Workflow wrapper is an informal term used colloquially by the ROC to describe a situation where a primary workflow is used in a separate workflow as a . Whereas a completion handler only runs when a workflow completes, a workflow wrapper can run before or after completion.

    Example workflow use cases for workflow wrappers

    Let's look at a few use cases for using workflow wrappers:

    • Handle pre and post-onboarding tasks

    • Run a Crated workflow against a group of items, in a way it was not originally designed to do

    Best practices for designing workflows

    These recommendations align with the standards and guidelines that our internal ROC team and service partners follow when building workflows with Rewst. By adhering to these practices, you can leverage the same principles that guide our experts, enhancing the efficiency, reliability, and maintainability of your automation.

    Design principles

    When designing workflows, keep these three guiding principles in mind.

    1. Simplicity: Create workflows that are user-friendly and easy to understand.

    2. Modularity: Break down workflows into smaller, reusable components.

    3. Maintainability: Build workflows that are straightforward to update and maintain.

    Automation build standards

    A good workflow should meet all of these requirements.

    • Consistency: Standardized practices lead to a consistent experience across different workflows.

    • Quality assurance: Adhering to standards makes quality checks more efficient.

    • Reusability: Modular design enables the reuse of components, speeding up development.

    Design, test, and document workflows

    For more on templating in Rewst, see our documentation .

    • Use pre-defined templates to speed up development and ensure adherence to best practices.

    • Develop and test your workflows in a sandbox or development environment. Make necessary changes, test, and sync to your live environment. Always test a workflow before publishing.

    • Document workflows manually or with RoboRewsty to keep track of the intent of each action and subworkflow.

    • When publishing a workflow, document the changes made in that update to help with version control of your workflow.

    Workflow naming and categorization

    Properly naming and categorizing your workflows is essential for clarity and navigation, especially as the number of workflows you use in Rewst grows over time.

    Adhering to a consistent naming convention helps in understanding the purpose and function of each automation.

    Proper example: List Disabled User Accounts

    Improper example: Steve's Workflow

    You can also use within Rewst to organize your automations effectively.

    Manage variables and tasks

    Stay consistent with your styling when naming variables. Choose a naming convention, for example snake_case or camelCase, and apply it uniformly.

    Organization variables

    • Employ descriptive and straightforward wording using snake_case for clarity.

    • Prefix integration-specific variables appropriately, like psa_ for PSA-related variables.

    Work with data aliases

    • Separate complex creation or modification into Set Variable tasks rather than creating them on the actual task doing the API call. This helps with easier troubleshooting should you encounter errors, such as determining if the API is experiencing issues versus if there is a Jinja error in your variable assignment.

    • Separating the data aliases makes debugging easier, allowing you to test your code with real data.

    Work with task transitions

    For more on transitions, see our documentation .

    • Use conditions like {{ SUCCEEDED and CTX.list_of_things|d }} to control the flow based on task success or failure.

    • Transitions are evaluated from left to right, so order them carefully.

    • Follow All/Follow First:

    Limit API field results

    Limiting the API field response to only the data you need helps in building clean workflows that are easy to understand, without overloading your tools.

    • If unsure about the fields you need, consider running the query without any filtering initially. This approach lets you explore the available fields and understand what information is at your disposal.

    • Once you've identified the necessary fields, be sure to limit the response to include only those. For instance, if you're listing users in Microsoft Graph and only require the UPN (User Principal Name) and User's ID, you should select the userPrincipalName and id fields.

    Actions

    What is an action?

    Actions are the operations available for creating and automating, which live inside of a workflow. You grab these actions from the left side menu of the workflow builder, and drag them onto the workflow canvas. When you run a workflow, Rewst is completing a series of actions specified within that workflow. Once an action has been dragged onto the canvas, we refer to that dragged action as a task, to differentiate between a dragged and undragged action.

    Once you've set up an integration, Rewst offers you a number of actions related to that integration to build your workflows. They're accessible from the accordion menus in the left side menu of the workflow builder, and sorted based on their respective sources, including integrations by brand, Core, Rewst, Transform, and Workflow. Expand any accordion to see the related actions it contains.

    The actions menu of the workflow builder

    Each action serves a unique purpose and comes with a brief description to aid in understanding its functionality. Click on any action to begin dragging and dropping it onto your workflow builder canvas. For more on our workflow builder and how workflows are essential to Rewst, see our workflow documentation .

    Click through to any of the related action type pages to learn more.

    Core actions

    These are the essential platform components like webhooks, email dispatching, and .

    Integrations actions

    When you set up an integration in Rewst, it comes with a predefined set of actions, which will appear in your workflow builder action menu. These actions allow you to work with various parts of the integrated product as per its API. Rewst's integrations pull in the most useful and most commonly used actions, but not all available actions. See our for more information on available actions.

    Rewst actions

    These actions are for interacting with your Rewst environment. You can perform tasks such as creating organizations and users, associating with multi-tenanted objects, and setting organization variables.

    Transform actions

    These actions help you shape and modify your data for efficient workflow execution, replacing the need for complex Jinja statements.

    Workflows actions

    These actions allow you to call other workflows within your environment. They enable you to feed information from the parent workflow as inputs and return the results upon completion.

    Generic actions

    For each integration, Rewst provides a single action that isn't predefined like the other integration-related actions, but which can be used to define a URL path. Using that path for the endpoint you wish to reach in the partner's API allows you to specify data, cookies, headers, etc., for custom targeting beyond what Rewst's other predefined actions allow.

    Generic actions rely heavily on your reading the integration's API documentation and researching the endpoints yourself. Most frequently, we suggest this as a feature for more advanced users, though customers with specific goals might be required to use it early on in their onboarding process.

    Generic actions are typically named after the integration in the format of [integration] API Request. For example, for HaloPSA the action is called HaloPSA API Request .

    Note that the paginate request option in any generic action modifies how the request is formed. This can cause issues on the API's side, causing them to behave unexpectedly and return error messages.

    Known actions issues and errors

    This collection of issues related to actions have been reported to Rewst by our customers. If you experience an issue with actions that is not in this list, contact us in your dedicated Discord support channel.

    Click on any of the issues below to expand and see its solution or information.

    Brave browser

    Brave browsers will block the click event on Rewst actions. This is due to the way that Brave handles the click event. To fix this, you can either , or use a different browser.

    ThreatLocker

    We have received reports that ThreatLocker may block certain Rewst actions. Threatlocker has a built-in application for Rewst IP addresses that can be added to your Ringfence policy.

    To set this up in ThreatLocker:

    1. Navigate to Modules > Application Control.

    2. Click Policies.

    UnreachableJoinError: The join task|route "XXXXXXX" is partially satisfied but unreachable.

    This error is related to having multiple transitions going to a single action.

    1. Click the Advanced tab within the action that has multiple transitions going to it.

    2. Under the field Task Transition Criteria, you'll likely have a 0. This means that all actions previously have to be complete before that action will run.

    Data input and output: Input variables and context variables

    To understand this topic, you'll first need to learn the difference between an input and an output.

    An input is information that will be put into Rewst automations. This could be the contents of a form, or information sent via integration, for example. Knowing what your input is will help you determine what to use when crafting your automations.

    An output is the expected result of the automation.

    Workflow input: Input variables

    Workflow inputs are commonly known as input variables. The role of input variables is to provide data that can be used by tasks within the workflow, or into a subworkflow.

    Input variables can be broken down into two parts:

    1. A key

    2. The specific data or values that vary

    This is an example of a variable where [first_name] is the key and Ashley is the value:

    [first_name] : "Ashley"

    Input variables can only be modified or added on the source workflow, not clones of workflows unpacked from Crates.

    You can add new variables, or modify existing ones, by navigating to your Workflow > Configure Workflow Settings > Input Configuration.

    Click + next to Input Configuration to see a number of new fields.

    1. Name: This can be a unique entry relevant to what the aim of the input is going to be. This should not contain spaces.

    2. Label: This text field is used to set a friendly name. It's the field name visible at the time of input.

    3. Type: Short for data type, this field defines what format the data will be in. The most common types are Text (general string), Integer (whole number), and String (a combo of characters).

    Input variables get their values in a Rewst workflow through the workflow's initial trigger event. Any data type that is valid in JSON can be used as an input variable.

    Workflow action inputs

    When variables are created within the workflow, they become , and can be used directly in action inputs.

    Recall from your Cluck University training that the context is where all data generated, captured, or used in a workflow is stored.

    In the example below, creating a user in Microsoft 365 using three variables:

    1. First Name

    2. Last Name

    3. Domain

    For now, these are all specified directly on the workflow rather than being submitted via a form.

    Create an action by dragging it from the integration list on the left menu.

    Click on this action to reveal a number of input fields on the right-hand side.

    Click to the right of the field to open up a Monaco editor, the same type that VSCode uses. Learn more about the .

    In the image below, see how to use the variables by using CTX, which stands for context, and then the name of the variable. This will autocomplete to make it easier to reference.

    Despite the data being static at this point, the process is the same regardless of where the data is coming from.

    Workflow output

    Similarly to the above, you can configure an output of a workflow. These are generally used in two situations:

    1. In an workflow, the output is what is passed through to the form. For example, if you have a workflow that lists users in a variable called {{ CTX.users }} - you would configure an output variable of options mapped to this variable, as per the below image. This then, in the form, would list the users in a dropdown field. This is how dynamic data works in form - more about that in .

    1. The other time this would be used is if you have a sub-workflow. A sub-workflow is no different from a standard workflow, except for the fact it lives within another workflow. If you were passing data back from the sub-workflow into the main workflow, this would be done via an output variable.

    Workflow action outputs

    One of Rewst's ultimate purposes is to integrate various platforms into a workflow and use data from each to do something else.

    In this example, you'll get a list of users where the userPrincipalName matches X, then create a ticket using information from that request.

    First, take the action of List Users from the Microsoft Graph integration in the action menu of the workflow builder. There are no inputs required here, and it will list every user on the tenant that it is integrated with, or that the is set for.

    If you ran this action as-is, you would get the list of users, but wouldn't be able to use that data anywhere.

    This is where come into play.

    Click the On Success transition on the action. This gives you the option to create a .

    A data alias allows you to create a variable, similar to an input variable, but with data direct from an action API request. In our example below, we are creating a variable with the key called user_details and populating it with the data of the user using Jinja.

    Take your create_ticket action from your respective PSA from the actions menu of the workflow builder. In this example, we'll use Datto PSA.

    Using your newly created data alias, add the inputs onto that create_ticket input.

    This would create a ticket with the title User Exists [email protected].

    Customize PSA ticket triggers

    Introduction

    In Rewst, setting specific trigger criteria for PSA Ticket triggers can be crucial to ensuring that workflows are initiated only under certain conditions. This page provides a step-by-step approach to customizing these triggers.


    Getting Started with Trigger Setup

    Create the workflow

    In the Rewst platform:

    1. Navigate to Workflows > Create.

    2. Enter a workflow name, like My First Webhook Trigger.

    3. Click Submit to proceed to a blank workflow creation screen.

    4. Add a single action to the canvas. Name it

    Create the trigger

    1. Name your trigger.

    2. Toggle Enable on.

    3. Choose the trigger type relevant to your particular PSA ticket system:

      1. ConnectWise PSA: Ticket Record Saved.

    The trigger is now active and will capture data when a new ticket is submitted. This screen is listening for your ticket records to be saved, and will show you live results as they come in.


    Testing the Trigger with a PSA Ticket

    To see the trigger in action follow the below steps

    Creating a Test Ticket

    • In your PSA system, create and classify a new ticket with desired criteria.

    • Submit the ticket.

    • You should see the ticket record appear in Rewst.

    Once the ticket is visible in Rewst, click the pause button to stop more tickets from coming in while you're building your trigger criteria.

    Selecting Criteria

    Find and click the values in the ticket you want as trigger criteria. They will have their corresponding path entered into the Trigger Criteria on the right.


    Finalizing and Implementing Trigger Criteria

    Saving Your Criteria

    • After selecting all desired criteria, click Save then Close.

    • Your trigger criteria are now set and visible.

    Applying Criteria to Workflows

    • Copy these criteria values.

    • Paste them into other workflows you are configuring.


    Conclusion

    This process allows for precise control over when your workflows are triggered, enhancing the automation's effectiveness. Experiment with different criteria to tailor your workflows to specific needs.

    Advanced workflow operations menu

    This document assumes that you've mastered earlier workflow building concepts from Cluck University and our introduction to the workflow builder here. If you haven't yet completed that reading, come back to this page later.

    These operations can be found inside each task's Advanced tab.

    Integration overrides

    For more on integration overrides and how to use them, see our documentation .

    Add an integration override by clicking . This will expose a new submenu for Configuration Selection Mode.

    Transition modes

    Transition modes in Rewst are responsible for determining how transitions attached to a workflow action are followed. There are two primary modes:

    • Follow All: This is the default mode. If your task has multiple conditions attached, the Follow All mode attempts to follow all of the specified transitions. In the workflow visualization, this mode is represented by the standard color blue.

    • Follow First: In this mode, conditions are evaluated from left to right and as soon as the first condition is satisfied, the remaining conditions are disregarded. To differentiate these transitions in the workflow visualization, they are color-coded orange.

    Task transition criteria sensitivity

    This setting is used to indicate how many parent tasks need to be satisfied. For example, 0 would indicate all tasks. If the workflow has two tasks with arrows pointing to a third task, that sensitivity is the number of tasks above it which need to be complete before it runs. This is particularly important when building workflows that contain .

    Run as org

    The Run as Org option allows the workflow action to run in the context of another organization.

    You can only run as org going from a parent organization to child organization. The workflow will fail when attempting to run as the parent organization, when the workflow is running in the child organization context.

    The purpose of Run as Org is to temporarily pass the execution of a workflow task into the context of another organization. This is something you may see done when you have a task— be it an individual action or a subworkflow— that needs to be executed as if it were for a different org than the one the workflow is running for.

    For example, if you wanted to have something run once for the parent organization that needed to also reference items for a child organization, a Run as Org option would solve this issue. Start by listing all organizations. Then, using Run as Org on a subworkflow, do things within that subworkflow for one or many of your managed organizations.

    Or, when a form has an organization picker on it, where the organization ID is passed into the workflow from the form, Run as Org is used to have the actions in the workflow run as if they were for the selected organization, instead of the organization for which the form was loaded.

    With items

    With Items is the equivalent to a foreachstatement in other languages.

    With this, you can pass a number of objects into a certain action and collect the results from each and then do something.

    When using with items in Rewst, it's important that you make the name of the task unique, and different from any other task name in that workflow.

    In the example below, you're going to list every user that is enabled in the child organization, and create or update a contact for each one.

    List all enabled users, then output this to a data alias called

    The data alias has the following Jinja:

    You then have a subworkflow that creates or updates a contact. As per the best practice, use a subworkflow with your With Items.

    In the Advanced tab, set the With Items field with this data alias.

    The action now has the additional icon indicating that it has a With Items set on it.

    During testing, or for example if creating tickets from an alert, you may sometimes want to limit the amount of alerts you get during this phase. Test the workflow on a subset of your total users initially to make sure it works as expected.

    To achieve this, you could create an input variable on the workflow called max_tickets_to_create_per_actionand set it to the maximum number of times you want that With Items to run.

    If set to 1, it will only run on a single object within CTX.all_users.

    The below code is what you would use in the With Items field in the Advanced tab.

    Use inputs after creating With Items

    Iterating through CTX.all_users on the action means you can't use {{ CTX.all_users.X }} as the property for the input.

    Instead, you must use {{ item() }}

    Say you want to get the first name of each user as an input. On your With Items action you would execute:

    Items concurrency

    If you're running a workflow task using With Items, this allows you to set how many of these processes run at the same time. It's recommended that no more than 10 concurrent actions be performed at a time to guarantee performance.

    Task timeout

    This allows you to adjust the number of seconds to wait for a task to complete. The default value is 10 minutes.

    Shallow clone a workflow

    Shallow cloning is a feature of the Rewst platform that allows you to create a copy of an existing workflow or form. This is useful if you have a workflow that is very similar to another workflow, but which requires a few small changes.

    Standard cloning copies the entire resource pack— workflow, forms, templates, triggers, etc— and when cloning into your own org, you end up with multiple duplicates of the same resource. Shallow cloning copies that single selected resource, but re-uses all of the dependencies that it has. If you have a sub-workflow that's part of a main workflow, and you shallow clone that sub-workflow, you will end up with a copy of the sub-workflow. This lets you make changes to the sub-workflow without affecting the original workflow.

    There is no difference between the steps to clone or shallow clone a resource. Rewst will automatically detect if you are cloning something into your own org. If so, the platform will shallow clone it instead. Note that this removes the Synchronize button on the dialog, and instead shows a text to explain.

    Append with items results transform action

    Seamlessly integrate "With Items" task results into your original list.

    Use case

    You're dealing with nested data structures and need to extract results from tasks ran With Items into your original list. You want a unified, easy-to-manipulate list that includes all necessary data.

    Overview

    The Append With Items Results transform enables effective incorporation of "With Items" task results into your original list. It bridges the gap between the collected results and the original list, making your data manipulation tasks simpler and more efficient.

    Parameters

    Parameter
    Description
    Required

    Usage

    The below scenario will attempt to illustrate how the Process With Items Results transform can be utilized to simplify With Items results collection.

    Input lists

    Assume we have a base list called base_list:

    And we ran a With Items task against this list to collect additional data from these items that's stored in a new list called collected_list that includes result.result attributes like this

    Action parameters:

    We want to extract the result.result list from each item in the collected_list and append it to each corresponding item in the base_list as a new attribute named hobbies.

    Jinja2 equivalent:

    Results output

    After processing, your results will look like this:

    Remember to carefully specify your Collected List, Base List, and Attribute Name to ensure a successful transformation.

    Troubleshoot workflow executions and task results

    If the issue involves another platform like your ,, or email system, check that platform's documentation or status page for recent changes or requirements.

    Workflow executions for troubleshooting

    Select attribute transform action

    Use case

    While reviewing a list of users returned from Microsoft Graph, you need to get a list of the users who have a accountEnabled attribute value set to true .

    Templates and scripts

    Templates and scripts are similar features in Rewst, though each is intended for a different purpose. Once created, they're separated by type into two sections in the platform for ease of organization and sorting. Both can be referenced in workflows.

    What is a template?

    Templates are used to create a standardized set of text used in several places in Rewst. For example, if you want to create a ticket and always use the same HTML for the ticket description, you would create a template. In the input, you would reference the template instead of having to type that same text each time.

    Sort transform action

    Use case

    You are listing users from Microsoft Graph and you would like to sort the result alphabetically based on their displayName attribute.

    Overview

    mylist: [
      {
        name: "John",
        age: 30,
        hobbies: ["golf", "reading"],
      },
      {
        name: "Mary",
        age: 35,
        hobbies: ["cooking", "music"],
      },
    ]
    key_field: name
    value_field: age
    {% set new_object = {} %}
    {% for item in mylist %}
      {% set _ = new_object.update({item['name']: item['age']}) %}
    {% endfor %}
    
    
    mylist: [
      {
        name: "John",
        details: {
          age: 30,
          occupation: "Engineer"
        },
        hobbies: ["golf", "reading"],
      },
      {
        name: "Mary",
        details: {
          age: 35,
          occupation: "Doctor"
        },
        hobbies: ["cooking", "music"],
      },
    ]
    key_field: name
    value_field: details.age
    results: {
      "John": 30,
      "Mary": 35
    }
    {
    "Content-Type": "application/json",
    "Access-Control-Allow-Origin": "https://YOURDOMAINHERE",
    "Access-Control-Allow-Methods": "POST, GET, OPTIONS",
    "Access-Control-Allow-Headers": "Content-Type"
    }
    {
        body:{},
        headers:{},
        method:"",
        params:{},
        timestamp:""
    }
    {
        "test": "Hello, World!"
    }
    Scalability: Design your workflows to handle increased complexity as your needs grow.
  • Efficiency: Avoid redundancy by following a standardized approach.

  • Knowledge Transfer: Standards foster collaboration and knowledge sharing within your team.

  • Flexibility: Rewst's standards allow easy integration of new features without major rework.

  • Follow All: The task will follow every path that meets the criteria.

  • Follow First: The task will follow the first criteria that it matches and then stop. Use this when you expect only one condition to be met or when, as soon as a condition is met, you do not want the process to use other workflow branches.

  • here
    tags
    data alias
    here
    BEGIN
    . Click
    Publish
    to save your workflow. No other actions are needed, as you'll just be working with triggers.
  • Click Add Trigger at the top of your workflow builder.

  • Datto PSA: Ticket Webhook

    1. Note: Ensure that webhooks are enabled as per Rewst Documentation.

  • Halo PSA: New Ticket Record.

  • Click on the graph button under the Trigger Criteria section.

  • no-op
    https://your-frontend-domain.com
    Default Value: You can specify a value that will be used if no other input is specified manually.
  • Description: You can give a better description of what the field is used for.

  • Context Variables
    code that Rewst uses, called Jinja, here
    Options Generator
    types of workflows
    trigger
    Transitions
    data alias
    An example of an input variable, using static data
    here
    subworkflows
    Note the two different colored transitions arrows

    Base List

    This is the main list to which you want your collected results to be appended.

    Collected List

    This is the list of results from your completed With Items task, from which the nested result.result attribute will be extracted.

    Attribute Name

    This is the name you'd like to set for the new attribute to be appended to the Base List.

    {% set new_object = {} %}
    {% for item in mylist %}
      {% set _ = new_object.update({item['name']: item['details']['age']}) %}
    {% endfor %}
    
    
    {{ CTX.first_name }}
    {{ CTX.last_name }}
    {{ CTX.domain}}
    {{ [ user for user in TASKS.m365_list_users.result.result.data.value if user.userPrincipalName == "[email protected]" ] }}
    User Exists {{ CTX.user_details.displayName }}
    {{ CTX.all_users }}
    {{
      [
        user
        for user in TASKS.m365_list_users.result.result.data.value
        if user.enabled
      ]
    }}
    {{ CTX.all_users[:CTX.max_tickets_to_create_per_action | int] }}
    {{ item().firstName }}
    base_list: [
      {
        name: "John",
        age: 30,
      },
      {
        name: "Mary",
        age: 35,
      },
    ]
    collected_list: [
      {
        result: {
          result: ["golf", "reading"]
        }
      },
      {
        result: {
          result: ["cooking", "music"]
        }
      },
    ]
    base_list: base_list
    collected_list: collected_list
    attribute_name: hobbies
    {% set normalized_list = [item.result.result for item in my_collected_list] %}
    {% for list_item in normalized_list %}
      {% do my_base_list[loop.index0].update({'hobbies': list_item}) %}
    {% endfor %}
    results: [
      {
        name: "John",
        age: 30,
        hobbies: ["golf", "reading"]
      },
      {
        name: "Mary",
        age: 35,
        hobbies: ["cooking", "music"]
      },
    ]
    Run this workflow when...
    1. This will run the workflow when another workflow completes

  • When this workflow completes...

    1. This will result in something being done when the workflow completes

  • Define your trigger conditions. This step will differ depending on which of the two options you chose in step 3.

    1. For When this workflow completes...

      1. Click to choose the workflow to trigger.

      2. Under Trigger On Statuses, specify the conditions for the trigger, such as succeeded, failed, timed out, or canceled. You can select multiple statuses from the drop-down list.

    2. For Run this workflow when...

      1. Click to choose the workflow to trigger.

      2. Under Trigger On Statuses, specify the conditions for the trigger, such as succeeded, failed, timed out, or canceled. You can select multiple statuses from the drop-down list.

  • Make sure Enabled is toggled to on.

  • Click Submit to save your settings.

  • noop action
    subworkflow
    An example Add Completion Handler dialog for the When this workflow completes... option
    An example Add Completion Handler dialog for the Run this workflow when... option
    Screenshot of the Rewst workflow editor showing a single step labeled core_noop. The transition panel on the right displays options to edit the transition, including setting a custom label, moving the step left or right, and selecting a condition (On Success, On Error, Always, or Expression). Below that, a section titled "Data Aliases" shows several variables being mapped: first_name to "Listener", last_name to "Testing", email to "test@rewst.io", license to "Microsoft Business", and password to "RadicalMongoose123!". Each alias has controls for reordering and deleting. A "Sub-Workflow" node is partially visible at the bottom.
    The noop action, its On Success transition, and the corresponding data aliases
    Screenshot of a Rewst workflow editor showing a step titled core_noop with an "On Success" transition. On the right, the "Edit Transition" panel is open, allowing users to add a custom label, move the step left or right, and set a condition (Success, Error, Always, or Expression). Several data aliases are configured, mapping variables like first_name, last_name, email, license, and password to static values. At the top of the screen, multiple icons are visible, and a red arrow highlights the "Show Workflow Variables" icon, which resembles two stacked squares with a connected line between them. The workflow is titled "Listener Test."
    The location of the button
    Screenshot of the "Listener Test" workflow configuration in Rewst. The tab "When this workflow completes..." is selected, showing a section titled "Workflows listening for the completion of this Listener Test workflow." No workflows are currently listed. Columns for trigger conditions include: On Succeeded, On Failed, On Timeout, and On Canceled. An orange arrow points to a teal plus (+) icon in the Actions column, indicating where users can add a new workflow listener. The bottom portion of the screen shows the workflow canvas and the "Edit Transition" panel with controls for labeling and positioning transitions.
    Click + to attach the workflow to the workflow completion handler

    Select PowerShell Ringfencing Policy.

  • In the Actions section, click Tags.

  • Add Rewst.

  • This process may not be necessary if you have already whitelisted our outgoing IP addresses, but it's something to consider if you run into any issues. Additional steps for whitelisting in ThreatLocker are outlined in this linked document.

  • Change this to the relevant number. For example, change to a 1 so that only one of the previous actions must complete before that action runs.

  • In the image above, the workflow chooses the RMM of the client. Then, depending on the result, it runs a script on that system. The client likely isn't going to have multiple RMMs, so only one of the script tasks is going to run.

    However, they all merge into the final compile_results task at the bottom. By default, this workflow will fail, as it is expecting each script task to complete before hitting that final task.

    This is where you would change the Task Transition Criteria Sensitivity to a 1. This states that only one of the tasks that come into it must have been completed.

    If there was a workflow where you wanted to run on two instances then you would enter 2, for 2 tasks to be completed.

    here
    noops
    Core actions
    individual integration setup pages
    Integrations
    Rewst actions
    Transform actions
    Workflows actions
    disable the Brave shield for the page
    The HaloPSA generic action

    See our documentation for how to view workflow results here.

    To learn the fundamentals of troubleshooting in Rewst, sign up for our course in Cluck University.

    • Use the organization-level view to see all workflow executions for one organization.

    • Use the workflow-level view to focus on one workflow across all organizations.

    • Both paths lead to the Workflow Execution Summary, where troubleshooting begins.

    How to read the workflow execution summary

    The inputs and context sections tell the story of what data your workflow received and what the workflow did with that data. Learning to scan these two areas quickly is one of the most important skills in Rewst troubleshooting.

    • The Inputs section shows the raw data that entered into the workflow, usually via form, webhook, or parent workflow.

    • The Context section shows variables created or passed between tasks. Context variables can change over the execution of the workflow, and each new iteration of variables will be in this list in chronological order.

    • Common issues which lead to failed workflow tasks include typos, casing mismatches, missing values, or broken Jinja.

    Task results

    Task results give you a detailed view of what happened in a workflow, and why something may have failed. By learning to read the request, the response, and the task logic, you can identify the issue and know where to take action next.

    Task results display two key pieces of information:

    • The request Rewst sent—such as a JSON payload or API call to an integration

    • The response that came back—typically with a status code and message body

    Reading both helps you determine if the failure came from your setup, your data, or the external system.

    How is data stored in context?

    • {{ RESULT.result }} stores a specific part of the task’s output, often the core data value.

    • Publish result as saves the full response object to a named key in a context variable.

    • These outputs can be reused in later tasks through Jinja. For example, by using Publish result on one task to create the context variable user_list, you can reference that tasks's output on a future task with the Jinja syntax {{ CTX.user_list }}.

    Most common task failures

    Failure type
    What the failure means
    How to resolve the issue

    Jinja error

    Rewst couldn’t evaluate the task due to bad syntax, missing data, or invalid filters

    Use the live context editor to test the Jinja expression and verify available values

    Integration not authorized

    401 or 403 errors mean the integration is either not connected or lacks permissions

    Recheck integration settings and scopes. If you change permissions in the external tool, reauthorize the integration in Rewst to apply the updates.

    Request rejected by API

    404, 405, or other 4XX/5XX errors mean the request structure is incorrect—or you may not have access to view the item being requested

    Compare the request to the integration’s documentation—check the endpoint path, HTTP method, and resource IDs

    200 OK, but no result

    The request was accepted, but didn’t return useful data. This may mean no results matched the query, or the operation isn’t designed to return a response

    Use contextual tools to troubleshoot your workflow

    Rewst gives you three powerful tools: the live editor, which lets you test Jinja expressions using real context data without re-running the full workflow, the re-run button, which lets you re-run the full workflow using the same inputs, and the test button, which offers a quick way to demo the workflow.

    Use the live editor when:

    • You’re troubleshooting a Jinja error

    • You’re checking if a context variable exists or is formatted correctly

    • You want to preview loops, filters, or logic before adding it to a workflow

    • You need to manipulate or explore context safely without running the workflow

    Use the test button in the workflow editor when:

    • You’re building or editing a workflow

    • You want to test changes as you go by running a true execution, not just testing data

    • You need a fast feedback loop while adjusting tasks

    Use the re-run button when:

    • You’ve fixed something and want to confirm the outcome

    • You’re testing workflows with consistent inputs like forms or webhooks

    • You want to validate that a change resolved the issue end-to-end

    If you do plan to re-run the workflow but want to avoid unintended changes, take steps to isolate it for safe testing. That might include:

    • Temporarily commenting out tasks that make changes

    • Using a test org or test input values

    • Adding conditional logic to skip sensitive steps during testing

    Know when to escalate your failure to Rewst support

    This four step model is introduced and outlined in our Cluck University training. For details on these steps with visual examples, see our course Troubleshooting in Rewst.

    Remember to ask yourself the following questions while troubleshooting your results.

    1

    Where did it run?

    Check the org-level vs. workflow-level execution. Use the graph icon or Automations > Results.

    2

    What data came in?

    Review the Inputs section to confirm trigger values or parent workflow data were passed correctly.

    3

    What was created in context?

    Open the Context tab and look for expected variables. Check for typos, nulls, or casing mismatches.

    4

    What failed, and why?

    Click into the failed task. Read the error message and check:

    • Jinja issues

    If you've dealt with each of these points and still can't resolve the issue, escalate to Rewst's support team. Include the following in your ticket:

    • The org and workflow name

    • A link to the Workflow Execution Summary

    • Task result screenshots

    • What you've tried so far

    Support will be able to help you faster, and with fewer back-and-forth steps.

    RMM
    PSA
    Overview

    This action filters a sequence of objects by applying a test to the specified attribute of each object, and only selecting the objects where the test succeeds.

    Parameters

    Parameter
    Description
    Required

    Attribute

    The attribute of an object in the list that you would like to select if the condition is true. If nested, please use dot notation.

    Comparison Operator

    Test used for selecting matches. For information on the tests see .

    List

    This is the list to run select attribute against.

    Value to Compare Against

    The value to compare the attribute against, this is required for most tests but tests such as true, false, defined, undefined do not require it. If a value is supplied and not needed it will be ignored.

    For nested field names, separate them by dots (e.g., details.age).

    Usage

    Example: List Input
    Example 1: Return Users With Odd Ages

    Inputs:

    Attribute: result.result.data.age

    Comparison Operator: odd

    List: See Example: List Input

    Value to Compare Against: None

    Example 2: Return Users With Age Greater Than or Equal to 30

    Inputs:

    Attribute: result.result.data.age

    Comparison Operator: ge

    List: See Example: List Input

    Value to Compare Against: 30

    Results output

    The expected output for this transform is a list of objects that tested true.

    Example from Example 1:

    Example from Example 2:

    To access templates, navigate to Automations > Templates in the left side menu of your Rewst platform.

    Write templates in either Markdown or HTML language.

    Create a template

    1. Click + Create.

    2. Fill in the relevant fields with the information for your template.

      1. Name

      2. Description

      3. Tags

    3. Select the language you want to write your template in from the Language drop-down selector.

    4. Click into your Editor panel on the left side of the screen to begin writing. View your progress in the Preview panel.

    5. Scroll down and click Submit when finished.

    An example of an in-progress template, written in Markdown

    Templates and Jinja

    While templates are written in HTML or Markdown, they can accept small elements of Jinja to set up the use of templates elsewhere in Rewst. Templates allow for context variables to be set within them, which can then be referenced in workflows to allow the eventual sent message to populate with dynamic information.

    In the example below, you're sending an e-mail to a new user that has been created.

    In the input for the Send Mail action, you would enter {{ template("<template-id>")}} into the action's Message field instead of typing out the intended message manually. This would pull your pre-written template into the body of the email when it is sent.

    The template ID can be taken from the URL, when editing the template. As an example, let's look at the URL below.

    The part of the URL underlined in yellow is the template ID. For this particular ID, your Jinja would read as {{ template("768f5d45-5fe7-4c1f-b2c1-932dcbdcb1d7") }}.

    What is a script?

    Scripts in Rewst enable you to write scripts in a straightforward and accessible manner compared to traditional programming languages. Scripting tasks can range from batch processes on a local computer to generating dynamic web pages on a web server. Scripts can be written, edited, and executed more quickly and easily than software programs.

    To access scripts, navigate to Automations > Scripts in the left side menu of your Rewst platform.

    Write Rewst scripts in any of the following languages: PowerShell, Python, YALM, Jinja.

    Create a script

    1. Click + Create.

    2. Fill in the relevant fields with the information for your script.

      1. Name

      2. Description

      3. Tags

    3. Select the language you want to write your script in from the Language drop-down selector.

    4. Click into your Text panel to begin writing.

    5. Scroll down and click Submit when finished.

    Export and import templates and scripts

    You can export a template or script to share with other Rewst customers, or create your own hard copies of template and script backups. To export a template or script as a JSON bundle, next to your relevant template or script in its total list.

    To import a template or script bundled as a JSON file, click in the top right navigation bar of the list page. Then, drag and drop your file into the upload dialog that appears.

    Given an iterable, return a new sorted list from the items in the iterable.

    Parameters

    Parameter
    Description
    Required

    Attribute

    When sorting a list of dictionaries, an attribute or key to sort by. Can use dot notation like "address.city".

    Case Sensitive

    When sorting strings, sort upper and lower case separately.

    Input List or String

    List or string to sort

    Reverse Sort

    If true, will sort in descending order instead of the ascending order.

    For nested field names, separate them by dots (e.g., details.age).

    Usage

    Example 1: Sort Users By ID

    Inputs:

    Attribute: age

    Case Sensitive: false

    Input List or String:

    Reverse Sort: false

    Example 2: Sort A List of Numbers

    Inputs:

    Attribute: age

    Case Sensitive: false

    Input List or String:

    Reverse Sort: false

    Results output

    Results of example 1:

    Results of example 2:

    A screenshot of the sort transform action, seen in the actions list menu of the workflow builder canvas.

    Parse CSV transform action

    Use case

    You have received a return with a string in CSV format and you would like to convert this to a list of JSON objects.

    Overview

    Parse CSV Data into JSON. The first line will be keys, and subsequent lines will be values.

    Parameters

    Parameter
    Description
    Required

    Usage

    Example: Convert CSV to JSON

    Inputs:

    Delimiter: ,

    String Contents:

    Results output

    Result of Example:

    Workflows

    What is a workflow?

    Workflows, made up of and , are the main component of Rewst's automated business processes. They gather relevant data from integrated tools such as a PSA or RMM, process it using conditional logic, and execute automated actions relating to that data. Workflows are the key to unlocking automation in Rewst.

    contain pre-built workflows. Workflows can also be built from scratch, or edited to match your custom needs.

    Merge lists transform action

    Blend two input lists into one using a shared identifier.

    Use case

    You're faced with two separate lists of data that need to be combined based on a common attribute. You require a merging method that mimics SQL JOINs.

    Overview

    Diff lists transform action

    Identify the differences between two input lists.

    Use case

    You need to compare two lists and highlight the unique entries or entries exclusive to the first list, A transformation action that simplifies this complex comparison process is required.

    Options filter: Filtering in forms

    What is options filter?

    The options filter makes customizing fields within forms straightforward for those who want to add filtering without updating an options generator workflow. It takes inputs, filters them, and produces an output agnostic of the data source.

    Options filter works for the following form field types:

    Trigger criteria

    Trigger criteria are a set of conditions that determine whether a workflow should start. A condition can be a simple comparison of two values, a complex set of conditions, or even a Jinja-based query. In simple terms, you're setting up the automation to only trigger when certain conditions are met or values are present. This can be helpful to customize when you want a workflow to run. For example, rather than having it run for all incoming tickets, you would use trigger criteria to set a workflow to run for just tickets related to password reset requests.

    The trigger criteria section of the trigger menu will only appear after you've chosen a trigger type that works with criteria. This includes triggers and any tool-specific trigger.

    Trigger criteria submenu

    [
      {
        "result": {
          "result": {
            "data": {
              "age": 20,
              "bool": true,
              "username": "amorton"
            }
          }
        }
      },
      {
        "result": {
          "result": {
            "data": {
              "age": 25,
              "bool": true,
              "username": "bmorton"
            }
          }
        }
      },
      {
        "result": {
          "result": {
            "data": {
              "age": 27,
              "bool": false,
              "username": "cmorton"
            }
          }
        }
      },
      {
        "result": {
          "result": {
            "data": {
              "age": 30,
              "bool": false,
              "listah": [],
              "username": "dmorton"
            }
          }
        }
      },
      {
        "result": {
          "result": {
            "data": {
              "age": 22,
              "bool": true,
              "username": "emorton"
            }
          }
        }
      },
      {
        "result": {
          "result": {
            "data": {
              "age": 29.99,
              "bool": null,
              "username": "fmorton"
            }
          }
        }
      }
    ]
    [
      {
        "result": {
          "result": {
            "data": {
              "age": 25,
              "bool": true,
              "username": "bmorton"
            }
          }
        }
      },
      {
        "result": {
          "result": {
            "data": {
              "age": 27,
              "bool": false,
              "username": "cmorton"
            }
          }
        }
      }
    ]
    [
      {
        "result": {
          "result": {
            "data": {
              "age": 30,
              "bool": false,
              "listah": [],
              "username": "dmorton"
            }
          }
        }
      }
    ]
    Hi {{ CTX.first_name }},
    
    Welcome to Rewst!
    
    Your email account has been provisioned and you should be able to access it at:
    https://outlook.office.com/mail/
    
    username: {{ CTX.email }}
    password: {{ CTX.password }}
    
    We're excited to have you on the team!
    [
    	{
    		"id": 6,
    		"name": "Dan6",
    		"favorite_letter": "a"
    	},
    	{
    		"id": 2,
    		"name": "Dan2",
    		"favorite_letter": "c"
    	},
    	{
    		"id": 4,
    		"name": "Dan4",
    		"favorite_letter": "g"
    	},
    	{
    		"id": 1,
    		"name": "Dan1",
    		"favorite_letter": "B"
    	},
    	{
    		"id": 3,
    		"name": "Dan3",
    		"favorite_letter": "z"
    	},
    	{
    		"id": 5,
    		"name": "Dan5",
    		"favorite_letter": "A"
    	}
    ]
    [83, 42, 36, 30, 15, 54, 68, 30, 29]
    [
      {
        "id": 1,
        "name": "Dan1",
        "favorite_letter": "B"
      },
      {
        "id": 2,
        "name": "Dan2",
        "favorite_letter": "c"
      },
      {
        "id": 3,
        "name": "Dan3",
        "favorite_letter": "z"
      },
      {
        "id": 4,
        "name": "Dan4",
        "favorite_letter": "g"
      },
      {
        "id": 5,
        "name": "Dan5",
        "favorite_letter": "A"
      },
      {
        "id": 6,
        "name": "Dan6",
        "favorite_letter": "a"
      }
    ]
    [
      15,
      29,
      30,
      30,
      36,
      42,
      54,
      68,
      83
    ]
    Select your relevant integration or integrations from the drop-down selector.
  • Open each selected integration's accordion menu to choose your Configuration Selection Mode for that integration.

  • Jinja's documentation here

    Delimiter

    Character or sequence of characters to used as a delimiter in the CSV (default is ), such as '|';':', etc.

    String Contents

    Input the CSV formatted string you would like to convert to JSON.

    A screenshot of the parse csv transform action, seen in the actions list menu of the workflow builder canvas.
    Index,Name,Description,Brand,Category,Price,Currency,Stock,EAN,Color,Size,Availability,Internal ID
    1,Compact Printer Air Advanced Digital,Situation organization these memory much off.,"Garner, Boyle and Flynn",Books & Stationery,265,USD,774,2091465262179,ForestGreen,Large,pre_order,56
    2,Tablet,Discussion loss politics free one thousand.,Mueller Inc,Shoes & Footwear,502,USD,81,5286196620740,Black,8x10 in,in_stock,29
    3,Smart Blender Cooker,No situation per.,"Lawson, Keller and Winters",Kitchen Appliances,227,USD,726,1282898648918,SlateGray,XS,in_stock,70
    4,Advanced Router Rechargeable,For force gas energy six laugh.,Gallagher and Sons,Kitchen Appliances,121,USD,896,3879177514583,PaleGreen,L,discontinued,31
    5,Portable Mouse Monitor Phone,Feeling back religious however author room scientist.,Irwin LLC,Kids' Clothing,1,USD,925,9055773261265,SeaShell,100x200 mm,discontinued,10
    6,Radio,Character prove growth contain serious customer.,"Benjamin, Nelson and Hancock",Skincare,426,USD,549,1150028980156,CornflowerBlue,30x40 cm,pre_order,60
    7,Ultra Projector Oven Thermostat Prime Advanced,Pattern possible look necessary indicate work nearly.,"Mccoy, Waters and Rose",Laptops & Computers,68,USD,870,5029747624534,Purple,S,discontinued,86
    8,Webcam Stove Grill,Deep area join carry age.,Morrow and Sons,Automotive,159,USD,584,9883725074294,MediumOrchid,8x10 in,pre_order,50
    9,Eco Radio,Know father for act let.,"Edwards, Odonnell and Conley",Skincare,454,USD,499,1773215338624,DimGray,Medium,pre_order,88
    [
      {
        "EAN": "2091465262179",
        "Name": "Compact Printer Air Advanced Digital",
        "Size": "Large",
        "Brand": "Garner, Boyle and Flynn",
        "Color": "ForestGreen",
        "Index": "1",
        "Price": "265",
        "Stock": "774",
        "Category": "Books & Stationery",
        "Currency": "USD",
        "Description": "Situation organization these memory much off.",
        "Internal ID": "56",
        "Availability": "pre_order"
      },
      {
        "EAN": "5286196620740",
        "Name": "Tablet",
        "Size": "8x10 in",
        "Brand": "Mueller Inc",
        "Color": "Black",
        "Index": "2",
        "Price": "502",
        "Stock": "81",
        "Category": "Shoes & Footwear",
        "Currency": "USD",
        "Description": "Discussion loss politics free one thousand.",
        "Internal ID": "29",
        "Availability": "in_stock"
      },
      {
        "EAN": "1282898648918",
        "Name": "Smart Blender Cooker",
        "Size": "XS",
        "Brand": "Lawson, Keller and Winters",
        "Color": "SlateGray",
        "Index": "3",
        "Price": "227",
        "Stock": "726",
        "Category": "Kitchen Appliances",
        "Currency": "USD",
        "Description": "No situation per.",
        "Internal ID": "70",
        "Availability": "in_stock"
      },
      {
        "EAN": "3879177514583",
        "Name": "Advanced Router Rechargeable",
        "Size": "L",
        "Brand": "Gallagher and Sons",
        "Color": "PaleGreen",
        "Index": "4",
        "Price": "121",
        "Stock": "896",
        "Category": "Kitchen Appliances",
        "Currency": "USD",
        "Description": "For force gas energy six laugh.",
        "Internal ID": "31",
        "Availability": "discontinued"
      },
      {
        "EAN": "9055773261265",
        "Name": "Portable Mouse Monitor Phone",
        "Size": "100x200 mm",
        "Brand": "Irwin LLC",
        "Color": "SeaShell",
        "Index": "5",
        "Price": "1",
        "Stock": "925",
        "Category": "Kids' Clothing",
        "Currency": "USD",
        "Description": "Feeling back religious however author room scientist.",
        "Internal ID": "10",
        "Availability": "discontinued"
      },
      {
        "EAN": "1150028980156",
        "Name": "Radio",
        "Size": "30x40 cm",
        "Brand": "Benjamin, Nelson and Hancock",
        "Color": "CornflowerBlue",
        "Index": "6",
        "Price": "426",
        "Stock": "549",
        "Category": "Skincare",
        "Currency": "USD",
        "Description": "Character prove growth contain serious customer.",
        "Internal ID": "60",
        "Availability": "pre_order"
      },
      {
        "EAN": "5029747624534",
        "Name": "Ultra Projector Oven Thermostat Prime Advanced",
        "Size": "S",
        "Brand": "Mccoy, Waters and Rose",
        "Color": "Purple",
        "Index": "7",
        "Price": "68",
        "Stock": "870",
        "Category": "Laptops & Computers",
        "Currency": "USD",
        "Description": "Pattern possible look necessary indicate work nearly.",
        "Internal ID": "86",
        "Availability": "discontinued"
      },
      {
        "EAN": "9883725074294",
        "Name": "Webcam Stove Grill",
        "Size": "8x10 in",
        "Brand": "Morrow and Sons",
        "Color": "MediumOrchid",
        "Index": "8",
        "Price": "159",
        "Stock": "584",
        "Category": "Automotive",
        "Currency": "USD",
        "Description": "Deep area join carry age.",
        "Internal ID": "50",
        "Availability": "pre_order"
      },
      {
        "EAN": "1773215338624",
        "Name": "Eco Radio",
        "Size": "Medium",
        "Brand": "Edwards, Odonnell and Conley",
        "Color": "DimGray",
        "Index": "9",
        "Price": "454",
        "Stock": "499",
        "Category": "Skincare",
        "Currency": "USD",
        "Description": "Know father for act let.",
        "Internal ID": "88",
        "Availability": "pre_order"
      }
    ]

    Transition criteria

  • Integration authorization

  • API request and response details

  • External system behavior - check platform documentation if the task involves an outside service

  • Review the request parameters and expected output. Check if the API is designed to return a result for this operation, or if it executed successfully with no output

    Transition criteria not met

    The task was skipped because a transition condition wasn’t met—often due to logic that didn’t evaluate as expected or pathing that skipped this task

    Review the transition logic and task flow. Check for incorrect conditions or task paths that prevent the transition from executing

    If the issue isn’t obvious, look at the last successful task—errors upstream often cause transitions to fail silently.

    We recommend you only edit the pre-built workflows that come in Crates after taking our courses in Cluck University. This is a more advanced way to use Rewst.

    Before building any workflow, remember to sketch out what you'd like the workflow to look like, and identify the trigger that will kick it off.

    As of mid 2025, Rewst also offers kits. A kit is a collection of pre-built, pre-defined tasks that provide a quick start to setting up solutions to specific business needs, or to demonstrate all available actions within a given integration. For example, if you have a Halo PSA kit, there will be actions or automations Rewst has identified that are smaller use cases compared to our larger Crates.

    Kits are a newer feature of our Crate Marketplace. Check back as the collection grows. See our up-to-date list of available kits here.

    Why build workflows?

    While the pre-built workflows in Crates are the quickest way to get started, a workflow built custom to your situation can offer powerful, personalized efficiency measures that fit your particular MSP and customer needs.

    Find and use workflows in Rewst

    Access workflows in the Rewst platform by navigating to Automations > Workflows in the left side menu. Create a new workflow from scratch by clicking Create Workflow.

    The workflows list page, without any filters applied

    The list of workflows that appears in the center of your screen will include both the workflows you create and the workflows unpacked from Crates. As you continue to set up automation in Rewst, this list can grow quite a bit. The Updated At, Updated By, Attributes, and Tags columns each offer the option to filter your results by relevant criteria, with attributes and tags filters operating for both inclusion and exclusion of desired parameters. You can also use Search in the top center of your screen to find a particular workflow, and the icon to the right to choose which columns you'd like to see in your workflow list.

    Once you create a workflow, you'll be taken to the workflow builder, a canvas for assembling your workflows. See our documentation for how to use the workflow builder here.

    Synced versus unsynced workflows

    Synced workflows unpacked from Crates can't be edited, and automatically update when Rewst makes changes. For more on synced workflows, including how to identify them, see our documentation on Crates and syntonization here.

    View specific workflow results

    The general results page will show you the results of every workflow that has run in your organization. Apply a date range filter to view execution results from a specific time period, up to 30 days prior.

    To see all results for a specific workflow, you can do the following:

    1. Navigate to Automations > Workflows.

    2. Search for the specific workflow.

    3. Select in the far right corner for that specific workflow. This will take you to a new page that will show all the results of that workflow.

    When you delete the result of a workflow, consider it to be fully deleted. Only delete results when you are confident that they will not be needed. The result will remain in Rewst's database backup snapshots for a short length of time until it is past the retention period, at which point it will be purged. Meta data and stats about the deleted workflow execution remain in the system. Deleting a workflow execution will not affect time saved or remove time saved.

    View triggers for a specific workflow

    From the workflows page, you can view triggers associated with each workflow, without leaving that page. Hover over the workflow's triggers count in the Attributes column to see a list of every trigger linked to your workflow, and toggle each on or off to suit your needs.

    The dialog that appears when hovering over trigger counts

    Export and import workflows

    You can export a workflow to share with other Rewst customers, or create your own hard copies of workflow backups. To export a workflow as a JSON bundle, navigate to the Workflow Builder Canvas and find the export option under the Workflow Options menu.

    To import a workflow bundled as a JSON file, click Import Bundle in the top right navigation bar of the workflows page. Then, drag and drop your file into the upload dialog that appears.

    Subworkflows

    A subworkflow is a workflow that is also a part of another workflow. In Rewst, every automation can function as either a larger executing workflow or a smaller subworkflow. Sub-workflows help you simplify complex processes, reuse logic, and manage error handling and data gathering cleanly in your Rewst automations. You can create your own subworkflows, or use one of our pre-built subworkflows, cataloged in this section of our documentation site.

    In the example below, you have a main workflow called Create Ticket. In it, you choose which PSA the organization has. Once that has been decided, you then go to a subworkflow, which encompasses the actual creation of the ticket. Note the pink border and icon on the action, denoting that it is a subworkflow.

    Click on a subworkflow to navigate directly to it. You can also view subworkflows on the main workflow page, indicated by the green Subworkflow button under the Attributes column. Clicking will reveal which workflow the subworkflow is a part of.

    An example of subworkflows, flowing out of a larger executing workflow
    The Subworkflow button, under the Attributes column of the workflows list page

    There are a few reasons to set up subworkflows.

    • Ensure a tidy workflow. Rather than having 20 steps per PSA on a single workflow, we can split it up for convenience and ease of understanding.

    • When addressing various objects, the equivalent of a for each, we can pass all of the objects to a sub-workflow and get the output back of each object.

    • Run logic inside a subworkflow to isolate errors, apply retry or skip logic, and handle failures cleanly while using with items, without failing your parent workflow.

      • This is typically the best method for using with items loops inside Rewst. This allows you to run checks and balances on each iteration to prevent or handle possible failures on a per-item basis.

    • Subworkflows allow you to write a workflow once and reuse it multiple times. Subworkflows also accept parameters, making them adaptable for different use cases.

    • Smaller, self-contained workflows are easier to test and debug individually.

    Configure the subworkflow inputs and output

    Click to Navigate to Configure Workflow Settings. Then, configure which data comes into the subworkflow, and which data you want returned to the parent workflow upon completion— your inputs and outputs. There are a variety of input types. Below are a few of the most common ones.

    Workflow wrapper is an informal term sometimes used colloquially by the ROC to describe a situation where a primary workflow is used in a separate workflow as a subworkflow. More information on workflow wrappers can be found here.

    Enable publish results in the parent workflow

    This setting publishes the configured output, allowing your parent workflow to use the results of the subworkflow immediately.

    1. Find your desired subworkflow in the Workflows actions menu in the left side of theWorkflow Builder.

    2. Drag your subworkflow from the actions list to the Workflow Builder canvas within your parent workflow.

    3. Click on the subworkflow to expose its configuration settings.

    4. Enter sub_wf_results in the Publish Results As field.

    5. Click Publish.

    Access subworkflow data

    Results for subworkflows are nested inside published results for workflows. For example, the following Jinja wiuld contain the subworkflow data.

    Additional workflow documentation

    actions
    triggers
    Crates
    Workflow builder: How to set up a workflow
    Actions
    Task transitions
    Data aliases
    Best practices for designing workflows
    Advanced workflow operations menu
    Data input and output: Input variables and context variables
    Option generator workflows
    Completion handlers and workflow wrappers
    Boolean logic in Rewst workflows
    Document with RoboRewsty
    Kits
    Subworkflows

    The Merge Lists transform equips you with the functionality to effectively merge two lists into one. By aligning items based on a shared key attribute and allowing for three types of merging strategies (inner, left, and outer), it enhances your data analysis and manipulation capabilities.

    Parameters

    Here are the parameters you have available to you within the action, and their descriptions:

    Parameter
    Description
    Required

    Merge Method

    Choose the strategy to merge the lists. Options are inner, left, or outer join.

    First List

    Enter the first list for the merging process.

    First List's Key

    Identify the key attribute for matching items in the first list.

    Usage

    Input lists

    For this transform, we will want to provide the action two lists and their corresponding key's to be used for mapping the comparisons. Let's use the below for our examples:

    List 1:

    List 2:

    Merge methods

    This transform offers three different methods for merging your lists: Inner, Left, and Outer joins. These three methods mimic the functionality of SQL JOINs and each has its own use cases:

    1. Inner join: useful when you're dealing with two datasets and only want to focus on data that is common between them.

    2. Left join: useful when the first list is your primary dataset and you wish to append any additional, relevant data from the second list to it.

    3. Outer join: useful when you aim for a comprehensive view, combining all data from both lists, and filling in gaps where possible.

    Here are some examples of these methods in action to help you better understand their operation:

    Inner join

    The Inner merge method is used when you only want to retain the entries that are present in both lists. The intersection is based on the values of the specified keys.

    Action Parameters:

    Jinja2 Equivalent:

    Left join

    The Left merge method is employed when you want to keep all the entries from the first list and incorporate matching entries from the second list.

    Parameters:

    Jinja2 Equivalent:

    Outer join

    The Outer merge method is used when you want to keep all entries from both lists, regardless of whether they have a match.

    Parameters:

    Jinja2 Equivalent:

    Results output

    The outputs of the three different merge method examples above can be seen as follows:

    Inner join: only John's object is returned in the output, as his id is present in both lists.

    Left join: all objects from list_1 are returned, with matching objects from list_2 added on. This is why John's object includes the age from list_2, but Mary's object remains the same, as there was no matching id in list_2.

    Outer join: all objects from both lists are returned, with matching objects merged together. Therefore, we get John's object with the age from list_2, Mary's object from list_1, and the object with id 3 from list_2 which didn't have a matching id in list_1.


    Now that you're equipped with the knowledge of Merge Lists transform, you're prepared to blend data from two different lists into a coherent whole. Keep in mind your merging strategy (inner, left, or outer) as it directly impacts your resulting list.

    Overview

    The Diff Lists transform is your solution for list comparison tasks. It uses two methods - Anti-Join and Symmetric Difference - to focus on unique or exclusive entries, thereby streamlining your data comparison process.

    Parameters

    Here are the parameters you have available to you within the action, and their descriptions:

    Parameter
    Description
    Required

    Difference Method

    Choose the method to compute the differences between the lists. Options are anti_join and symmetric_difference (described below).

    First List

    Enter the first list to be compared.

    First List's Key

    Identify the key attribute for matching items in the first list.

    Usage

    Input lists

    For this transform, we will want to feed the action two separate lists, that we will then identify the fields in which we want to identify differences. Let's use these two lists as example:

    List 1:

    List 2:

    Difference methods

    We have two options for the Difference Method you can pick to have the action perform, these method have slight differences that are quite helpful in various situations:

    • Anti-join: for scenarios where you want to find entries that are exclusive to the first list.

    • Symmetric difference: for comparing two sets of data and identifying unique records in each.

    Take a look at examples of both below:


    Anti join

    Action Parameters:

    Jinja2 Equivalent:

    Symmetric difference

    Action Parameters:

    Jinja2 Equivalent:

    Results output

    The results of the two different diff methods can be seen as follows:

    Anti join: only Mary's object from list_1 is returned in the output, as she didn't have a correlating id in list_2.

    Symmetric difference: both Mary's object from list_1 and the object in list_2 that didn't have a correlating id in list_1 were returned in the returned list.


    With a grasp on the Diff Lists transform, you're ready to analyze and compare your lists for unique entries or entries exclusive to the first list. Understanding the differences between Anti-Join and Symmetric Difference methods will aid you in making effective data comparisons.

    Radio Button

  • Multi-Select

  • Option generators are still a fantastic option for those who need a more powerful, in-depth, solution. We cover what these are and how to use them in Cluck U’s Rewst Foundations . If you’ve already taken our courses and want a refresher, see our documentation on option generators here.

    Options filter guidance

    • Modifying a form using the options filter will work for both parent and child organizations, as long as data formatting is set up the same way for both organizations.

    • Add as many conditions as desired.

    • Access the options filter feature in our standard form builder.

    Practical uses for options filter

    • Say you offer 10 different types of licenses, but your users only ever use a single Business Premium type. Filtering down to just that license would simplify the list, and leave no room for error.

    • Using a multi-select form field, present multiple licenses to a user to be filtered down to a specific set of licenses.

    • Filter out admins from a total list of users, to create a cleaner list for copying into user onboarding.

    • When offboarding a user, you may want to exclude a list of specific people to prevent accidental offboarding of key individuals, like the CEO.

    • Hide on.microsoft email domains that are purely administrative, to provide a cleaner list.

    Detailed options filter example

    You work at an MSP and are building a license request form for technicians. Your customer, XYZ Corp, only purchases Microsoft 365 Business Premium licenses, not E3, E1, or other license types. To prevent techs from accidentally selecting the wrong license type, which would lead to support tickets and billing issues, you want the drop-down in your form to only show Business Premium.

    Building the form with the different license types
    What is seen after clicking filter options
    Filtering using the simple logic option. The $.label equals Microsoft 365 Business Premium. Note that you haven't clicked apply filter on the bottom right, so there are still 4 filtered options shown under Dropdown Options.
    What you see after you click apply filter. Now, there's only 1 filtered option: Microsoft 365 Business Premium
    A preview of the form, or a preview of what the end user would see. Only one option would display.

    Options filter dialog

    Click Filter Options under the Dynamic Options submenu of the right side forms menu. This will open the Create Option Filters dialog. In the dialog, you’ll see two submenus: Dropdown Options and Options Filter.

    All Options

    The All Options drop-down selector holds all of the options which you’ve set in the standard form builder right side menu. Adding more options in that menu will populate those options into your drop-down selector.

    The Filtered Options drop-down selector holds a list of your selected options after applying the filter. It acts as a preview for what to expect from your filtering.

    If your form field uses a custom options filter, there will be a badge indicator in the top right of the field.

    The JSON interface

    Toggle from the default Simple view to the JSON view. This will switch to show the code of the filter. You may have a scenario where your desired filter is more complex than just label and value, such as ID. Using this code editor, filter out custom objects from complex queries.

    Jinja for options filters

    If you manage many organizations, use Jinja in options filters to scale filtering logic without manually configuring filters for every suborganization. When simple boolean logic operators feel limiting, go straight to Jinja for greater customization.

    The CTX variable you want to reference will always be called options.

    AND and OR conditional options filtering

    Using the options filter for forms will require a basic understanding of Boolean. If you’re new to the topic, be sure to complete our Clean Automation course in Cluck University before trying out this feature.

    The options filter works off of two boolean operators, which are used to build queries for a variety of filtering situations.

    1. AND sets that all conditions must be true to be filtered into the returned result. E.g., Red AND white would count only items with both those characteristics.

    2. OR sets that either of several conditions can be true to be filtered into the return result E.g., Red OR white would count items with either of those characteristics.

    Click X to the right of any added rule or group to delete it from your options filter list.

    Clicking +Rule adds a filter field, which is customizable by a list of parameters. Choose from either $.value or $.label, then choose from the long drop-down list of conditions. E.g., $.value equals 15 would filter all results with a value of exactly 15.

    In Boolean logic, a group refers to a set of terms or expressions that are treated as a single unit by using parentheses, allowing you to perform Boolean operations on them together. Essentially, it defines the order of operations by grouping certain elements within a complex logical statement.

    When you want to combine multiple Boolean operations in a specific way, you enclose them within parentheses to indicate that these operations should be calculated first.

    By grouping terms, you can control the order in which Boolean operators like AND and OR are applied. Use the +Group button to define your conditions more precisely. For example:

    • Without grouping, A OR B AND C would be evaluated as: A OR (B AND C) due to precedence rules

    • With grouping, (A OR B) AND C forces OR to be evaluated before AND.

    Forms and options filter

    Use the options filter in a form

    1. Create a new form by navigating to Automations > Forms > + Add.

    2. Name your form, and click Submit.

    3. Drag one of the three applicable form fields onto the form builder canvas. Remember, options filter is only available for Radio Buttons, Dropdown, and Multi-Select.

    4. Click on the dragged form field to open the right side menu.

    5. Click on Filter Options. This will open the Create Option Filters dialog.

    1. Set up your desired filters using the AND and OR options, with relevant use of the +Rule and +Group buttons.

    2. Click apply filter at the bottom right of your screen.

    3. Click Close when finished. The option filter will automatically save and be applied to your form. Note that you’ll still need to click Save at the top right of your form builder screen to update these changes within your form.

    Options filter and syncing of forms

    The greatest advantage of the options filter is that it allows for the overriding of a form. Synchronized forms will block you from modifying attributes to prevent sync malfunction, by default. Under filter options in the form builder, you’ll find an Override button at the bottom right. Clicking will override this individual filter. Note that if you have multiple filters, and want to modify all of them, you’ll need to click Override for each filter.

    Org-based preview and org-specific instances

    Use the org context drop-down selector to choose the child organization that you'd like to preview, and see how the form will function for that specific organization. Previews don't require cloning, and won't affect the saved form configurations except for the options filter. The options generator will display data as if the form were triggered in just that specific organization. The default-set options filter will be used if no custom filters were provided for the selected organization.

    Click the drop-down selector to view and chose from your list of all total organizations.

    Selecting the preview organization sets the context of the form builder. and opening the preview dialog will use that organization's context to generate the correct preview, tailoring filtering logic for each instance without duplicating forms or unsyncing fields.

    By default, a field will inherit the parent organization's filter unless if it explicitly overridden.

    Dropdown
    1. Click to add new trigger criteria. This will add a new row of fields under the Trigger Criteria submenu.

    2. Click to open the trigger criteria test dialog. This dialog allows you to use past events in your relevant tool to test out conditions for future events. From this dialog, you can also add new trigger criteria. Note that the trigger must be set to enabled for this dialog to work. Learn more about this dialog in the Trigger criteria test dialog section of this document.

    3. The Key field is used to access the trigger context. A trigger context is a dictionary of key-value pairs that contain the data of the event that triggered the workflow.

    4. Click to open a Monaco editor dialog.

    5. The Operator drop-down is used to compare the value of the Key field with the Value field. Click the arrow to open the drop-down list of all possible operators.

      1. Equals

      2. Not Equals

      3. Contains

    6. The Value field contains the text parameter of the Key field to compare with the value of the trigger context. Note that only string values are supported in this field. If you need to evaluate non-string values, you can use Jinja Evaluation to do so.

    7. Click to remove the related trigger criteria.

    Trigger criteria test dialog

    The dialog is made up of two panels. The left panel shows all prior triggering events in a list, with the most recent events displayed at the top. You must enable the trigger to receive trigger events. The system will approximately log the latest 10 events for one day. There is no throttling on the logging system.

    Click on the value of the trigger context for any of these events to generate and display its criteria in the right panel. This will automatically map the field accessor and the selected value of the trigger context. Note that the events in the left panel list have color coded headers at the top of each, with the color denoting a different status for that event. Each trigger type may have different trigger context data or formatting.

    Status
    Meaning

    VALID - Blue

    A valid trigger criteria means the triggered event satisfies all possible conditions and will start the workflow. A criteria is satisfied when all specified conditions are satisfied by logical means against the trigger context. All valid trigger events should have a corresponding workflow execution.

    FILTERED - Yellow

    A filtered trigger will not start the workflow, typically for one of the following reasons: a condition is logically unmet by design, a condition is malformed and unparseable, or the trigger request itself is malformed and rejected by the system. A filtered trigger event may show warnings if errors are found while processing the trigger event.

    If no criteria are set, anything will be considered a valid triggering event.

    Alternatively, click Add a Trigger Criteria to create a new row for a new criteria underneath any existing criteria in the right panel.

    You can’t set more than one condition on the same field. Rewst will adopt the first condition and destroy any future conditions without giving a warning message.

    Though you can only have one condition on specific field at a time, you can have as many conditions as you wish, as long as they are each on a different field.

    Trigger context examples

    Basic example: Apple, orange, banana

    In plain speak, we want to set the criteria to be that a fruit is an apple, where all possible fruits are apple, orange and banana. The price of the apple is $1.99. The colors corresponding to each type of the fruits are red, orange, and yellow respectively.

    Now let's look at it in Rewst. Given the following trigger context:

    The following trigger criteria will be valid, and match our statement:

    • For this example, note that while you could have each of the types of fruits with an operator of Equals and the value set to the entire text name of each fruit, using the alternative operators such as contains, Starts With and Ends With allow you to pull in more results for your criteria. If you only know that the domain you want to act as a trigger ends in co.uk, you could use an operator other than Equals, to pull in results that contain those few letters rather than requiring it to match an entire address' exact text.

    • The field accessor uses dot notation to access the value in the trigger context: apple = fruits,0, orange = fruits.1, banana = fruits.2, etc.

    • If you are making use of the In or Not In operator, be sure to press the Enter key to convert the value into a list.

    • You can't have identical field accessors in the same trigger criteria, with the exception of Jinja criteria.

    • We make use of simple Python operators to compare the values of the trigger context and the field value. For more information, please refer to the

    • Default conditions are And conditions. If you want to use Or conditions, you can use the Jinja criteria. Please see the advanced examples below.

    Advanced example: Jinja evaluation

    Given the following trigger context:

    The following Jinja evaluation will be valid:

    Jinja evaulations do not require a field accessor, and the entire trigger context is available under the CTX variable.

    Save trigger criteria

    You'll need to save your updates for the trigger criteria to take effect. How you do this will depend on if you are adding criteria directly under the Trigger Criteria submenu or within the Trigger Criteria Test dialog.

    Click Submit under the Trigger Criteria submenu to save your added or updated trigger criteria.

    Click Save in the Trigger Criteria Test dialog to save and close the dialog.

    While the Trigger Criteria Test dialog is open, you can press the F8 key to save the trigger.

    core webhook
    An animated image of the user choosing a trigger typed ConnectWise PSA. As the user clicks, a new section of the menu appears titled 'Trigger Criteria.' The test is white on a dark blue screen.
    Scroll down to the bottom of the trigger menu once you've chosen your trigger type to see the trigger criteria submenu.

    Set list field value transform action

    Modify a specific field's value within your list objects.

    Use case

    You have a list of objects where certain field values need adjusting. You need a solution that not only allows straightforward field value modifications, but also supports conditional changes and nested element modifications.

    Overview

    The Set List Field Value action enables the customization of a field's value within a list of objects. Whether it's for conditional value adjustment based on specific criteria or working with nested elements, this action offers the flexibility you need.

    Parameters

    Parameter
    Description
    Required

    Usage

    Let's break this down into specific use-case examples, to show how each of these methods can be used within the Set Field Value Transform.

    Input list

    Assume that we have a list of objects called my_list that looks like this:

    Update methods

    Using the New Value Mode you can define how you want to provide the data for the outputting field. You can do one of two things:

    • Copy From Field: allows you to copy the value from an existing field

    • Set Value: provide the literal value you'd like the field to be set to.

    Here are some examples of how we can use this action to update or add to our list:

    Example 1: Create and set new field values

    Add a new field adult with value true to each object in the list.

    Action Parameters:

    Jinja2 Equivalent:

    Example 2: Copy value from existing field to new field

    Copy the age field to a new field years in each object.

    Action Parameters:

    Jinja2 Equivalent:

    Example 3: Update fields conditionally based on other fields

    Update the name field to Senior for any object where age is 35.

    Action Parameters:

    Jinja2 Equivalent:

    Results output

    After all these examples are performed in the transformation, your newly updated list would reflect these changes in their outputted results as such:

    Triggers

    What is a trigger?

    Triggers initiate workflows in Rewst. Every workflow must have a trigger to define when and how it starts. Essentially, triggers put the automate in automation. Choosing the right trigger ensures that your workflows execute at the right time, with the right data, to drive efficiency and consistency in your operations.

    A trigger is also used on any form input that requires a workflow. If a form uses the Dynamic button, then you must also create a trigger on the workflow associated with that form.

    For more on how to see which triggers appear on a specific workflow, view our documentation here.

    Create a trigger

    Add a trigger to a workflow by clicking the Add Trigger button in the workflow builder, which will open up a new dialog with a form.

    Note that you can have multiple triggers per workflow, for example a webhook and a trigger that runs when a ticket gets saved in the PSA.

    Update the relevant fields in the setup menu as needed, to set up your trigger. This might include or .

    Trigger criteria

    When you're comfortable with the basics of triggers, learn more about . It's a separate submenu within the trigger menu, and has its own documentation page.

    Item
    Description

    Modify an existing trigger

    To modify an existing trigger, click Edit Trigger. If there are multiple triggers for the workflow, select the appropriate trigger from the dropdown menu.

    How to use a trigger on a form

    Once the trigger has been created on a workflow, it can then be used on a form. This must be an options generator workflow. The requirements for this.

    The above is a snippet from a form where a dropdown field has been selected and the output will be based on the workflow output. When running the form, if the client is added on the trigger and the trigger is set on the form, the workflow will run, and the options will fill into the form field.

    Core triggers

    There are six key triggers to understand when getting started with Rewst. These triggers cover a range of automation scenarios, from scheduled executions to real-time event responses. In Rewst, we denote these from other triggers by calling them core triggers. Type core into the Trigger Type field to isolate most of these trigger types from the total list.

    Core - Cron Job

    The cron job trigger initiates a workflow on a predefined schedule. This allows you to automate recurring tasks without manual intervention.

    Schedules are configured using cron syntax. Consult for help configuring this syntax.

    For example, you can configure a workflow to run every Monday at 3:00 PM to generate weekly reports or clean up outdated records.

    This trigger is most useful for:

    • Scheduled maintenance workflows: clearing stale data, running audits

    • Recurring notifications: sending reminders, generating reports

    • Automated check-ins: verifying system statuses, updating dashboards

    Core - Form Submission

    A workflow can be triggered when a user submits a form. Forms collect structured information, ensuring the workflow has the necessary data to proceed.

    For example, you can submit an employee onboarding form to trigger a workflow that creates user accounts, assigns permissions, and sends welcome emails.

    This trigger is most useful for:

    • Request-based workflows: access requests, service requests

    • Intake processes: user registrations, issue reporting

    • Approval workflows: leave requests, expense approvals

    For help building a form, refer to .

    Core - Webhook

    A webhook trigger starts a workflow when external data is received in real time. Webhooks eliminate the need for manual checks, making them efficient for event-driven automation.

    The webhook URL serves as a listening endpoint. When an external system like a CRM, ticketing system, or another Rewst workflow sends data to the webhook URL, the workflow is triggered immediately. This enables seamless integration between Rewst and external applications without requiring a direct API connection.

    For example, a webhook could trigger a workflow whenever a new customer signs up in a CRM, automatically assigning them an account manager and setting up follow-up tasks.

    This trigger is most useful for:

    • Event-driven automation: responding to new leads, updating records on status changes

    • Real-time notifications: escalating high-priority tickets, alerting teams to critical updates

    • External system integrations: syncing data between platforms, processing incoming requests

    For more information on webhook triggers, refer to .

    Core - Always Pass

    The always pass trigger allows a workflow to start without conditions. It is commonly used in workflows that do not depend on external events or schedules. It's mostly used with the Test button in the Workflow Builder Canvas, and options generators for forms that need an override for its fields. You might use this trigger when testing workflows, executing a workflow from another workflow without needing a specific event, or populating dynamic options in a Rewst form.

    This trigger is most useful for:

    • Manual workflow execution: running a workflow on demand

    • Subworkflows or completion handlers: workflows triggered by other workflows

    • Testing automation: verifying workflow functionality

    • Option generators: dynamically populating form fields in Rewst

    For more information on option generators, refer to .

    Core - Time Interval

    Time intervals can be set to trigger a workflow repeatedly over specified periods. This trigger is suitable for workflows that need to repeat on a regular basis.

    • Examples:

      • Every 5 minutes

      • Every hour

      • Daily

    Check out our page for a more detailed example.

    PSA: Ticket record saved

    Note that this is the only common trigger type that does not start with Core, as the trigger name will be specific to your brand of PSA. Search for that in the trigger type list instead.

    This trigger is similar to the webhook trigger but is specific to PSA systems. When a ticket record is saved in an integrated PSA, the workflow starts automatically. This includes both newly created tickets and updates to existing tickets.

    For example, if a ticket is updated to Escalated, a workflow can trigger an alert to the appropriate team or assign a senior technician.

    This trigger is most useful for:

    • Automating ticket management: escalating high-priority tickets, auto-assigning technicians

    • SLA enforcement: sending reminders for unresolved tickets, auto-responding to specific cases

    • Status-based automation: triggering follow-up workflows when a ticket is created or reaches a certain stage

    For more detailed information on PSA triggers, refer to .

    Other triggers

    While these six triggers cover the most common use cases, Rewst offers additional triggers tailored to different automation needs. Explore the available triggers in the trigger type list to find the best fit for your specific processes.

    Workflow builder: How to set up a workflow

    Workflow Builder

    Remember, the actions accordion menu contains your base actions that apply for all integrations. The actions accordion holds actions form the foundation of your interaction with the platform. The actions accordion contains any existing workflows in the workflow list for the related child organization. The other accordions contain actions that apply to that particular brand of integration.

    {{ CTX.sub_wf_results.output_data }}
    join_method: inner
    list_1: list_1
    list1_key: id
    list_2: list_2
    list2_key: id
    jinjaCopy code
    {% set result = [] %}
    {% for item1 in list_1 %}
      {% for item2 in list_2 %}
        {% if item1[list1_key] == item2[list2_key] %}
          {% do result.append(item1 | combine(item2)) %}
        {% endif %}
      {% endfor %}
    {% endfor %}
    
    
    join_method: left
    list_1: List 1
    list1_key: id
    list_2: List 2
    list2_key: id
    {% for item1 in list_1 %}
      {% for item2 in list_2 %}
        {% if item1[list1_key] == item2[list2_key] %}
          {% do item1.update(item2) %}
        {% endif %}
      {% endfor %}
    {% endfor %}
    
    
    {{ list_1 }}
    join_method: outer
    list_1: List 1
    list1_key: id
    list_2: List 2
    list2_key: id
    {% for item1 in list_1 %}
      {% for item2 in list_2 %}
        {% if item1[list1_key] == item2[list2_key] %}
          {% do item1.update(item2) %}
        {% endif %}
      {% endfor %}
    {% endfor %}
    {{ list_1 + [item2 for item2 in list_2 if all(item2[list2_key] != item1[list1_key] for item1 in list_1)] }}
    list_1: [
      {"id": 1, "name": "John"},
      {"id": 2, "name": "Mary"}
    ]
    list_2: [
      {"id": 1, "age": 30},
      {"id": 3, "age": 35}
    ]
    results: [
      {"id": 1, "name": "John", "age": 30}
    ]
    results: [
      {"id": 1, "name": "John", "age": 30},
      {"id": 2, "name": "Mary"}
    ]
    results: [
      {"id": 1, "name": "John", "age": 30},
      {"id": 2, "name": "Mary"},
      {"id": 3, "age": 35}
    ]
    diff_method: anti_join
    list_1: List 1
    list1_key: id
    list_2: List 2
    list2_key: id
    {% set result = [] %}
    {% for item1 in list_1 %}
      {% if all(item1[list1_key] != item2[list2_key] for item2 in list_2) %}
        {% do result.append(item1) %}
      {% endif %}
    {% endfor %}
    
    
    {{ result }}
    diff_method: symmetric_difference
    list_1: {{ CTX.list_1 }}
    list1_key: id
    list_2: {{ CTX.list_2 }}
    list2_key: id
    {% set result = [] %}
    {% for item1 in list_1 %}
      {% if all(item1[list1_key] != item2[list2_key] for item2 in list_2) %}
        {% do result.append(item1) %}
      {% endif %}
    {% endfor %}
    {% for item2 in list_2 %}
      {% if all(item2[list2_key] != item1[list1_key] for item1 in list_1) %}
        {% do result.append(item2) %}
      {% endif %}
    {% endfor %}
    
    
    {{ result }}
    list_1: [
      {"id": 1, "name": "John"},
      {"id": 2, "name": "Mary"}
    ]
    list_2: [
      {"id": 1, "age": 30},
      {"id": 3, "age": 35}
    ]
    result: [
      {"id": 2, "name": "Mary"}
    ]
    result: [
      {"id": 2, "name": "Mary"},
      {"id": 3, "age": 35}
    ]
    {
        fruit: "apple",
        fruits: ["APPLE", "orange", "banana"],
        price: 1.99,
        types: {
            colors: ["red", "orange", "yellow"],
        }
    }
    {
        fruit: "apple",
        fruits: ["APPLE", "orange", "banana"],
        price: 1.99,
        types: {
            colors: ["red", "orange", "yellow"],
        }
    }
    {{ CTX.fruit == 'apple' or CTX.price < 2 }}
    A screenshot of a dashboard interface labeled 'Workflows' showing a list of workflows with details including 'Updated At', 'Updated By', 'Time Saved', and options to configure each workflow. The left sidebar contains navigation options.
    A user interface displaying a 'Workflows' section with a dark background. It includes search and filter options, a list of workflows, and buttons for actions such as 'Configure' and 'Trigger' beside a specific workflow titled 'Integration Checklists and WBS.'
    An image of a small subworkflow, flowing out of a larger executing workflow. The subworkflow is composed of actions, via rectangles outlined in  pink. The flow of subworkflow out of larger workflow is communicated via blue directional arrows. Under each subworkflow action, there's the option to click a blue plus button to add additional actions on success or failure of that action.
    A screenshot of a sub-workflow configuration screen. At the top, there are sections labeled "Variable Configuration" and "Input Configuration" with a plus icon. Three input fields are defined:  list (type: List) with default value {{ [ ] }}, description "used for passing JSON object," optional required checkbox.  boolean (type: Boolean) with default value {{ true }}, description "true or false," optional required checkbox.  input_configuration (type: Text) with description "configure Inputs in the sub-wf," optional required and multiline checkboxes.  Below, an "Output Configuration" section contains a field:  output_data with value {{ "The sub-wf test data" }}.  Each entry includes text fields for name, label, type, default value, and description, along with a red "Remove" button. At the bottom, there are "Cancel" and "Submit" buttons.  Highlighted in red boxes are the "Input Configuration" and "Output Configuration" headers, as well as a pencil icon in the top-right toolbar.
    Alt text: A screenshot of a sub-workflow execution result. The header shows "Sub_Workflow" with a green checkmark and "1 successful tasks" on the right, along with a timestamp "07-21-25 05:10 PM."  On the left, under Input, the JSON-style data is displayed:  boolean: true  input_configuration: "string"  list: containing one object with a field user_list that includes three values: "user1", "user2", and "user3".  On the right, under Result, the output is shown:  output_data: "The sub-wf test data" Published as {{ CTX.sub_wf_results }}.

    Second List

    Enter the second list to be merged with the first one.

    Second List's Key

    Identify the key attribute for matching items in the second list.

    Starts With

  • Ends With

  • Greater Than

  • Less Than

  • Exists

  • Does Not Exist

  • In - be sure to press the Enter key to convert the value into a list

  • Not In - be sure to press the Enter key to convert the value into a list

  • Jinja Evaluation

  • Python Operators

    If your trigger type is a form submission, you would select the form that links to the workflow.

    Weekly

    Name

    Whatever you would like to name your trigger, with a descriptive word or phrase for what it does.

    Enabled

    Toggle this on or off.

    Organizations

    Select all the organization that exist within Rewst that may need to use this workflow. If you add a new client, they will have to be added in that workflow trigger.

    Integration Override

    Integration overrides allow you to specify which integration configurations should be used. When a workflow is triggered by and running within the context of a child organization, by default they only have access to their own integrations and configurations. To give the workflow access to integrations and credentials owned by the parent organization, that default behavior must be explicitly overridden. In the above example image, the trigger allows your clients to use your PSA, RRM and licensing integration.

    Trigger Type

    There are a number of types to choose from, such as a webhook, form submission, ticket saved, M365 alerts. See Core triggers for more information on common trigger types.

    integration overrides
    tags
    trigger criteria here
    can be found here
    crontab guru
    Conditional fields
    Use webhook triggers
    Rewst Foundations
    Use webhook triggers
    Customize PSA ticket triggers
    A moving GIF image depicting scrolling through the trigger type list in an example organization in Rewst. Various integrations' actions are shown.
    The contents of the complete trigger type list will depend on your particular integrations

    Form

    How you want to provide the field's new value. copy_from_field or set_value (described below)

    Parent Fields

    If the field should be nested within another list, specify the parent list's name here.

    Condition Field

    If you want to update the field conditionally, specify the field to base the condition on.

    Condition Value

    If a Condition Field is specified, provide the value that should be matched to trigger the update.

    List to Transform

    The list of objects you want to modify the contents of.

    Field to Update

    Specify the field to be added or modified in each object.

    New Value

    Specify the value for the new or modified field.

    New Value Mode

    my_list: [
      {
        name: "John",
        age: 30,
        hobbies: ["golf", "reading"],
      },
      {
        name: "Mary",
        age: 35,
        hobbies: ["cooking", "music"],
      },
    ]
    field_actions:
     field: adult
     new_value: true
     new_value_mode: set_value
    {% set _ = item.update({'adult': true}) %}
    
    
    field_actions:
     field: years
     new_value: age
     new_value_mode: copy_from_field
    {% set _ = item.update({'years': item['age']}) %}
    
    
    field_actions:
     field: name
     new_value: "Senior"
     new_value_mode: set_value
     condition_field: age
     condition_value: 35
    {% if item['age'] == 35 %}
      {% set _ = item.update({'name': 'Senior'}) %}
    {% endif %}
    results: [
      {
        name: "John",
        age: 30,
        hobbies: ["golf", "reading"],
        adult: true,
        years: 30
      },
      {
        name: "Senior",
        age: 35,
        hobbies: ["cooking", "music"],
        adult: true,
        years: 35
      },
    ]
    Once an action has been dragged onto the canvas, we refer to that dragged action as a task.
    A blank workflow builder canvas, as seen for a freshly created workflow

    The workflow settings toolbar

    At the top of the workflow builder, you'll find several settings buttons.

    Edit Workflow Title : Click to open up a dialogue where you can change the name of your workflow.

    View results for workflow : This opens up a new tab in your browser with the entire recorded execution history of that workflow.

    History : Click to open a menu on the right side of your screen displaying the record of when the workflow was created and edited. You also have the option to revert back to a previous version of your workflow, or view previous versions to compare changes.

    Notes : Click to open the Notes menu, where you can view a record of all notes made on the workflow, and view instructions for how to add new notes. For more information on notes, see the Add, edit, or delete workflow notes section of this document.

    Execution History : This reveals the same information as History, but provides an easy way to view the data without leaving your workflow builder.

    Data Aliases : Click to view a list of all set data aliases. Click on the data alias to take you directly to that action.

    Add Trigger : Click to open up the Add Trigger form, where you can set up your trigger's configuration, parameters, criteria, and activated organizations.

    Configure Workflow Settings : Click to open the menu that contains the settings for workflow type, workflow timeout, time saved, and variable, input, and output configuration.

    Workflow Completion Handlers : Click to open a submenu where you can set completion handlers. Click the button a second time to collapse the menu.

    Workflow Options : Click to open a submenu where you can export a workflow, clone a workflow, or delete your workflow, as well as edit the workflow's attributes.

    Display Validation Errors : By default, this is set to off. When toggled on, Rewst will provide an error on required fields that aren't filled out, and add a message about the field being required beneath the field in red text. The text will be invisible until the user clicks on the field and then click out of it without entering a value.

    An example of the message, when the setting is toggled on

    Test : Click to run a test of your workflow as it appears on your workflow builder canvas, and view the results of that test. Note that this also publishes and saves the workflow.

    Publish : Click to publish changes on your workflow without first running a test, which will push the updated version live for use. This also offers a dual screen code viewer, to compare your old workflow to your new one.

    Build a workflow

    Set up the trigger

    Recall that every workflow is kicked off by a trigger. Which trigger you choose will depend on the goals of your workflow. There's no right or wrong order to build your workflow as long as it contains all the correct parts at the time of publication. You could start with adding actions to your canvas first, then set up your trigger.

    If your trigger is form, you'll need to create and set up that form first before pulling it into your workflow.

    1. Click to add a new trigger.

    2. Name your trigger with something simple but descriptive.

    3. Toggle Enabled to on.

    4. Search for your desired trigger in the Trigger Type drop down menu. Depending on your trigger, new Trigger Parameters will appear as a new section in the setup menu with additional selections to be made to set parameters for the trigger. For example, if your trigger is a , you would be asked to select the name of an existing form to use as the trigger.

    5. If needed, add an .

    6. Set your trigger criteria, if required for your workflow.

    7. Think about which organizations you want the trigger to run for.

      1. Selected Organization (Org Name) will be toggled on by default. Toggle to off if desired.

      2. If you want the automation to work for your main org as well as all child organizations, toggle All current and future managed organizations to on.

      3. If you want the automation to apply only for certain organizations, select them manually in the Organizations

    8. Click Submit to save the trigger.

    A workflow can be called by multiple forms through the use of triggers. All that is required is to open the workflow and create a new trigger with Core - Form Submission selected for the Trigger Type.

    Create the workflow

    1. Click Create.

    2. Give your workflow a Name, and add any tags you would like via the Tags drop-down selector.

    3. Click Submit. This will launch the workflow builder.

    Drag the action

    1. Search for your desired action in the left side menu.

    2. Click on it, drag it, and drop it onto the canvas.

    3. Repeat this process to add all needed actions to your workflow.

    Configure tasks

    Remember, once an action is placed on the canvas, we then call it a task.

    1. Click on the placed task, which will open a configuration dialog featuring two sections:

      1. A set of basic details fields at the top:

        1. Name: A user-editable field for the task's identifier.

        2. Reference: The integration pack and task description.

        3. Output: Specifies where the task's output gets stored in the task logs.

        4. Task ID: The unique ID for referencing this task.

        5. Description: A user-fillable text box for additional task information.

        6. Publish Result As: A friendly name you assign for the task's results that you can use as an a context variable for calling it's content in future tasks.

      2. Four distinct tabs beneath the basic details:

        1. Parameters: Unique to each task, this tab houses options for defining the task's behavior during execution, including settings for endpoints, filters, conditions, and query parameters.

          1. Note the Redact on Hover setting for inputs that are set to Password. This can be toggled on or off via the .

    2. Remember to add between your tasks.

    3. Click Test to see if your workflow executes as desired.

    4. Click Publish to save your changes and push them to the desired effect.

    Add time saved to a workflow

    One of the key metrics you can use to understand the value added by your automations is time saved. You can configure this in Rewst by identifying how long it takes to manually work through your process before automating it and adding it into your workflow.

    Considerations for time saved

    When determining how much time to set for any given process, it's a good practice to consider not only how much time it may take you or your most experienced tech to go through that process manually, but also how much time it takes to fix any human errors that may happen during this process.

    1. Click on the workflow that you want to configure.

    2. Click on Configure Workflow Variables to edit the workflow.

    3. Enter the amount of seconds it takes for the process in Time Saved (seconds).

    4. Click Submit.

    Add, edit, or delete workflow notes

    Rewst now also offers our RoboRewsty note taking feature, to automate your documentation. Choose to document manually, or with RoboRewsty.

    Notes are a great way to jot down your thinking behind workflow aspects, and an essential step to building workflows for any team that has multiple employees editing workflows. They save in the workflow itself, and can be viewed via the notes button by anyone who has permissions to edit that workflow. These boxes provide a title and a markdown editor.

    Adding notes is disabled for synced clone workflows.

    1. Right-click the canvas and select Add Note. Alternatively, press and hold the control key, then drag your mouse to create a note.

    2. Click and drag it to the desired location on the canvas.

    3. Hover over the upper-right icon and click Edit Note to edit a note's content in the right side menu.

    4. To delete notes, right-click the note and click Delete Note.

    Additional workflow builder features

    Select multiple elements on the canvas

    Select multiple workflow tasks and notes simultaneously by drawing a selection box around them.

    1. Hold shift and drag your mouse, or hold the middle-mouse button and drag your mouse.

    2. Once you’ve selected multiple tasks or notes, move them by dragging the selection box to the desired location.

    3. With multiple tasks or notes selected, you can perform the following actions:

      1. Delete Items: Press the delete key, or right-click the canvas and select Delete Selected Tasks.

      2. Duplicate Items: Press ctrl+d, or right-click the canvas and select Duplicate Selected Tasks.

    The duplication of tasks and transitions

    Favorite actions

    Commonly used actions can be favorited to easily find and add actions to workflows. When favorited, actions can be found in the favorites section and added on the workflow canvas by right-clicking.

    1. Find the action you want to favorite.

    2. Click the star icon next to the action.

    3. To add a favorited action to your workflow:

      1. Right-click on the workflow canvas.

      2. Add an action from the favorites section.

    Retrieve the name of a workflow

    Run the command {{ WORKFLOW.name }} .

    Similarly, if you're searching for the name as it relates to completion handlers, run the command {{ COMPLETED_WORKFLOW.WORKFLOW.name }} .

    Information for the Advanced tab of tasks and actions in a workflow can be found in our documentation for the advanced workflow operations menu.

    Core
    Rewst
    workflows

    Second List

    Enter the second list to be compared.

    Second List's Key

    Identify the key attribute for matching items in the second list.

    The Symmetric Difference method is used when you want to identify entries that are unique to each list, i.e., items that exist in the one list and not in the other.

    The Anti Join difference method is used when you want to determine the items in the first list that don't have a corresponding match in the second list.

    Transform list objects transform action

    Redefine your list structure by reshaping attribute values.

    Use case

    You have a list where the current structure isn't effectively supporting your data analysis and transition decision making needs. You want to remap fields, flatten nested items, or count instances within your list to provide more meaningful insights.

    Overview

    The transform list objects action offers versatile functionality to modify the structure of your list. Whether it's remapping fields for better clarity, flattening for easier data extraction, or counting to reveal data trends, this transform is a strong tool for data restructuring.

    Parameters

    Parameter
    Description
    Required

    The parameters listed under Field Actions are all required. Those listed under Transformation Parameters are optional and are needed only when append or concatenate are selected for the Transformation Method.

    Usage

    Let's break this down into specific use-case examples, to show how each of these methods can be used within the Restructure Lists Transform.

    Input list

    Assume that we have a list of objects called my_list that looks like this:

    Transformation methods

    Here is the breakdown of the different transformation methods, and when you'd want to use them:

    • Retain Original Value: The input field remains unchanged in the output. Ideal when you need to preserve the original data.

    • Append to Existing Value: The output field shows the original input field value appended with specified values or fields. Perfect when you need to combine data from multiple sources.

    • Count the Number of Elements: The output field displays the correct count of items in the input list. Use this when you need to know the size of your list.

    Let's use the list we declared to define a set of fields we want to restructure for this action, using the different transformation methods, and show how we can match these to their Jinja2 equivalent.

    Method 1: Retain Original Value

    This action retains the original value of name.

    Action Parameters:

    Jinja2 Equivalent:

    Method 2: Append to Existing Value

    This action appends the literal string "age" before the actual age, separated by a colon.

    Action Parameters:

    Jinja2 Equivalent:

    Method 3: Count the Number of Elements

    This action counts the number of items present in the hobbies list.

    Action Parameters:

    Jinja2 Equivalent:

    Method 4: Concatenate Nested Property in List

    This action concatenates the name field from the family list of objects.

    Action Parameters:

    Jinja2 Equivalent:

    Method 5: Flatten List of Strings

    This action flattens the hobbies list of strings into a single comma separated string.

    Action Parameters:

    Jinja2 Equivalent:

    Results output

    After all these actions are performed, your newly transformed list would output looking like this:

    selector field.
    Advanced: In this tab, you'll set the rules for your task's path and behavior within the workflow. Options include Integration Overrides, Transition Mode, Task Transition Criteria Sensitivity, Run as Org, With Items, Items Concurrency, and Task Timeout. See more about this on the Advanced Workflow Operations page.
  • Mocking: This tab provides the option to simulate the task's function with a user-defined result, useful for testing and debugging.

  • Time Savings: In this tab, specify your estimate of the time a human would need to complete the task. This is used for creating Time Entries in PSA platforms.

  • Security: This tab allows for meticulous redaction of sensitive information within workflow tasks. This is especially vital when using generic HTTP actions for services without official integrations, where API tokens or other sensitive data in headers could be exposed in results.

    1. In the Redacted Input Parameters and Redacted Output Parameters fields, customize redaction with JSONPath queries.

    2. These queries can be entered manually in the editor, or chosen from the field's drop-down selector.

  • form
    integration override
    transitions

    The new field where the transformed value will be stored.

    Append Action Type

    The type of appending action if the method is set to append.

    Append Value

    The value to be added if the Append Action Type is Append Value.

    Append Field

    The field to be joined if the Append Action Type is Append Field.

    Delimiter for Append

    The delimiter to be used in the Append method

    Field for Concatenation

    The field to be used in the concatenation operation if the method is Concatenate.

    Concatenate Nested Property in List: The output field shows a string which is a concatenation of the specified field values in the input list.

  • Flatten List of Strings: If your input list contains sub-lists, this method will return a flattened list with no sub-lists.

  • List to Transform

    The list that you would like to restructure.

    Input Field

    The item in the list you would like to transform.

    Transformation Method

    The transformation method to be applied on the input field. (options described below)

    A screenshot of transform list objects transform action, seen in the actions list menu of the workflow builder canvas. It indicates that the action is in beta.

    Output Field

    my_list: [
      {
        name: "John",
        age: 30,
        hobbies: ["golf", "reading"],
        family: [
          { name: "Jane", relation: "sister" },
          { name: "Jim", relation: "brother" },
        ],
      },
      {
        name: "Mary",
        age: 35,
        hobbies: ["cooking", "music"],
        family: [
          { name: "Mike", relation: "husband" },
          { name: "Mia", relation: "daughter" },
        ],
      },
    ];
    field_actions:
     input: name
     method: original
     output: name
    {% set _ = transformed_item.update({'name': item['name']}) %}
    
    
    field_actions:
     input: age
     method: append
     output: status
     transformation_parameters:
      append_type: append_value
      append_value: 'age'
      delimiter: ':'
    {% set _ = transformed_item.update({'status': 'age' ~ ':' ~ item['age']}) %}
    
    
    field_actions:
     input: hobbies
     method: count
     output: hobbies_count
    {% set _ = transformed_item.update({'hobbies_count': item['hobbies']|length}) %}
    
    
    field_actions:
     input: family
     method: concatenate
     output: family_names
     transformation_parameters:
      field: name
    {% set _ = transformed_item.update({'family_names': ', '.join([dep['name'] for dep in item['family']])}) %}
    
    
    field_actions:  
     input: hobbies
     method: flatten
     output: hobbies_flat
    {% set _ = transformed_item.update({'hobbies_flat': ', '.join(item['hobbies'])}) %}
    results = [
        {
            'name': 'John',
            'status': 'age:30',
            'hobbies_count': 2,
            'family_names': 'Jane, Jim',
            'hobbies_flat': 'golf, reading'
        },
        {
            'name': 'Mary',
            'status': 'age:35',
            'hobbies_count': 2,
            'family_names': 'Mike, Mia',
            'hobbies_flat': 'cooking, music'
        }
    ]

    Rewst actions

    Available Rewst actions

    Rewst actions provide you the tools to effectively manage and customize your environment. From setting up organizations and users to associating with multi-tenanted objects, these actions form the foundation of your interaction with the platform. This guide explores each of the available actions in detail, providing you a clear path to maximize the potential of your Rewst functionality.

    Expand each of the action types below to see their individual actions and action information.

    Organization actions

    The actions in this section include the ability to list all organizations, fetch information about a specific organization, update an existing organizations details, and create an organization or bulk or organizations. These actions provide necessary capabilities to ensure seamless functioning and interoperability of your organizations within Rewst.

    Get Organization

    Description: Retrieve data for a single organization in Rewst.

    Organization variable actions

    This section encompasses actions related to the manipulation of organization variables. These variables are key-value pairs stored at an organization level, typically used to hold configuration data that could be used across different operations within the organization. Actions here include the ability to create, update, delete, and list organization variables.

    List Organization Variables

    Description: Lists all organization variables visible to the selected organization.

    Users and invitation actions

    The actions grouped under this section are designed to manage users and their invitations. This includes inviting users to join an organization, listing users, retrieving user information, and updating user details. These actions provide comprehensive user management capabilities, enabling secure and efficient operations within an organization.

    List Users by Organization

    Description: Get user list and optionally invited users by your organization in Rewst.

    Foreign object references

    The actions under this category help manage associations with external objects or resources in other systems. For workflows that need to interact with or refer to objects in external systems, these actions provide functionality for fetching and managing these references, enabling interoperability and extended functionality in workflows. Link an external reference to a workflow execution with an identifier and reference ID. Retrieve details later by specifying parameters. Choose user and set failure conditions for pre-existing links.


    Associate External Object

    Template actions

    Templates are vital components of workflows, allowing dynamic content to be incorporated into tasks. The actions here provide an interface for creating, updating, fetching, and deleting these templates, effectively aiding in workflow customization and dynamic content management.

    Use our template actions to manage templates that exist at the organization level of the workflow in which you are building. These actions won't work for child orgs of that workflow's organization.

    Create Template

    Form and trigger actions

    Forms are typically used for collecting user inputs, while triggers are events that initiate a workflow. The actions here include listing, fetching, and managing forms and triggers, which can streamline the management of these essential components, leading to more efficient workflows and user interactions.

    List Forms

    Description: Retrieves a list of all forms in the system.

    App Builder-specific Rewst actions

    These Rewst actions are for use with only.

    List Apps

    Description: Lists all apps, also known as sites, associated with the current organization in Rewst.

    Parameters:

    Generic GraphQL request action

    This action has its own separate documentation page .

    Parameters:
    • Organization ID: Identifier of the organization to fetch data for. This ID is unique for each organization within Rewst.

    Output: Outputs the details of the organization, which includes the Organization ID, Domain, Name, Managing Organization ID, and Enabled Status.


    Bulk Create Organizations

    Description: Create multiple organizations at once within Rewst.

    Parameters:

    • Managing Organization ID: The ID of the managing organization. If not provided, the organization that initiated the operation will be set as the managing organization.

    • Organizations (Required): List of organization details to be created. Each entry in the list should contain the following parameters:

      • Is Enabled: Boolean indicating if the organization should be enabled.

      • Name: The name of the organization in Rewst. The name must be unique.

      • Domain: The domain name of the organization's website, excluding protocol.

    Output: Outputs a list of newly created organizations, each with its corresponding Organization ID, Domain, Name, Managing Organization ID, and Enabled Status.


    Create Organization

    Description: Create a single organization within Rewst.

    Parameters:

    • Name (Required): The name of the organization to be created. This name must be unique within Rewst.

    • Domain (Optional): The domain of the new organization, excluding protocol.

    • Managing Organization ID: Identifier of the managing organization. If not provided, the organization that initiated the operation will be set as the managing organization.

    • Is Enabled (Optional, default is true): A boolean indicating whether the new organization is enabled or not.

    Output: Outputs the details of the newly created organization, which includes the Organization ID, Domain, Name, Managing Organization ID, and Enabled Status.


    List Organizations

    Description: Fetch a list of all organizations in Rewst.

    Parameters:

    • Managing Organization ID: Identifier of the managing organization to fetch organizations for. This ID is unique for each organization within Rewst.

    • Name (Optional): Name of the organization to search for. The name must be unique within Rewst.

    Output: Outputs a list of organizations, each with its corresponding Organization ID, Domain, Name, Managing Organization ID, and Enabled Status.


    Update Organization

    Description: Update details of an existing organization within Rewst.

    Parameters:

    • Organization ID: Identifier of the organization to be updated. This ID is unique for each organization within Rewst.

    • Name (Optional): New name for the organization. This name must be unique within Rewst.

    • Domain (Optional): New domain for the organization, excluding protocol.

    • Is Enabled (Optional): Updated enabled status for the organization. It is a boolean value.

    Output: Outputs the updated details of the organization, which includes the Organization ID, Domain, Name, Managing Organization ID, and Enabled Status.


    List Integrations For Organization

    Description: This action retrieves a comprehensive list of integrations installed for a specific organization in Rewst, providing a detailed overview of each integration's attributes.

    Parameters:

    • Organization ID: The unique identifier for an organization in Rewst. This parameter is required to fetch the specific integration details pertinent to the organization.

    Output:

    The action generates a detailed list of integrations, including:

    • Integration ID, Name, and Reference: Basic identifiers providing clarity on each integration.

    • Pack Configurations: In-depth details of configurations applied to each integration, offering insights into their setup and customization.

    • Applied Triggers: Information on workflow triggers linked to each integration, useful for understanding operational dynamics.

    • Foreign Object References: Crucial data points that link integrations to external references, enhancing cross-platform data synchronization and management.

    Parameters:
    • Organization ID: (Optional) A dropdown list of the labels that correlate with the ID (visible in the code editor window) of an organization you'd like to retrieve.

    Output: Returns a list of objects. Each object represents an organization variable and includes the ID, name, value, organization ID, category, timestamps, associated organization, and more.


    Get Organization Variable

    Description: Retrieves a specific organization variable for a selected organization using the variable's name or value.

    Parameters:

    • Name: (Optional) The name of the organization variable.

    • Organization ID: (Optional) A dropdown list of the labels that correlate with the ID of an organization you'd like to retrieve.

    • Value: (Optional) The value of the organization variable.

    Output: Returns an object (or list of objects) representing the organization variable, including the ID, name, value, organization ID, category, timestamps, associated organization, and more.


    Create Organization Variable

    Description: Creates a new organization variable that's available for use within an organization's workflow context.

    Parameters:

    • Name: The name of the organization variable.

    • Value: The value of the organization variable.

    • Category: The category used to define the organization variable. Options include: general, contact, system, secret.

    • Use as default: If true, this variable's value will be used as the default value for any managed organizations without a defined value.

    • Organization ID: (Optional) The ID of the organization.

    Output: Returns an object containing the new variable details including the ID, name, value, organization ID, category, timestamps, associated organization, and more.


    Bulk Upsert Organization Variables

    Description: Performs a bulk operation to create or update organization variables.

    Parameters:

    • Organization Variables: A list of objects where each object represents an organization variable to be created or updated. Each object must include:

      • Name: The name of the organization variable.

      • Value: The value of the organization variable.

      • Category: The category used to define the organization variable. Options include: general, contact, system, secret.

      • Use as default: If true, this variable's value will be used as the default value for any managed organizations without a defined value.

      • Organization ID: (Optional) The ID of the organization.

    Output: Returns a list of objects. Each object represents an upserted organization variable and includes properties such as ID, name, value, organization ID, category, timestamps, associated organization, and more.


    Delete Organization Variable

    Description: Deletes a specific organization variable for a selected organization using the variable's name.

    Parameters:

    • Organization ID: The ID of an organization.

    • Name: The name of the organization variable to be deleted.

    Output: Returns an object indicating the success of the operation, including the name of the deleted variable and the ID of the organization from which it was deleted.

    Parameters:
    • Include User Invites?: Whether or not to include user invites in the results.

    • Which Invites: Which invitees to include. Can be all, accepted, or pending.

    Output: A list of users with details like ID, role, organization ID, assigned role IDs, username, and a boolean indicating superuser status.


    Get User

    Description: Get user by email or ID in Rewst.

    Parameters:

    • ID: The ID of a user in Rewst.

    • Organization ID: The ID of an organization in Rewst.

    • Email address: The email of a user in Rewst.

    Output: The returned object includes the user's details like ID, role, organization ID, assigned role IDs, username, and a boolean indicating superuser status.


    List User Invites to Rewst

    Description: Get user invite list by your organization in Rewst.

    Parameters: No parameters needed for this action.

    Output: The returned list includes a list of user invite objects. Each object contains the invite's ID, email, organization ID, assigned role IDs, a boolean indicating acceptance status, and the ID of the inviter.


    Invite User to Rewst

    Description: Invite a user to your organization in Rewst.

    Parameters:

    • Email: Email address of the user to invite.

    • Roles: Role IDs to assign to user.

    Output: The returned object includes the invite details such as ID, email, organization ID, assigned role IDs, a boolean indicating acceptance status, and the ID of the inviter.


    Delete User Invite

    Description: Delete a user invite from your organization in Rewst.

    Parameters:

    • Email: Email address of the user invite to delete.

    Output: The returned object shows the number of invites deleted.


    Link Microsoft CSP Customer

    Description: Link one or more Rewst organizations to a microsoft CSP customer in Microsoft

    Parameters:

    • CSP Integration Configuration ID: The ID of a Microsoft CSP integration configuration in Rewst.

    • Microsoft CSP Customer ID: The ID of the Microsoft CSP Customer in Rewst that you want to link your organization or organizations to.

    • Organization IDs: The list of Rewst organization IDs to link.

    Output: The returned object lists a confirmation of the linked organizations


    Get Microsoft CSP Customer

    Description: Get data for a single Microsoft CSP customer in Rewst.

    Parameters:

    • CSP Integration Configuration ID: The ID of a Microsoft integration configuration in Rewst.


    List Microsoft CSP Customer

    Description: Get a list of Microsoft CSP customers in Rewst.

    Parameters:

    • CSP Integration Configuration ID: The ID of a Microsoft integration configuration in Rewst.

    • Microsoft CSP Customer ID: The ID of the Microsoft CSP Customer in Rewst that you want to link your organization or organizations to.

    • Organization IDs: The list of Rewst organization IDs to link.


    Unlink Microsoft CSP Customer

    Description: Unlink one or more Rewst organizations from a Microsoft CSP customer in Rewst.

    Parameters:

    • CSP Integration Configuration ID: The ID of a Microsoft integration configuration in Rewst.

    • Microsoft CSP Customer ID: The ID of the Microsoft CSP Customer in Rewst that you want to link your organization or organizations to.

    • Organization IDs: The list of Rewst organization IDs to link.

    Output: The returned object lists a status for the unlink action


    Linking external resources, like tickets from a PSA system, to your workflow executions can streamline management and enhance traceability. This section walks through the steps to associate an external object within your workflow executions.

    Key Points:

    • Association: Connects an external system's resource to your workflow.

    • Conflict Handling: Optionally fails if a pre-existing link is detected.

    • User Execution: Runs under specified user or default user.

    Parameters:

    • identifier: Unique identifier of the external resource you'd like to associate.

    • reference_id: Reference for the external resource that you will be able to call back on.

    • run_as_user (optional): Defined user's ID or default user's ID (if blank) for running the task.

    • fail_on_conflict (optional): Set this option to true if you don't want to overwrite any existing reference_id/identifier pair already exists.

    Output

    The resulting task's output returns the verified information about the associated external object.


    Get External Reference

    Facilitates the retrieval of details about the any external integration or manually set references. You can use it to fetch all external integration references associated with a specific organization in Rewst or to find the organization and workflow execution associated with a specific external reference ID.

    Key Points:

    • Retrieval: Fetches external resource information.

    • User Execution: Runs under specified user credentials or default user.

    • Organization Specific: Requires organization ID for context.

    Parameters

    • org_id: ID of the organization in Rewst.

    • identifier: Unique identifier of the external resource.

    • reference_id: Reference ID of the external resource.

    • run_as_user (optional): Specify user credentials.

    Output

    Returns detailed information about the external reference(s), such as the org_id in Rewst linked to it, the type of identifier, and the external reference_id. This information is helpful for cross-system data synchronization and management.


    Description: Lets you create a new template.

    Parameters:

    • Name: The name of the template.

    • Description: A brief description of the template.

    • Body: The actual template content.

    • Content Type: The type of content used in the template.

    • Language: The language used in the template. Options include: html, markdown, powershell, python, yaml.

    Output: The action returns the newly created template's information, including its id.


    Get Template

    Description: Lets you retrieve the details of an existing template.

    Parameters:

    • Template ID: The ID of the template you wish to retrieve.

    Output: The action returns the requested template's information, including its name, description, body, content_type, and language.


    List Templates

    Description: Lets you retrieve a list of all existing templates.

    Parameters: No parameters are required for this action.

    Output: The action returns a list of all templates, with each entry including information about a template, such as its id, name, description, body, content_type, and language.


    Update Template

    Description: Lets you update the details of an existing template.

    Parameters:

    • Template ID: The ID of the template you wish to update, it is a required field.

    • Body: The new content of the template.

    • Content Type: The new type of content used in the template. The options are message and script.

    • Description: A brief description of the template.

    • Language: The new language used in the template. The options include: html, markdown, powershell, python, yaml.

    Output: The action returns the updated template's information, including its id.


    Delete Template

    Description: Lets you delete an existing template.

    Parameters:

    • Template ID: The ID of the template you wish to delete.

    Output: The action does not return any specific output, but its execution status indicates whether the deletion was successful.

    Parameters: No parameters are required for this action.

    Output: The action returns a list of all forms, each item including information about a form.


    Get Form

    Description: Retrieves details about a specific form in the system.

    Parameters:

    • Name: The name of the form.

    • ID: The ID of the form.

    Output: The action returns information about the specified form.


    List Triggers

    Description: Retrieves a list of all triggers in the system.

    Parameters: No parameters are required for this action.

    Output: The action returns a list of all triggers, each item including information about a trigger.


    Get Trigger

    Description: Retrieves details about a specific trigger in the system.

    Parameters:

    • Name: The name of the trigger.

    • ID: The ID of the trigger.

    • Enabled: A boolean value that indicates whether the trigger is enabled or not.

    Output: The action returns information about the specified trigger.

  • Run as user - optional: The ID of the user to run the query as. If omitted, defaults to the workflow's context user.

  • Output: Returns a list of apps, including details such as ID, name, and organization association.


    List Pages

    Description: Lists all pages for a specified app in Rewst.

    Parameters:

    • App ID: The ID of the app for which to fetch pages.

    • Run as user - optional: The ID of the user to run the query as.

    Output: Returns a list of pages within the specified app, including each page's ID, name, and metadata.


    List Page Elements

    Description: Lists all elements within a specific page in an app, including their Element IDs and key properties.

    Parameters:

    • Page ID: The ID of the page whose elements you want to retrieve.

    • Run as user - optional: The ID of the user to run the query as.

    Output: Returns a dictionary mapping element IDs to their properties, including type, Craft ID, and other element-specific details.


    Update Text Element Content

    Description: Updates the text-based content of a page element— such as a text block, button, link, HTML container, markdown block, or accordion— within a specified page.

    Parameters:

    • Content: The new text content to set for the element.

    • Page ID: The ID of the page containing the element to update.

    • Element ID: The ID of the page element whose text content you want to update.

    • Run as user - optional: The ID of the user to run the query as.

    Output: Returns the updated element's details, including confirmation of the new text content.

    App Builder
    here

    Build a form with Rewst's Form Builder

    Learn how to build and customize your Rewst Forms

    Create a new form

    The part of Rewst you use to create and edit forms is called the Form Builder. To access it, navigate to Automations > Forms, and click .

    In the Create New Form dialog, give your form a descriptive name. Remember, as you build more in Rewst, your list of forms will grow significantly. Following proper naming conventions will save you time in finding your right form later on.

    The Form Builder is similar to Rewst's Workflow Builder in that it has a list of options on the left, called form fields, which can be dragged and dropped onto the canvas in the center of your screen.

    Each of these options will relate to your inputs, or the information that goes into the form. With the exception of the Text/Markdown field which is only used for presenting data to the end user, all other fields are used as data input and contain a field name, field label and field description. The field name is the variable name used within the workflow once the form has been submitted. The field label and field description are used to format the appearance of the form.

    Using the correct fields ensures your workflows receive clean, organized data.

    Form field options

    Click on any of the below form field options to expand and see its information.

    Text/Markdown

    The Text/Markdown field lets you present text, optionally formatted with Markdown. You can also render Jinja in these fields, which can be useful for presenting organization variables, or rendering a Markdown table with data from elsewhere in the form.

    Drop-down

    Drop-down fields let you select from multiple options, which can either be hard coded into the form or dynamically generated. Each option on the form has a label and a value, and default options can be preselected if specified. There are also options for:

    • Auto-Populate: if enabled, will always pre-populate the field if only a single option has been returned.

    Multi-Select

    Multi-select is similar to the dropdown field, but lets you select as many options as you like, up to a maximum number of options which can be specified on the field.

    Here are two examples, one for returning a specific item within the list, and one for checking if values are provided:

    Checkbox

    The Checkbox field provides a toggle with a true/false value for the form. You can also change the label positioning.

    Radio Buttons

    The Radio Buttons field offers a selectable single option. It can also be dynamically populated in the same way as a dropdown or multi-select field, but doesn't allow for the additional options of auto-populate, allow custom input, always skip cache and always override option. For this reason, radio buttons are rarely used with dynamic options.

    Text Input

    The Text Input field accepts a single line text string. You can also perform regex validation and error reporting, or populate the field with a default value.

    Number Input

    The Number Input field accepts numbers, as long as they meet the Python definition of numbers: whole numbers or floats. Set a default value, as well as minimum and maximum values.

    Multi-Line Input

    The Multi-Line Input field accepts large amounts of text. No validation is available for this field.

    Date

    The Date field can be set up to accept dates, or times and date times together.

    Note that the time zone or this field is based on your browser locale. Rewst converts the time into UTC when passed into the workflow without the time zone data. As an example, if you're in EST and you select 6pm, the workflow will receive this as 1pm UTC, due to the 5 hour offset. Adjust your submission for this time difference when you are submitting a form for a customer in a different time zone from yourself, and need to specify a time.

    File Upload

    The File Upload field allows for the uploading of specific file types:

    .CSV .JSON If you are working with an XL or XLSX file format, before uploading.

    Dynamic options in forms

    Dynamic options automatically fetch data from integrations, thereby eliminating the need for manual data entry and keeping form options up-to-date with the latest data. For example, if you're managing hiring information within your PSA, dynamic options can automatically pull this data into the form, ensuring that users always have the most current information.

    There are two types of dynamic options: integration reference and workflow generated.

    Option one: Integration reference

    A reference option is a dynamic field pulled directly from predefined actions. It works well for straightforward data retrieval, but may require conversion to a workflow-generated option for data manipulation, as this doesn't give any filtering options and will pull directly from the API endpoint.

    Integration reference example

    Selecting the Microsoft Graph integration to list all users.

    Pulling data straight from the integration like this only works at the top, parent level organization where the integrations are installed. This option won't work for dynamically pulling child organization data. To achieve this, you would require an options generator.

    Option two: Workflow generated options

    If you want more flexibility around the output of the data your user is seeing, you may need to opt for a workflow generated option instead, which allows for in-depth data manipulation using . We cover what these are and how to use them in Cluck U’s and . If you’ve already taken our courses and want a refresher, see our documentation on option generators and .

    Alternatively, dynamic forms use cases can be handled with our options filter feature. The options filter makes customizing drop-down fields within forms straightforward for those who want to add filtering without updating an options generator workflow. It takes inputs, filters them, and produces an output agnostic of the data source. See our separate .

    This setup requires the workflow type be an option generator. See our for more details on this functionality. The below documentation is high-level only.

    Options generator example

    In this image, what is shown to the user is what is set as the label for the list contents. Ultimately, it can be whatever you want it to be, using Jinja to manipulate that output correctly. The ID is the value or unique ID of what the workflow is referencing for its future actions.

    Set default options

    Default options can be selected for a form field linked to a workflow by following these steps.

    1. Add a boolean property to each option result.

    2. Define the boolean property for the Default Selected Field value.

    Sample data returned by a workflow:

    Fields to be filled out in the form:

    • Value Field: id

    • Label Field: label

    • Default Selected Field: current_default

    Dynamic form links

    A dynamic form link is a special type of URL that automatically directs users to the form specific to the organization they belong to in Rewst. Rather than using a static form link that always goes to the same location, a dynamic form link adapts depending on who is accessing it.

    When sharing a form, instead of clicking View Direct URLs, you can click Copy URL. This generates a dynamic link that looks like this:

    When a user opens this link:

    1. The system checks who is logging in.

    2. It validates which organization the user belongs to.

    3. The user is then automatically redirected to the correct form URL for their organization.

    This ensures that users always land on the right form instance without needing to know or select their organization manually. Use a dynamic form link whenever you have a form that multiple organizations or users need to access, or when you want to provide a single, easy-to-share URL rather than multiple specific links.

    Dates in forms

    Form date formats — DD/MM/YYYY) versus MM/DD/YYYY— are influenced by browser locale settings, not controlled by the application itself. IT admins could deploy the desired locale to all of their customers if they want to ensure consistent appearance. Setting it once in the browser will set it for all forms.

    Set your browser's locale

    Your browser’s locale controls:

    • How dates and times appear

    • The language used in websites and spellcheck

    • The region format for numbers and currency

    Follow the steps below for your relevant browser to use only the region you need, and remove the others for consistent behavior.

    Mozilla Firefox

    Open Language Preferences

    1. Navigate to Settings > General > Language.

    Google Chrome

    Open language settings

    1. In the address bar, go to:

    Microsoft Edge

    Open Language Settings

    1. Navigate to:

    Then, confirm your browser's locale:

    1. Open the browser console by pressing F12, then navigating to Console.

    2. Run:

    3. Expected outputs are as follows.

    Region
    navigator.language
    Date rxample
    Format

    Workflow inputs

    Workflow inputs in Rewst offer a flexible way to define specific inputs to a workflow via a form. This functionality allows you to handle various client cases and attributes dynamically. By understanding these concepts and utilizing the provided examples, you can create versatile and dynamic forms tailored to your specific needs.

    Below are some key aspects of workflow inputs:

    Use org variables for client-specific workflows

    If you have a form used across multiple clients, each with distinct environments like Microsoft 365 or On-Prem, you can use an o to dictate the source of the data.

    For example, by employing {{ ORG.VARIABLES.primary_identity_provider }}, which is set per client as either on_prem or azure_ad, you can use the same form for both client cases. The form will be pulled from the relevant system.

    Hard-code attributes for efficiency

    Instead of creating separate workflows for various attributes such as department, userPrincipalName, or ID, you can use a single workflow with a hard-coded element. This approach takes your input and returns the desired property.

    For example, the attribute department can be hard-coded to allow a single workflow to handle different returned properties.

    Here's a Jinja code snippet for achieving this:

    Test a form: How to get a form's URL

    Recall that you can access all forms in your form list in Rewst. Understanding how to test a form can sometimes be confusing due to its intrinsic link to a workflow. To get the Form URL for testing directly from a workflow:

    1. Locate the on the workflow.

    2. Click View Form URLs.

    3. Select the desired organization's form from the list.

    Restrict form drop-downs

    The onboarding form includes a number of fields to be filled out when onboarding new users. The default behavior of all the drop-down fields is to pull the list of options from the API. This is because the drop-down fields have Dynamic Options toggled on.

    While this may work in many cases, there are scenarios where it makes sense to limit the number of options based on the customer segment you're working with. An example of this might be that you need to limit which email domains each customer sees. You may also want to limit which locations customers can choose from. In any case, you can set specific values for the default_form organization variables to use in your forms.

    The example below is specifically for the User Onboarding Form and workflow, as it is currently the most likely use case.

    Add an organization variable to a form

    You can add default values for any of the form organization variables below:

    To view the form org variables table, .

    Limit the email domains in the user onboarding form

    Add the organization variable to an organization

    1. Navigate to Configuration > Organization Variables.

    2. Click Add at the top right.

    3. Enter in the following for the new organization variable:

      • Name: form_default_email_domain

    Any value you add to a variable must exist in the list that the form value is pulling from. An example of this would be that any email domain added as a default must exist in the list that is pulled from the Microsoft API.

    Next, the variable can be added to the form field.

    Add the organization variable to the form field

    1. Navigate to Automations > Forms.

    2. Open the User Onboarding Form.

    3. Click to open the settings for the Email Domain Name field.

    4. Enter true in the schema.enumSourceWorkflow.input.force_default setting.

    You only need to add the latter half of the form_default variable when adding it to the schema.enumSourceWorkflow.input.choose_variable setting.

    1. Click Save.

    Make sure to set the org variable values for any company organization using the form. For example, say there are three company organizations that need to use the same form with a list of three domains to choose from. Each organization needs to have the variable added with the domain values set. If you only set the variable and values in Company 1, the other two Companies won't see any options to choose from.

    Allow Custom Input
    : lets the enduser write in the field and have that be the value passed into the workflow.
  • Always Skip Cache: causes the option generator to always run instead of pulling from a cache. Note that the cache for a form field invalidates every 8 hours. Typically the first run of the day will be slower than the rest.

  • Always Override Option: used when the auto-populate setting is enabled, this will cause the field to repopulate itself. This is needed in cases where the field is populated via an option generator and another field is being used as input for the option generator. In that case, you would need the option generator to run again, as the output would likely be different.

  • These are used most commonly when the list of options is being generated via an options generator . Drop-down selection is limited to a single option. For multiple options for selection, see the multi-select form field option.

    Under Language and Appearance, click Choose… next to Language for displaying pages.

  • Add only your desired language region:

    • English (Australia)

    • English (United States)

    • English (United Kingdom)

  • Remove Others

    • Highlight any extra languages and click Remove so only one remains.

    Confirm Locale

    (Optional advanced step)

    1. In the address bar, type about:config.

    2. Search for: intl.locale.requested

    3. Set it to:

      • en-AU for Australia

      • en-US for United States

      • en-GB for United Kingdom

    4. Restart Firefox.

    Under Languages, click Add languages.

  • Search for and add only one of the following, depending on your region:

    • English (Australia) → en-AU

    • English (United States) → en-US

    • English (United Kingdom) → en-GB

  • Remove unused languages

    • Click the ⋯ next to any other languages and select Remove. This prevents Chrome from using fallback locales.

    Set as display language

    • Click the ⋯ next to your chosen language.

    • Select Display Google Chrome in this language.

    • Restart Chrome to apply the change.

    Check your date/time format

    • Open your system settings to make sure the region matches your browser locale:

      • Windows: Settings > Time & language > Language & region

      • macOS: System Settings > General > Language & Region

    Click Add languages and add only one:

    • English (Australia)

    • English (United States)

    • English (United Kingdom)

    Remove Extra Languages

    • Click the ⋯ beside any other languages and choose Remove.

    3. Set Display Language

    • Click the ⋯ next to your chosen language.

    • Select Display Microsoft Edge in this language and restart Edge.

    4. Match Your System Region

    • Go to Settings > Time & language > Language & region > Regional format

    • Choose the same region: Australia, United States, or United Kingdom.

  • Value: ["email domain"]

  • Category: General

  • Organization: Choose Your Organization

  • Enter email_domain in the schema.enumSourceWorkflow.input.choose_variable setting.

  • Australia

    "en-AU"

    09/10/2025, 13:30:00

    DD/MM/YYYY

    United States

    "en-US"

    10/9/2025, 1:30:00 PM

    MM/DD/YYYY

    United Kingdom

    "en-GB"

    09/10/2025, 13:30:00

    convert it to CSV
    Jinja
    Rewst Foundations
    micro course
    here
    here
    options filter documentation here
    option generator workflow page
    rg variable
    trigger
    click here

    DD/MM/YYYY, 24-hour clock

    {{ CTX.<field_name>[0].value|d }}
    {{ CTX.<field_name>|length > 0 }}
    [
        {"label": "Adam", "id": "1", "current_default": false},
        {"label": "Matt", "id": "2", "current_default": false},
        {"label": "Jareth", "id": "3", "current_default": true}
    ]
    https://app.rewst.io/form/<form_trigger_guid>
    chrome://settings/languages
    edge://settings/languages
    console.log(navigator.language);
    console.log(new Date().toLocaleString());
    {%- set attribute_collection = [] -%} 
    {%- set my_attribute = CTX.attribute -%} 
    {%- set my_data = CTX.data|selectattr(my_attribute) -%} 
    {%- for user in my_data -%}
        {%- if user[my_attribute] or false -%}
            {%- set value=user[my_attribute] -%}         
            {%- set tmp = attribute_collection.append({my_attribute:value}) -%}     
        {%- endif -%} 
    {%- endfor -%} 
    {{- attribute_collection | unique(attribute=my_attribute) | sort(attribute=my_attribute)  -}}

    Core actions

    Core actions in Rewst are your gateway to the platform's vast array of intrinsic functionalities. These actions, usable right out of the box, offer features ranging from ad-hoc HTTP requests to document parsing.

    Core actions are used in the same way as regular actions within workflows. They are selected from the list of available actions, configured based on their parameters, and then added to the workflow at the appropriate place.

    Expand each of the action types below to see their individual information.

    No-Operation (Noop)
    • Action Name: noop

    • Description: Does nothing. Often used for logic or as a placeholder in the workflow.

    • Parameters: None.

    Ad-hoc HTTP Requests

    Action Name: HTTP Request

    Performs an HTTP request to a specified URL, supporting a variety of methods, body content types, and configurations. This is useful for interacting with APIs or other web services within a workflow, or for performing any other tasks that involve HTTP requests.

    Parameters

    • URL: The URL to which the HTTP request is sent.

    Create and Await Webhook Actions

    Action Name: Create Webhook

    Allows for the creation of a one-off webhook for which can then be used by the Await Webhook action.

    • Parameters: This action requires the methods allowed to access the webhook, the response status, response headers, response body, and an expiration timeout.

    Email, SMS & Confirmation Actions

    Action Name: sendmail

    Allows for the sending of an email.

    • Parameters: This action requires a sender prefix (sender), with multiple options available, the recipient's email address (to

    Delay Workflow Actions

    Action Name: Delay Workflow For Period

    Pauses the workflow for a specified duration.

    • Parameters: The number of days, hours, minutes or seconds to delay the workflow.

    Mock Task

    Action Name: mock

    Overview

    The Mock action is designed to provide you with the capability to simulate the result of a not yet implemented action. This is particularly useful during workflow development and testing phases as it allows you to simulate responses from services that are not yet available or are impractical to call during the development process.

    When to Use

    The Mock

    Debugging with Templates

    Action Name: Debug

    Overview

    The Debug action is a utility feature in our workflow system, specifically designed to assist with debugging and logging purposes. This action can help in understanding the flow of data within your workflows, troubleshoot problems, and generally help you understand what's happening at a certain point in the workflow execution. It logs the input parameters it receives and returns the same as its output.

    When to Use

    You might want to use the

    Parse HTML Action

    Action Name: Parse HTML

    Parse XML Action

    Action Name: Parse XML

    Other Core Actions

    DNS Query

    Action Name: DNS Query

    • Description: Queries a nameserver for DNS records associated with a given URL.

    Output: None
  • Request Method: The HTTP method to use for the request. You can select from the dropdown options (HEAD, GET, POST, PUT, DELETE, OPTIONS, TRACE, PATCH, PURGE).

  • Auth Username: The username for basic HTTP Authentication, if needed.

  • Auth Password: The password for basic HTTP Authentication, if needed. (This parameter is secret to ensure security.)

  • Allow Redirects: Specifies whether the HTTP request will follow redirects. By default, it's set to true.

  • Body: The body to send with the request. This parameter is not required if JSON or Files is provided.

  • JSON: The JSON body to send with the request. This field is not required if Body or Files is provided.

  • Files: Here, you can add files to be uploaded with the HTTP request using multipart/form-data. Each file requires the following information:

    • Field Name: The name of the form field (not the filename).

    • File Name: The name of the file.

    • File Contents: Contents of the file to upload.

    • File URL: A publicly-accessible URL to the file contents to upload.

    • Content Type: The MIME type of the file to include in the multipart field.

  • Cookies: Input the cookies to send with the request. You can add more than one cookie by clicking on the + icon.

  • Headers: Specify the custom HTTP headers to be sent with the request. You can add more than one header by clicking on the + icon.

  • Params: Enter the query parameters to be used with the HTTP request. You can add more than one parameter by clicking on the + icon.

  • Timeout: Enter the timeout for the HTTP request in seconds. The default value is 5.

  • Require Success Status: If you check this box, the task will fail if a non-2xx HTTP status code is returned. This is useful for identifying and handling HTTP errors during the task's execution.

  • Output: The action returns the content returned by the server in response to the HTTP request. This could be a success message, a failure message, a data object, or any other content that the server sends as a response.

    Note: If you need more advanced security around calling particular endpoints, you can also use a Custom Integration in addition to this HTTP Request action. This allows for enhanced security and customization when interacting with your external APIs.

  • Output: The output of this action is the webhook ID and the full URL of the webhook.


  • Action Name: Await Webhook Request

    Waits for a request to a created one-off webhook. Once a request is received, the workflow continues.

    • Parameters: This action only requires the ID of the webhook created from the Create Webhook action.

    • Output: The output includes the HTTP method, query params, headers, JSON or form/multipart data in the body of the request, and the timestamp when the request was received.

    ), the subject of the email (
    subject
    ), the title of the email (
    title
    ), and the message body (
    message
    ). It also has the option to render markdown as HTML (
    render_markdown
    ). You can also fully control the HTML of the email with
    (Custom HTML)
    . This can also reference a template using the
    {{ template(“guid”) }}
    function.
    • Note that if using the Custom HTML field, the message and title fields will be ignored

    • You cannot upload images to Rewst, so any image will need to be externally referenced

    • Emails will still be sent from the rewst.io domain

  • Output: The task doesn't yield an output upon success. It will fail if there are any errors during the process of sending the email.


  • Action Name: Send SMS

    Allows you to send a text message to a specified phone number.

    • Parameters: This action requires the recipient's phone number (phone_number) and the text message (message) to be sent.

    • Output: The output of this action will depend on the implementation details. Usually, it will return a confirmation message or an error message.


    Action Name: Confirmation Email

    Send a confirmation email with reply options to a specified recipient. This action pauses the workflow and places it in an Awaiting-User-Input state. The workflow will not proceed until the confirmation email is interacted with via buttons, or the task times out. You can configure task timeout on the Advanced tab of the action. Task time out means that the action fails. Note that this setup means that buttons are required for the workflow to proceed.

    • Parameters: This action requires the recipient's email address (to), the subject of the email (subject), the title of the email (title), and the message body (message). It also offers user interaction buttons (buttons) and has the option to render markdown as HTML (render_markdown).

    • Output: If the action is correctly executed, a confirmation email will be sent. Output variable inquiry_result is an output of the task and can be used to route the workflow in a specific path. Inquiry_result 's value is that of the button clicked, and is configured as a string value on the action itself in the workflow builder.

    • Confirmation email class and confirmation examples

      • Button classes:

        • Primary; primary

        • Default; default

        • Danger; danger

      • Title class:

        • Title; title

      • Customization options

        • Custom Button CSS - control the CSS styling for the buttons.

        • Custom footer - overwrite the default Rewst footer or remove the footer entirely.

        • Custom Title CSS - customize the title CSS.

    • Example custom button CSS

    • Example custom footer

      <tr>
      
      <td
      
      style="text-align:center;padding:30px 0 30px 0;background-color:#1a2e05;color:#ffffff;">
      
      <p style="display:inline-block;margin-right:10px;">&copy; The Dougnut {% now 'local', '%Y' %}</p>
      
      <p style="display:inline-block;margin-right:10px;"><a
      
      href="https://rewst.io/terms-of-service/">Order</a></p>
      
      <p style="display:inline-block;margin-right:10px;"><a href="https://rewst.io/privacy-policy/">Contact Us</a></p>
      
        
      
      <p style="display:inline-block;margin-right:10px;color:#84cc16"><a href="mailto:[email protected]">Need
      
      
      
    • Example custom title CSS

    • Example logo link

    • Example logo URI

    Output: No specific output, the workflow resumes after the specified delay.


    Action Name: Delay Workflow Until Date/Time

    Pauses the workflow until a specified date and time.

    • Parameters: The date and time when the workflow should resume.

    • Output: No specific output, the workflow resumes at the specified date and time.

    action comes in handy in scenarios such as:
    • When designing new workflows where certain steps are not fully implemented.

    • In testing stages, to simulate conditions without making actual calls to the services.

    • To create controlled conditions in your workflow for troubleshooting issues.

    Input Parameters

    The Mock action accepts the following parameter:

    • Mock Result: This parameter should contain the key / value pairs that you want to be returned by this action. You can press the + to add as many objects as necessary.

    Example Usage

    You are developing a workflow that is expected to interact with a service which is not yet implemented. You know the expected format of the response, and you want to build and test your workflow logic based on that response.

    Let's say you know the response will look something like this:

    You can simulate this response using the Mock action as follows:

    While using the Mock action, the values can be literal Jinja expressions like {{ CTX.name }}above. The action will return this exact input structure wrapped inside a data object, and the Jinja expressions will not be evaluated but returned as is. The result of the action on the workflow results page would look like:

    Result:

    This can be useful for catching issues early in the development phase such as incorrect Jinja expression usage, understanding how the workflow will handle dynamic data, or verifying that your workflow is properly constructed to handle the expected responses from services. It's a way to ensure that your workflow behaves as expected when it starts receiving actual dynamic data.

    Debug
    action in the following scenarios:
    • When developing workflows, to see how data is flowing between tasks and actions.

    • If you're troubleshooting an issue, to inspect the data that's being passed around.

    • When you want to log specific information for auditing or reporting purposes.

    Input Parameters

    The Debug action accepts the following parameters:

    • text: This is a general-purpose text field that will be logged and returned by the Debug action.

    • template: This field takes a reference to a template in your environment that will be rendered and used as part of the action's input. The system will replace any variables in the template with its actual value at the time of template rendering.

    Example Usage

    Let's say we have a template named "Greeting Message" with content # Hey there {{ CTX.name }}.

    We can use this template in the Debug action with the following parameters:

    Assuming CTX.name is set to Rewsty, the rendered template would be # Hey there Rewsty.

    The Debug action will log these parameters and also return them as its output. The results of the action on the workflow results page would look like this:

    Result:

    This tells us that CTX.name was set toRewsty, and the text provided with this action was Testing Debug Action. Using this, you can better understand the state of your workflow at the point this Debug action was executed.

    Overview

    The Parse HTML action is a versatile tool within Rewst, geared to pinpoint and extract specific elements or data from HTML documents. It leverages the power of BeautifulSoup, a Python library recognized for extracting data from HTML and XML files effectively.

    When to Use

    This action is particularly beneficial in these situations:

    • Data Extraction: capturing specific information from the response of an HTTP request.

    • Content Clean-Up: sieving out only the necessary data from complex HTML content.

    • Web Scraping: automating the extraction of specific information from various web pages using defined tags, classes, or identifiers.

    Action Parameters

    The Parse HTML action accepts the following parameters:

    • HTML: The HTML content to be parsed. This could be HTML content from a webpage, obtained using the HTTP Request Core Action.

    • Class: Optionally finds HTML elements based on their class attribute.

    • ID: Optionally searches for HTML elements based on their ID attribute.

    • Query: Employs to specify the operation type:

      • find_all returns all instances of the defined HTML tag.

      • find returns only the first instance of the defined HTML tag.

    • String: Optionally searches for specific text within the HTML content.

    • Value: Identifies the tag or selector to search for in the HTML content. For example, a would find all anchor (<a>) tags in the HTML content.

    Practical Use Case: Extracting Links from 'Hacker News'

    This example involves making a GET request to the Hacker News website and parsing the returned HTML to extract all <a> links.

    The first step uses the Core HTTP Request action to fetch the HTML content:

    You can then use the Parse HTML action to extract all <a> links. The parameters for this action would be set as follows:

    Example Workflow Results

    Here's an example of how the Parse HTML action's input and output might look like on the workflow results page:

    Input from the HTTP Request:

    Result:

    This result contains all <a> tags found in the HTML content.

    To further refine this output, returning only links for externally referenced pages, use the select query style, along with advanced CSS filters:

    The result is a list of strings containing all <a> tags that meet the newly specified criteria:

    To further understand CSS selectors, you can refer to this w3schools article.

    Tip: Parse HTML's functionalities include finding elements by tags (<h1>), class (class_="abc"), text (string="The content"), or id ({"id": "abc"}). When string is the sole argument, only the text is returned, not the whole element, which can help you fine-tune data extraction.

    Overview

    The Core Parse XML action in Rewst is designed to locate and extract specific elements or data from XML documents. This powerful tool, backed by an efficient Python library, facilitates precise data extraction from XML files, simplifying the process of parsing complex data structures.

    When to Use

    Consider using the Parse XML action in these scenarios:

    • Data Extraction and Content Clean-Up: Capture specific information or filter out necessary data from XML-formatted content. This is particularly useful in processing responses from HTTP requests or handling complex XML documents.

    • Web Scraping: Automate the extraction of specific information from various XML sources using defined tags, attributes, or identifiers. It enables you to precisely target the data you need from web resources.

    Action Parameters

    The Core Parse XML action requires the following parameters:

    • XML: The XML content that needs to be parsed. This could be XML content from an API response, obtained using the HTTP Request Core Action.

    • Attributes: (Optional) Allows you to find XML elements based on their attribute key.

    • ID: (Optional) Permits searching for XML elements based on their ID attribute.

    • Selector: Determines the operation type. Options include:

      • find: Returns only the first instance of the defined XML tag.

      • find_all: Returns all instances of the defined XML tag.

      • select: Enables the use of XPath expressions for nested XML tags or conditional searches.

    • String: (Optional) Allows you to search for specific text within the XML content.

    • Value: Specifies the tag or selector to search for in the XML content.

    Practical Use Case: Extracting Books from a Bookstore's XML Data

    Before diving into parsing XML data, you'll need to fetch the XML file. In this use case, the XML file is fetched from a public URL which contains bookstore data in XML format. The first task in the workflow, called get_books, uses the Core HTTP Request action to fetch this XML content:

    Input Parameters:

    The result from this task will look something like this:

    The data field contains the XML content, which is the input for the Parse XML action. The XML content is passed using the Context (CTX) object as CTX.books.data.

    Finding the First Book

    In this scenario, we are using the find operation to return the first book element in the XML:

    Input Parameters:

    The result from this task will look something like this:

    The output includes the first book element in the XML content.

    Selecting All 'Children' Category Books

    For a more complex operation, we can use the select operation with an XPath expression to extract all book tags where the category attribute is children.

    Input Parameters:

    Result:

    The result includes all book tags where the category attribute is children.

    Conclusion

    The Parse XML action provides a powerful way to parse XML data, enabling the extraction of specific data points based on tags, attribute keys, text, or id. It provides both simple and advanced operations, catering to various complexity levels of XML parsing requirements.

    For additional understanding on XPath expressions, refer to this w3schools article.

    Parameters: The URL to query the Nameserver for, the field to query from the nameserver, timeout for the DNS Query (optional, default 60), and the nameserver to use for the query (several options available including Google, Cloudflare, OpenDNS).

  • Output: The specified DNS records associated with the given URL from the queried nameserver.


  • Generate Password

    Action Name: Generate Password V2

    • Description: An upgrade from the deprecated password generation action. It crafts a cryptographically secure password with user-specified values. (This is recommended for use over the deprecated Password Action due to its upgraded structure.)

    • Parameters: length, minimum counts of numeric and capital letter characters, and optional punctuation characters.

    • Output: the generated password is presented under the "password" key in the output.


    UUID

    Action Name: uuid

    • Description: Generates a new UUID (Universally Unique Identifier).

    • Parameters: UUID type (options include uuid1 and uuid4, defaults to uuid4).

    • Output: The generated UUID.

    .title {
    
    font-size: 20px;
    
    line-height: 16px;
    
    font-weight: 700;
    
    font-style: normal;
    
    color: #0c0a09;
    
    text-decoration: none;
    
    letter-spacing: 0px;
    
    padding: 25px 30px 0 30px;
    
    }
    https://google.com
    https://www.svgrepo.com/download/533811/donuts-cake.svg
    a,
    
    a:visited,
    
    a:hover,
    
    a:active {
    
    color: inherit !important;
    
    }
    
      
    
    {
      "name": "Rewsty",
      "valid": true,
      "message": "Successfully completed the task."
    }
    mock_result:
      name: {{ CTX.name }}
      valid: true
      message: Successfully completed the task.
    {
      "data": {
        "name": "{{ CTX.name }}",
        "valid": true,
        "message": "Successfully completed the task."
      }
    }
    text: Testing Debug Action
    template: Greeting Message
    {
      "template": "# Hey there Rewsty",
      "text": "Testing Debug Action"
    }
    publish_result_as: news
    request_method: GET
    URL: https://news.ycombinator.com
    html: {{ CTX.news }}
    style: find_all
    value: a
    html: {
      cookies: {},
      data: "<html>...</html>",
      headers: {...},
      status_code: 200
    },
    query: {
      style: "find_all",
      value: "a"
    }
    [
      "<a href=\"https://news.ycombinator.com\"><img height=\"18\" src=\"y18.svg\" style=\"border:1px white solid; display:block\" width=\"18\"/></a>",
      "<a href=\"news\">Hacker News</a>",
      "<a href=\"newest\">new</a>",
      "<a href=\"front\">past</a>",
      "<a href=\"newcomments\">comments</a>",
      "<a href=\"ask\">ask</a>",
      "<a href=\"show\">show</a>",
      "<a href=\"jobs\">jobs</a>",
      "<a href=\"submit\">submit</a>",
      "<a href=\"login?goto=news\">login</a>"
    ]
    html: {{ CTX.news }},
    style: select
    value: .titleline a[href^='https://']
    [
      "<a href=\"https://arxiv.org/abs/2308.00676\" rel=\"noreferrer\">Electronic Structure of LK-99</a>",
      "<a href=\"https://www.science.org/content/blog-post/room-temperature-superconductor-new-developments\" rel=\"noreferrer\">A room-temperature superconductor? New developments</a>",
      "<a href=\"https://sophiehoulden.com/randomstuff/epitime/?revised\" rel=\"noreferrer\">Epicycle Clock</a>",
      "<a href=\"https://howardism.org/Technical/Emacs/new-window-manager.html\" rel=\"noreferrer\">Emacs is my new window manager</a>",
      "<a href=\"https://ploum.net/2023-08-01-splitting-the-web.html\" rel=\"noreferrer\">Splitting the Web</a>",
      "<a href=\"https://twitter.com/zebulgar/status/1686498517227814912\" rel=\"noreferrer\">Unconfirmed video showing potential LK-99 sample exhibiting the Meissner effect</a>",
      "<a href=\"https://magicloops.dev\" rel=\"noreferrer\">Show HN: Magic Loops – Combine LLMs and code to create simple automations</a>",
      "<a href=\"https://arxiv.org/abs/2307.08378\" rel=\"noreferrer\">eGPU: A 750 MHz Class Soft GPGPU for FPGA</a>"
    ]
    url: http://books.toscrape.com/catalogue/category/books_1/index.html
    request_method: GET
    publish_result_as: get_books
    {
      "cookies": {},
      "data": "<bookstore>...</bookstore>",
      "headers": {...},
      "status_code": 200
    }
    input:
      xml: {{CTX.books.data}}
      selector: find
      value: book
    {
      "value": "<book category=\"cooking\"><title lang=\"en\">Everyday Italian</title><author>Giada De Laurentiis</author><year>2005</year><price>30.00</price></book>"
    }
    xml: {{CTX.books.data}}
    selector: select
    value: book[category='children']
    {
      "value": "<book category=\"children\"><title lang=\"en\">Harry Potter</title><author>J K. Rowling</author><year>2005</year><price>29.99</price></book>"
    }

    Logo Link - customize the hyperlink for the logo image.

  • Logo URI:

    • This will take the link to the image itself.

    • TIP: This is essentially providing a value for the src param of a img tag. You could also provide a base64 encoded value.

  • select enables the use of CSS selectors for nested HTML tags.

    Delivery?</a></p>
    <p style="display:inline-block;margin:0px 4px 0 4px;vertical-align:middle;"><a href="https://www.linkedin.com/company/rewst"><img
    src="https://rewst-splash.s3.us-east-2.amazonaws.com/linkedin.png" width="24" height="24"
    alt="linkedin"></a></p>
    <p style="display:inline-block;margin:0px 4px 0 4px;vertical-align:middle;"><a href="https://twitter.com/rewst_dot_io"><img
    src="https://rewst-splash.s3.us-east-2.amazonaws.com/twitter.png" width="24" height="24" alt="twitter"></a>
    </p>
    </td>
    </tr>
    table, td, div, h1, p {
    font-family: "Times New Roman", Times, serif;
    }
    .primary {
    background: #4d7c0f;
    }
    .default {
    background: #365314;
    }
    .danger {
    background: #dc2626;
    }
    BeautifulSoup filters

    Generic GraphQL request action

    This action is available in the Rewst actions section of the workflow builder's actions list, but is open-ended in its capabilities.

    Description: A generic action for making authenticated requests against Rewst''s GraphQL API. The Generic GraphQL Request action is part of the Rewst action pack and enables:

    • Direct API access: Execute custom GraphQL queries and mutations against Rewst's backend

    • Advanced data retrieval: Access data structures not available through standard actions

    • Custom automation: Build sophisticated workflows with precise data control

    • Administrative operations: Perform bulk operations and administrative tasks programmatically

    Before using the Generic GraphQL Request action, ensure that you have:

    • An understanding of GraphQL query structure and syntax

    • Familiarity with Rewst's data model and available schema

    Parameters:

    • Operation Type: The type of GraphQL operation: query or mutation

    • Graph Operation: The name of the specific GraphQL operation to execute

    • Variable Values: Variables to pass to the GraphQL operation

    Generic GraphQL request action usage examples

    Basic query example

    Mutation example

    Raw query example

    Generic GraphQL request action: Allowed operations

    Queries

    Action and configuration queries

    actionOption - Retrieves a specific action option configuration.

    GraphQL schema

    Usage example:

    actionOptions-Retrieves multiple action options with filtering and sorting.

    GraphQL schema:

    Usage example:

    localReferenceOptions-Gets dropdown options for local reference models.

    GraphQL schema:

    Usage example:

    resourceTypesByPack-Gets resource types organized by pack.

    GraphQL schema:

    Action management queries

    action-Retrieves a specific action definition.

    GraphQL schema:

    Usage example:

    actions-Retrieves multiple actions with filtering.

    GraphQL schema:

    actionsForOrg-Gets actions available to a specific organization.

    GraphQL schema:

    System and Debug Queries

    announcement-Gets system announcements.

    debug-Debug endpoint for system information.

    GraphQL schema:

    Component management queries

    component-Retrieves a specific component definition.

    GraphQL schema:

    components-Gets multiple components for an organization.

    GraphQL schema:

    componentsByRoots-Gets components by their root IDs.

    GraphQL schema:

    componentTree-Gets the component tree structure.

    GraphQL schema:

    Crate management queries

    crateTokenTypes-Gets available crate token types.

    GraphQL schema:

    crate-Retrieves a specific crate.

    GraphQL schema:

    crates-Gets multiple crates with filtering and sorting.

    GraphQL schema:

    crateExportInfo-Gets export information for a workflow to crate.

    GraphQL schema:

    crateUnpackingArgumentSet-Gets crate unpacking argument sets.

    GraphQL schema:

    Feature preview queries

    featurePreviewSetting-Gets a specific feature preview setting.

    GraphQL schema:

    featurePreviewSettings-Gets multiple feature preview settings.

    GraphQL schema:

    Foreign Object Reference Queries

    foreignObjectReference-Gets a specific foreign object reference.

    GraphQL schema:

    foreignObjectReferences-Gets multiple foreign object references.

    GraphQL schema:

    Form management queries

    form-Retrieves a specific form definition.

    GraphQL schema:

    forms-Gets multiple forms with filtering.

    GraphQL schema:

    packConfigsForForm-Gets pack configurations associated with a form.

    GraphQL schema:

    evaluatedForm-Gets an evaluated form for a specific trigger.

    GraphQL schema:

    Microsoft CSP Queries

    microsoftCSPCustomer-Gets Microsoft CSP customer information.

    GraphQL schema:

    microsoftCSPCustomers-Gets multiple Microsoft CSP customers.

    GraphQL schema:

    Trigger instance queries

    orgTriggerInstance-Gets a specific organization trigger instance.

    GraphQL schema:

    orgTriggerInstances-Gets multiple organization trigger instances.

    GraphQL schema:

    Organization variable queries

    orgVariable-Gets a specific organization variable.

    GraphQL schema:

    orgVariables-Gets multiple organization variables.

    GraphQL schema:

    visibleOrgVariables-Gets organization variables visible to a specific organization.

    GraphQL schema:

    Organization management queries

    organization-Gets a specific organization.

    GraphQL schema:

    organizations-Gets multiple organizations.

    GraphQL schema:

    orgSearch-Performs organization search with breadcrumbs.

    GraphQL schema:

    softDeletedOrgs-Gets soft-deleted organizations.

    GraphQL schema:

    Pack action option queries

    packActionOption-Gets a specific pack action option.

    GraphQL schema:

    packActionOptions-Gets multiple pack action options.

    GraphQL schema:

    Pack bundle queries

    packBundle-Gets a specific pack bundle.

    GraphQL schema:

    packBundles-Gets multiple pack bundles.

    GraphQL schema:

    Pack configuration queries

    packConfig-Gets a specific pack configuration.

    GraphQL schema:

    packConfigs-Gets multiple pack configurations.

    GraphQL schema:

    packConfigsForOrg-Gets pack configurations for a specific organization.

    GraphQL schema:

    Pack management queries

    pack-Gets a specific integration pack.

    GraphQL schema:

    packsAndBundlesByInstalledState-Gets packs and bundles organized by installation state.

    GraphQL schema:

    Page management queries

    page-Gets a specific page definition.

    GraphQL schema:

    pageVars-Gets page variables.

    GraphQL schema:

    pages-Gets multiple pages.

    GraphQL schema:

    Permission queries

    permission-Gets a specific permission.

    GraphQL schema:

    permissions-Gets multiple permissions.

    GraphQL schema:

    Sensor type queries

    sensorType-Gets a specific sensor type.

    GraphQL schema:

    sensorTypes-Gets multiple sensor types.

    GraphQL schema:

    Site and app management queries

    site-Gets a specific site/app.

    GraphQL schema:

    sites-Gets multiple sites/apps.

    GraphQL schema:

    getAppPermissions-Gets app permissions for an organization.

    GraphQL schema:

    getSiteTheme-Gets site theme configuration.

    GraphQL schema:

    Tag management queries

    tag-Gets a specific tag.

    GraphQL schema:

    tags-Gets multiple tags.

    GraphQL schema:

    crateTags-Gets tags associated with crates.

    GraphQL schema:

    Task and execution analytics queries

    dailyTaskCountsByDateRange-Gets daily task counts within a date range.

    GraphQL schema:

    taskExecutionStats-Gets task execution statistics.

    GraphQL schema:

    taskLog-Gets a specific task log entry.

    GraphQL schema:

    taskLogs-Gets multiple task log entries.

    GraphQL schema:

    Template management queries

    template- Gets a specific template.

    GraphQL schema:

    templates-Gets multiple templates.

    GraphQL schema:

    jinjaTemplate-Gets a Jinja template for rendering.

    GraphQL schema:

    Trigger type queries

    triggerType-Gets a specific trigger type.

    GraphQL schema:

    triggerTypes-Gets multiple trigger types.

    GraphQL schema:

    Trigger management queries

    trigger-Gets a specific trigger.

    GraphQL schema:

    workflowCompletionListeners-Gets workflow completion listeners.

    GraphQL schema:

    triggers-Gets multiple triggers.

    GraphQL schema:

    triggerDbNotificationErrors-Gets database notification errors for a trigger.

    GraphQL schema:

    User invite queries

    userInvite-Gets a specific user invite.

    GraphQL schema:

    userInvites-Gets multiple user invites.

    GraphQL schema:

    User management queries

    me-Gets current user information.

    GraphQL schema:

    userOrganization-Gets the user's organization.

    GraphQL schema:

    user-Gets a specific user.

    GraphQL schema:

    users-Gets multiple users.

    GraphQL schema:

    getTestUsers-Gets test users.

    GraphQL schema:

    getTestUserSession-Gets current test user session.

    GraphQL schema:

    Workflow analytics queries

    timeSavedGroupByWorkflow-Gets time saved statistics grouped by workflow.

    GraphQL schema:

    timeSavedGroupBySubOrg-Gets time saved statistics grouped by sub-organization.

    GraphQL schema:

    workflowExecutionStats-Gets workflow execution statistics.

    GraphQL schema:

    workflowExecution-Gets a specific workflow execution.

    GraphQL schema:

    workflowExecutions-Gets multiple workflow executions.

    GraphQL schema:

    workflowExecutionContexts-Gets workflow execution contexts.

    GraphQL schema:

    dailyTimeSavedByDateRange-Gets daily time saved within a date range.

    GraphQL schema:

    Workflow patch queries

    workflowPatch-Gets a specific workflow patch.

    GraphQL schema:

    workflowPatches-Gets multiple workflow patches.

    GraphQL schema:

    Workflow management queries

    workflow-Gets a specific workflow.

    GraphQL schema:

    workflows-Gets multiple workflows.

    GraphQL schema:

    workflowNote-Gets a specific workflow note.

    GraphQL schema:

    workflowNotes-Gets multiple workflow notes.

    GraphQL schema:

    workflowTask-Gets a specific workflow task.

    GraphQL schema:

    workflowTasks-Gets multiple workflow tasks.

    GraphQL schema:

    Mutations

    Action option mutations

    createActionOptions-Creates multiple action options.

    GraphQL schema:

    Usage example:

    Clone operations

    unlinkClone-Unlinks a cloned object from its source.

    GraphQL schema:

    Usage example:

    Component mutations

    createComponent-Creates a new component.

    GraphQL schema:

    updateComponent-Updates an existing component.

    GraphQL schema:

    deleteComponent-Deletes a component.

    GraphQL schema:

    duplicateComponent-Duplicates an existing component.

    GraphQL schema:

    Foreign object reference mutations

    createForeignObjectReference-Creates a foreign object reference.

    GraphQL schema:

    createOrUpdateForeignObjectReference-Creates or updates a foreign object reference.

    GraphQL schema:

    Form mutations

    createForm-Creates a new form.

    GraphQL schema:

    Usage example:

    submitForm-Submits form data and triggers associated workflow.

    GraphQL schema:

    setFormTags-Sets tags for a form.

    GraphQL schema:

    shallowCloneForm-Creates a shallow clone of a form.

    GraphQL schema:

    updateForm-Updates an existing form.

    GraphQL schema:

    deleteForm-Deletes a form.

    GraphQL schema:

    Organization trigger instance mutations

    updateOrgTriggerInstance-Updates an organization trigger instance.

    GraphQL schema:

    Organization variable mutations

    createOrgVariable-Creates a new organization variable.

    GraphQL schema:

    Usage example:

    deleteOrgVariable-Deletes an organization variable.

    GraphQL schema:

    updateOrgVariables-Updates multiple organization variables.

    GraphQL schema:

    Organization management mutations

    bulkCreateOrganizations-Creates multiple organizations in bulk.

    GraphQL schema:

    bulkDeleteOrganizations-Deletes multiple organizations in bulk.

    GraphQL schema:

    createOrganization-Creates a single organization.

    GraphQL schema:

    createOrganizations-Creates multiple organizations.

    GraphQL schema:

    deleteOrganization-Deletes an organization.

    GraphQL schema:

    updateManagedAndSubOrganizations-Updates managed and sub-organizations.

    GraphQL schema:

    updateOrganization-Updates an organization.

    GraphQL schema:

    bulkUpdateOrganizationFeaturePreviewSettingByLabel-Bulk updates feature preview settings by label.

    GraphQL schema:

    Pack configuration mutations

    synchronizePackBundleConfigs-Synchronizes pack bundle configurations.

    GraphQL schema:

    createPackConfig-Creates a new pack configuration.

    GraphQL schema:

    deletePackConfig-Deletes a pack configuration.

    GraphQL schema:

    refetchPackConfigRefOptions-Refetches pack configuration reference options.

    GraphQL schema:

    testPackConfig-Tests a pack configuration.

    GraphQL schema:

    updatePackConfig-Updates a pack configuration.

    GraphQL schema:

    updatePackConfigs-Updates multiple pack configurations.

    GraphQL schema:

    Pack mutations

    generatePackOrBundleAuthUrl-Generates authorization URL for pack or bundle.

    GraphQL schema:

    installPack-Installs a pack for an organization.

    GraphQL schema:

    getPackInstallations-Gets pack installation information.

    GraphQL schema:

    getPackPageUrl-Gets the URL for a pack page

    GraphQL schema:

    updatePack-Updates a pack.

    GraphQL schema:

    Page mutations

    createPage-Creates a new page.

    GraphQL schema:

    updatePage-Updates an existing page.

    GraphQL schema:

    deletePage-Deletes a page.

    GraphQL schema:

    updatePageNode-Updates a page node.

    GraphQL schema:

    updatePageNodeByCraftId-Updates a page node by craft ID.

    GraphQL schema:

    Site mutations

    createSite-Creates a new site/app.

    GraphQL schema:

    updateSite-Updates an existing site/app.

    GraphQL schema:

    updateSites-Updates multiple sites.

    GraphQL schema:

    deleteSite-Deletes a site/app.

    GraphQL schema:

    validateSiteCustomDomainDNS-Validates custom domain DNS settings.

    GraphQL schema:

    Tag mutations

    createTag-Creates a new tag.

    GraphQL schema:

    deleteTag-Deletes a tag.

    GraphQL schema:

    updateTag-Updates a tag.

    GraphQL schema:

    updateTags-Updates multiple tags.

    GraphQL schema:

    setOrganizationTags-Sets tags for an organization.

    GraphQL schema:

    Template mutations

    createTemplate-Creates a new template.

    GraphQL schema:

    Security considerations

    1. Always validate user inputs before including in queries

    2. Use organization and permission filters to restrict data access

    3. Track usage patterns for potential security issues

    Common use cases for the Generic GraphQL request action

    Bulk data operations

    Action configuration:

    • Operation type: mutation

    • Operation: updateOrgVariables

    • Variable values:

    Complex reporting

    Action configuration:

    • Operation type: query

    • Operation: workflows

    • Variable values:

    Data synchronization

    Action configuration:

    • Operation type: query

    • Operation: organizations

    • Variable values:

    Troubleshoot the Generic GraphQL request action

    Permission denied

    • Verify the feature flag is enabled for your organization

    Query syntax errors

    • Validate GraphQL syntax using a GraphQL validator

    • Check field names against the schema

    • Ensure variable types match the expected schema types

    Rate limiting

    • Implement exponential backoff for retries

    • Consider breaking large operations into smaller batches

    • Monitor API usage patterns

    Debug tips

    1. Begin with basic queries before building complex operations

    2. For debugging, use the raw_query parameter to see exact queries

    3. Review workflow execution logs for detailed error messages

    4. Build queries incrementally, adding fields and filters gradually

    Schema Reference

    The Generic GraphQL Request action provides access to Rewst's complete GraphQL schema. Key entity types include:

    • Organization: Core organizational data and settings

    • Workflow: Automation workflow definitions and execution data

    • Action: Available actions and their configurations

    • Trigger: Event triggers and their configurations

    Response Fields: Specify the fields to include in the GraphQL response. Only provide the inner content, as it will be wrapped in curly braces. For example, id orgName email { name } .
  • Raw Query: The complete raw GraphQL query string to execute - an alternative to operation-based approach

  • Fields:
    Fields: id, name, domain, createdAt, managedOrgs { id, name }

    Form: Dynamic forms and field definitions

  • Template: Reusable templates and scripts

  • User: User accounts and permissions

  • Pack: Integration packs and their components

  • operation_type: "query"
    operation: "organizations"
    variable_values: 
      limit: 50
      order: [["name"]]
    fields: "id, name, domain, isEnabled"
    operation_type: "mutation"
    operation: "createOrgVariable"
    variable_values:
      orgVariable:
        name: "custom_setting"
        value: "production"
        orgId: "{{ CTX.organization.id }}"
        category: "general"
    fields: "id, name, value, category"
    raw_query: |
      query GetWorkflowDetails($workflowId: ID!) {
        workflow(where: {id: $workflowId}) {
          id
          name
          description
          tasks {
            id
            name
            action {
              name
              pack {
                name
              }
            }
          }
        }
      }
    variable_values:
      workflowId: "{{ CTX.workflow_id }}"
    actionOption(where: ActionOptionWhereInput): ActionOption
    
    type ActionOption {
      actions: [Action!]
      id: ID
      optionLabel: String
      optionValue: String
      organizationId: ID
      organization: Organization
      packConfigId: ID
      resourceName: String
      packConfig: PackConfig
    }
    operation_type: "query"
    operation: "actionOption"
    variable_values:
      where:
        packConfigId: "{{ CTX.pack_config_id }}"
        optionLabel: "environment"
    fields: "id, optionLabel, optionValue, resourceName"
    actionOptions(
      where: ActionOptionWhereInput
      limit: Int
      offset: Int
      order: [[String!]!] = [["optionLabel"]]
    ): [ActionOption!]!
    operation_type: "query"
    operation: "actionOptions"
    variable_values:
      where:
        organizationId: "{{ CTX.org_id }}"
      limit: 50
      order: [["optionLabel", "asc"]]
    fields: "id, optionLabel, optionValue, organization { name }"
    localReferenceOptions(
      modelName: LocalReferenceModel!
      orgId: ID!
      filterArg: JSON
    ): [DropdownOption!]!
    
    enum LocalReferenceModel {
      Crate
      CustomDatabase
      Organization
      PackConfig
      Role
      Template
      TemplateExport
      User
      Workflow
      Trigger
      Form
      Site
      Page
    }
    
    type DropdownOption {
      label: String
      value: String
    }
    operation_type: "query"
    operation: "localReferenceOptions"
    variable_values:
      modelName: "Workflow"
      orgId: "{{ CTX.org_id }}"
      filterArg: {"enabled": true}
    fields: "label, value"
    resourceTypesByPack: [PackResourceTypesContainer!]!
    
    type PackResourceTypesContainer {
      id: ID!
      packName: String!
      resourceTypes: [String!]!
    }
    action(where: ActionInput, search: ActionSearch): Action
    
    type Action {
      actionOptions: [ActionOption!]!
      className: String
      defaultHumanSecondsSaved: Int
      deprecated: Boolean
      deprecationMessage: String
      description: String
      enabled: Boolean
      entryPoint: String
      category: String
      hidden: Boolean
      icon: String
      id: ID
      name: String
      organization: Organization
      orgId: ID
      outputSchema: JSON
      pack(where: PackInput): Pack
      packId: ID!
      parameters(populateOptions: Boolean = true): JSON
      ref: String
      runner: Runner
      uid: ID
      visibleForOrganizations: [Organization!]!
      workflow: Workflow
    }
    operation_type: "query"
    operation: "action"
    variable_values:
      where:
        ref: "http_request"
        packId: "core"
    fields: "id, name, description, parameters, outputSchema"
    actions(
      where: ActionInput
      search: ActionSearch
      limit: Int = 100
      offset: Int
      order: [[String!]!] = [["name"]]
    ): [Action!]!
    actionsForOrg(
      where: ActionInput
      search: ActionSearch
      limit: Int = 100
      offset: Int
      order: [[String!]!] = [["name"]]
      orgId: ID
    ): [Action!]!
    debug: Boolean
    component(id: ID!): Component
    
    type Component {
      id: ID!
      orgId: ID!
      name: String!
      description: String
      currentVersion: Int
      createdBy: User
      createdById: ID
      createdAt: String
      updatedAt: String
      versions: [ComponentVersion!]
      updatedBy: User
      updatedById: ID
    }
    components(orgId: ID!): [Component]
    componentsByRoots(rootIds: [ID]!): [Component]
    componentTree(id: ID!): ComponentTree
    
    type ComponentTree {
      encoded: String!
      component: Component!
      orgId: ID!
      versionNumber: Int
      createdAt: String
      updatedAt: String
      updatedBy: User
    }
    crateTokenTypes: [String!]!
    crate(
      where: CrateWhereInput
      search: CrateSearchInput
      selectedOrgId: ID
    ): Crate
    
    type Crate {
      associatedPacks: [Pack!]
      category: String
      crateTriggers: [CrateTrigger!]
      createdAt: String
      description: String
      id: ID!
      isPublic: Boolean!
      isUnpackedForSelectedOrg: Boolean
      lastPublishedAt: String
      maturity: CrateMaturity
      name: String!
      orgId: ID!
      primaryPack: Pack
      primaryPackId: ID
      providedValue: String
      replicationRegions: [CrateReplicationRegion!]
      requiredOrgVariables: [String!]
      setupAssistance: Boolean
      setupTime: Int
      sourceEnvironment: String
      status: CrateStatus!
      tags: [Tag!]
      tagIds: [ID!]
      tokens: [CrateToken!]!
      triggers: [Trigger!]
      unpackingCount: Int
      unpackedWorkflowId: ID
      updatedAt: String
      workflow: Workflow
      workflowId: ID
      gid: ID
      updatedById: ID
      createdById: ID
    }
    crates(
      where: CrateWhereInput
      search: CrateSearchInput
      selectedOrgId: ID
      limit: Int
      offset: Int
      order: [[String!]!] = [["unpackingCount", "desc"], ["createdAt", "asc"]]
    ): [Crate!]!
    crateExportInfo(workflowId: ID!): JSON
    crateUnpackingArgumentSet(
      where: CrateUnpackingArgumentSetWhereInput
    ): CrateUnpackingArgumentSet
    
    type CrateUnpackingArgumentSet {
      arguments: [CrateUnpackingArgument!]!
      crate: Crate!
      crateId: ID!
      crateTriggerUnpackings: [CrateTriggerUnpacking!]!
      createdAt: String!
      createdBy: User!
      createdById: ID!
      humanSecondsSaved: Int!
      id: ID!
      orgId: ID!
      updatedAt: String
      updatedBy: User
      updatedById: ID
      workflowName: String!
    }
    featurePreviewSetting(where: FeaturePreviewSettingWhereInput): FeaturePreviewSetting
    
    type FeaturePreviewSetting {
      description: String!
      id: ID!
      isStaffOnly: Boolean!
      label: String!
    }
    featurePreviewSettings(
      where: FeaturePreviewSettingWhereInput,
      order: [[String!]!] = [["createdAt"]]
    ): [FeaturePreviewSetting]
    foreignObjectReference(
      where: ForeignObjectReferenceWhereInput
    ): ForeignObjectReference
    
    type ForeignObjectReference {
      action: Action
      actionId: ID
      id: ID!
      identifier: ID
      organization: Organization!
      orgId: ID!
      packConfig: PackConfig
      packConfigId: ID
      referenceId: ID!
      workflowExecution: WorkflowExecution
      workflowExecutionId: ID
    }
    foreignObjectReferences(
      where: ForeignObjectReferenceWhereInput
    ): [ForeignObjectReference!]!
    form(
      where: FormWhereInput
      search: FormSearchInput
      orgContextId: ID
    ): Form
    
    type Form {
      clonedFrom: Form
      clonedFromId: ID
      cloneOverrides: JSON
      clones: [Form]
      createdBy: User
      createdById: ID
      createdAt: String
      description: String
      fields(orgContextId: ID): [FormField]
      id: ID!
      isSynchronized: Boolean
      name: String!
      organization: Organization!
      orgId: ID!
      tags: [Tag!]!
      triggers: [Trigger!]
      unpackedFrom: Crate
      unpackedFromId: ID
      updatedAt: String
      updatedBy: User
      updatedById: ID
      warrant: Warrant
    }
    forms(
      where: FormWhereInput
      search: FormSearchInput
      limit: Int
      offset: Int
      hasTagIds: [ID]
      order: [[String!]!] = [["name"]]
    ): [Form!]!
    packConfigsForForm(formId: ID!, orgId: ID!, triggerId: ID): [PackConfig!]!
    evaluatedForm(
      where: EvaluatedFormWhereInput
      orgContextId: ID
    ): Form
    microsoftCSPCustomer(
      cspPackConfigId: ID!
      where: MicrosoftCSPCustomerWhereInput
    ): MicrosoftCSPCustomer
    
    type MicrosoftCSPCustomer {
      createdAt: String!
      companyName: String!
      cspTenantId: String!
      hasConsent: Boolean!
      id: ID!
      linkedOrganizations: [Organization!]
      tenantId: String!
      updatedAt: String!
    }
    microsoftCSPCustomers(
      cspPackConfigId: ID!
      search: MicrosoftCSPCustomerSearchInput,
      where: MicrosoftCSPCustomerWhereInput
    ): [MicrosoftCSPCustomer!]!
    orgTriggerInstance(
      where: OrgTriggerInstanceWhereInput
      search: OrgTriggerInstanceSearchInput
    ): OrgTriggerInstance
    
    type OrgTriggerInstance {
      id: ID!
      isManualActivation: Boolean
      organization: Organization
      orgId: ID
      lastSearchedAt: String
      trigger: Trigger
      triggerId: ID
      state: JSON
      createdAt: String!
      updatedAt: String!
    }
    orgTriggerInstances(
      where: OrgTriggerInstanceWhereInput
      search: OrgTriggerInstanceSearchInput
      limit: Int
      offset: Int
      order: [[String!]!] = [["createdAt"]]
    ): [OrgTriggerInstance!]!
    orgVariable(
      where: OrgVariableWhereInput
      search: OrgVariableSearchInput
      maskSecrets: Boolean
    ): OrgVariable
    
    type OrgVariable {
      cascade: Boolean!
      category: OrgVariableCategory!
      createdAt: String!
      id: ID!
      name: String!
      organization: Organization!
      orgId: ID!
      packConfig: PackConfig
      packConfigId: ID
      updatedAt: String
      value: String
    }
    
    enum OrgVariableCategory {
      contact
      general
      secret
      system
    }
    orgVariables(
      where: OrgVariableWhereInput
      search: OrgVariableSearchInput
      limit: Int
      offset: Int
      order: [[String!]!] = [["name"]]
      maskSecrets: Boolean
    ): [OrgVariable!]!
    visibleOrgVariables(
      search: OrgVariableSearchInput
      visibleForOrgId: ID!
      limit: Int
      offset: Int
      order: [[String!]!] = [["name"]]
    ): [OrgVariable!]!
    organization(
      where: OrganizationWhereInput
      search: OrganizationSearchInput
    ): Organization
    
    type Organization {
      actions: [Action!]!
      activatedTriggers: [Trigger!]!
      createdAt: String
      createdTags: [Tag!]!
      domain: String
      deletedAt: String
      forms: [Form!]!
      id: ID
      isMsp: Boolean
      isStaff: Boolean
      isEnabled: Boolean
      isDeleted: Boolean
      isInternal: Boolean
      installedPacks: [Pack!]!
      featurePreviewSettings: [OrganizationFeaturePreviewSetting]
      managedOrgAutoInstallingWorkflows: [Workflow!]!
      managedAndSubOrgs: [Organization!]!
      managedOrgs: [Organization!]!
      managingOrg: Organization
      managingOrgId: ID
      name: String!
      orgSlug: String
      packConfigs: [PackConfig!]!
      resultsRetentionDays: Int
      rocSiteId: String
      tags: [Tag!]!
      templates: [Template!]!
      tid: ID
      triggerInstances: [OrgTriggerInstance!]!
      triggers: [Trigger!]!
      users: [User!]!
      variables: [OrgVariable!]!
      visibleActions: [Action!]!
      visiblePackConfigs: [PackConfig!]!
      visibleWorkflows: [Workflow!]!
      workflowExecutions: [WorkflowExecution!]!
      workflows: [Workflow!]!
      supportAccessStatus: SupportAccessStatus
    }
    organizations(
      where: OrganizationWhereInput
      search: OrganizationSearchInput
      limit: Int
      offset: Int
      order: [[String!]!] = [["name"]]
    ): [Organization!]!
    orgSearch(
      search: String
      rootOrgId: ID!
      breadcrumbRootOrgId: ID!
    ): [OrgSearchResult!]!
    
    type OrgSearchResult {
      id: ID!
      name: String!
      hasChildren: Boolean!
      breadcrumbs: [OrgBreadcrumb]
      managingOrgId: ID
      supportAccessStatus: SupportAccessStatus
      isInternal: Boolean
      }
    softDeletedOrgs(managingOrgId: ID!): [Organization!]!
    packActionOption(where: PackActionOptionWhereInput): PackActionOption
    
    type PackActionOption {
      id: ID!
      name: String!
      packId: ID!
      path: String!
      method: HTTPMethod
      paginate: Boolean
      queryParams: JSON
      pathParams: JSON
      headers: JSON
      requiredPathVars: [String!]
      requiredQueryVars: [String!]
      requiredHeaderVars: [String!]
      resultsKey: String
      valueField: String!
      label: String!
      labelIsTemplate: Boolean
      valueFieldIsPath: Boolean
      maxPages: Int
      pageSize: Int
    }
    packActionOptions(
      where: PackActionOptionWhereInput
      limit: Int
      offset: Int
      order: [[String!]!] = [["label"]]
    ): [PackActionOption!]!
    packBundle(where: PackBundleWhereInput!): PackBundle
    
    type PackBundle {
      configSchema: JSON
      description: String
      id: ID!
      name: String!
      packs: [Pack!]!
      ref: String!
    }
    packBundles(
      where: PackBundleWhereInput
      search: PackBundleSearchInput
      limit: Int
      offset: Int
      order: [[String!]!] = [["name"]]
    ): [PackBundle]!
    packConfig(
      where: PackConfigWhereInput
      search: PackConfigSearch
      includeSpec: Boolean
    ): PackConfig
    
    type PackConfig {
      appliedToTriggers: [Trigger!]!
      config: JSON
      default: Boolean
      description: String
      id: ID
      metadata: JSON
      name: String!
      organization: Organization
      foreignObjectReferences: [ForeignObjectReference!]!
      orgId: ID
      orgVariables: [OrgVariable!]!
      pack: Pack
      packId: ID
      actionOptions: [ActionOption!]!
      updatedAt: String
      createdAt: String
      visibleForOrganizations: [Organization!]!
    }
    packConfigs(
      where: PackConfigWhereInput
      search: PackConfigSearch
      resourceNames: String
      order: [[String!]!]
      includeSpec: Boolean
    ): [PackConfig!]!
    packConfigsForOrg(
      packIds: [ID!]!
      orgId: ID!
      includeSpec: Boolean
    ): [PackConfig!]!
    pack(where: PackWhereInput): Pack
    
    type Pack {
      actions: [Action!]!
      configFormSchema: JSON
      configSchema: JSON
      metadata: JSON
      description: String
      id: String
      orgId: ID
      installedBy: [Organization]
      isDefault: Boolean
      isOauthConfiguration: Boolean
      isMultitenancyEnabled: Boolean
      name: String
      orgVariables: JSON
      packBundle: PackBundle
      packBundleId: ID
      packConfigs: [PackConfig!]!
      packOverrides: [PackOverride]
      packTestAction: Action
      packType: PackType
      ref: String
      icon: String
      sensorTypes: [SensorType!]!
      setupInstructions: String
      status: PackStatus!
      tags: [Tag!]!
      triggerTypes: [TriggerType!]!
      uid: String
      version: String
    }
    packsAndBundlesByInstalledState(
      orgId: ID!
      includeCustomPack: Boolean
    ): PacksAndBundlesByInstalledState!
    
    type PacksAndBundlesByInstalledState {
      installedPacksAndBundles: [PackOrPackBundle!]
      marketplacePacksAndBundles: [PackOrPackBundle!]
    }
    page(where: PageWhereInput!): Page
    
    type Page {
      createdBy: User
      createdById: ID
      createdAt: String
      id: ID!
      loader: Loader
      name: String!
      path: String!
      site: Site
      siteId: ID
      updatedAt: String
      updatedBy: User
      updatedById: ID
      workflows: [Workflow!]!
      nodes: [PageNode]
      permission: Permission
      orgId: ID
      variables: [JSON]
      organization: Organization
      isSynchronized: Boolean
      clonedFromId: ID
      clonedFrom: Site
      cloneOverrides: JSON
      clones: [Page]
      title: String
    }
    pageVars(id: ID!, query: JSON): JSON
    pages(
      where: PageWhereInput
      limit: Int
      offset: Int
      order: [[String!]!] = [["name"]]
      search: PageSearchInput
    ): [Page!]!
    permission(where: PermissionWhereInput): Permission
    
    type Permission {
      id: ID
      templateId: ID
      authorizedForOrganizations: [Organization]
      authorizedForSubOrganizations: [Organization]
      excludeOrganizations: [Organization]
      roleIds: [String]
      override: String
      objectType: String
      objectId: String
      orgId: ID
      relation: String
      permissionType: String
      subjectType: String
      subjectId: String
    }
    permissions(where: PermissionWhereInput): [Permission!]!
    sensorType(
      where: SensorTypeInput
      search: SensorTypeSearchInput
    ): SensorType
    
    type SensorType {
      description: String
      enabled: Boolean
      entryPoint: String
      id: ID
      name: String
      notifyOnTriggerChanges: Boolean
      pack: Pack
      ref: String
      triggerTypes: [TriggerType!]!
    }
    sensorTypes(
      where: SensorTypeInput
      search: SensorTypeSearchInput
      limit: Int
      offset: Int
      order: [[String!]!] = [["name"]]
    ): [SensorType!]!
    site(where: SiteWhereInput, search: SiteSearchInput): Site
    
    type Site {
      createdBy: User
      createdById: ID
      createdAt: String
      domain: String
      id: ID!
      isLive: Boolean
      statusCode: Int
      statusMessage: String
      name: String!
      organization: Organization
      orgId: ID!
      shared: Boolean
      updatedAt: String
      updatedBy: User
      updatedById: ID
      template: String
      theme: JSON
      themeReferenceOrgVariable: String
      pages: [Page]
      permission: Permission
      customDomain: String
      isDnsValidated: Boolean
      useCustomDomain: Boolean
      isSynchronized: Boolean
      clonedFromId: ID
      clonedFrom: Site
      cloneOverrides: JSON
      clones: [Site]
      faviconUrl: String
    }
    sites(where: SiteWhereInput, search: SiteSearchInput): [Site!]!
    getAppPermissions(orgId: ID!): [Site!]!
    getSiteTheme(id: ID, domain: String): JSON
    tag(where: TagWhereInput, search: TagSearchInput): Tag
    
    type Tag {
      crates: [Crate!]
      createdAt: String
      description: String
      id: ID
      name: String
      organization: Organization
      organizations: [Organization!]!
      orgId: ID
      packs: [Pack!]!
      triggers: [Trigger!]!
      updatedAt: String
      color: String
    }
    tags(
      where: TagWhereInput
      search: TagSearchInput
      limit: Int
      offset: Int
      order: [[String!]!] = [["name"]]
      includeTagsWithNoOwner: Boolean = false
    ): [Tag!]!
    crateTags(
      where: TagWhereInput
      search: TagSearchInput
      limit: Int
      offset: Int
      order: [[String!]!] = [["name"]]
    ): [Tag!]!
    dailyTaskCountsByDateRange(
      orgId: ID!
      startDate: String!
      endDate: String!
    ): [TaskCountByDate!]!
    
    type TaskCountByDate {
      date: String!
      count: Int!
    }
    taskExecutionStats(orgId: ID!, createdSince: String): Int!
    taskLog(
      where: TaskLogWhereInput
      search: TaskLogSearchInput
    ): TaskLog
    
    type TaskLog {
      createdAt: String
      executionId: String
      executionTime: String
      id: ID
      input: JSON
      message: String
      originalParentTaskId: String
      originalPrincipalOrgId: ID
      originalPrincipalOrgName: String
      originalRunAsOrgId: String
      originalRunAsOrgName: String
      originalWorkflowExecutionId: String
      originalWorkflowTaskId: String
      originalWorkflowTaskName: String
      parentTask: WorkflowTask
      parentTaskId: ID
      result: JSON
      runAsOrg: Organization
      runAsOrgId: ID
      principalOrg: Organization
      principalOrgId: ID
      status: String
      taskExecutionId: ID
      updatedAt: String
      workflow: Workflow
      workflowExecution: WorkflowExecution
      workflowExecutionId: String
      workflowTask: WorkflowTask
      workflowTaskId: ID
    }
    taskLogs(
      where: TaskLogWhereInput
      search: TaskLogSearchInput
      limit: Int
      offset: Int
      order: [[String!]!] = [["createdAt"]]
      ): [TaskLog!]!
    template(where: TemplateInput): Template
    
    type Template {
      body: String!
      clonedFrom: Template
      clonedFromId: ID
      cloneOverrides: JSON
      clones: [Template]
      contentType: String!
      context: JSON
      createdAt: String!
      description: String
      id: ID!
      isShared: Boolean
      isSynchronized: Boolean
      language: String!
      name: String!
      organization: Organization!
      orgId: ID!
      permission: Permission
      tags: [Tag!]!
      unpackedFrom: Crate
      unpackedFromId: ID
      updatedAt: String!
      updatedBy: User
      updatedById: ID
    }
    templates(
      where: TemplateInput
      search: TemplateSearch
      limit: Int
      offset: Int
      order: [[String!]!] = [["name"]]
    ): [Template!]!
    jinjaTemplate(where: TemplateInput): Template
    triggerType(where: TriggerTypeWhereInput): TriggerType
    
    type TriggerType {
      description: String
      id: ID
      name: String
      pack: Pack
      parametersSchema(filterArg: JSON, orgId: ID): JSON
      outputSchema: JSON
      ref: String
      isPoll: Boolean
      isWebhook: Boolean
      sensorType: SensorType
      triggers: [Trigger!]!
      webhookUrlTemplate: String
      canRunForManagedOrgs: Boolean
      enabled: Boolean
    }
    triggerTypes(
      where: TriggerTypeWhereInput
      search: TriggerTypesSearchInput
      limit: Int
      offset: Int
      order: [[String!]!] = [["name"]]
    ): [TriggerType!]!
    trigger(
      where: TriggerWhereInput
      search: TriggerSearchInput
    ): Trigger
    
    type Trigger {
      activatedForOrgs: [Organization!]!
      autoActivateManagedOrgs: Boolean!
      clonedFrom: Trigger
      clonedFromId: ID
      cloneOverrides: JSON
      clones: [Trigger]!
      criteria: JSON
      description: String
      enabled: Boolean
      id: ID!
      isSynchronized: Boolean
      name: String
      organization: Organization!
      orgId: ID
      orgInstances: [OrgTriggerInstance]
      packOverrides: [PackOverride!]
      parameters: JSON
      state: JSON
      tags: [Tag!]!
      triggerType: TriggerType
      triggerTypeId: ID!
      unpackedFrom: Crate
      unpackedFromId: ID
      vars: [JSON]
      workflowId: ID!
      form: Form
      formId: ID
      workflow: Workflow!
    }
    workflowCompletionListeners(
      where: TriggerWhereInput
      search: TriggerSearchInput
    ): [Trigger!]!
    triggers(
      includeUnlisted: Boolean
      where: TriggerWhereInput
      search: TriggerSearchInput
      limit: Int
      offset: Int
      order: [[String!]!] = [["name"]]
    ): [Trigger!]!
    triggerDbNotificationErrors(triggerId: ID!): [DatabaseNotificationError!]!
    
    type DatabaseNotificationError {
      detail: String!
      raised_at: String!
      type: String!
    }
    userInvite(
      where: UserInviteWhereInput
      search: UserInviteSearchInput
    ): UserInvite
    
    type UserInvite {
      acceptedAt: String
      createdAt: String
      createdBy: User
      createdById: ID
      email: String!
      id: ID!
      isAccepted: Boolean
      organization: Organization!
      orgId: ID!
      roleIds: [String]
      roles: [JSON]
      sendEmail: Boolean
    }
    userInvites(
      where: UserInviteWhereInput
      search: UserInviteSearchInput
      limit: Int
      offset: Int
      order: [[String!]!] = [["email"]]
    ): [UserInvite]
    me: User
    
    type User {
      createdAt: String
      favoriteActions: [UserFavoriteAction!]!
      id: ID
      isApiUser: Boolean
      isSuperuser: Boolean
      isTestUser: Boolean
      managedOrgs: [Organization!]!
      orgId: ID
      organization: Organization
      preferences: UserPreferences!
      roleIds: [String!]!
      roles: [JSON]
      sub: String
      username: String
      parentUserId: ID
      parentUsername: String
    }
    userOrganization: Organization
    user(where: UserWhereInput, search: UserSearchInput): User
    users(
      where: UserWhereInput
      search: UserSearchInput
      limit: Int
      offset: Int
      order: [[String!]!] = [["username"]]
    ): [User!]!
    getTestUsers(where: UserWhereInput): [User!]!
    getTestUserSession: User
    timeSavedGroupByWorkflow(
      orgId: ID!
      workflowStatus: String
      updatedAt: String!
      useStatsTable: Boolean! = true
    ): [TimeSavedGroupByWorkflow!]!
    
    type TimeSavedGroupByWorkflow {
      workflowId: ID!
      workflowName: String
      secondsSaved: Int
      totalExecutions: Int
      successfulExecutions: Int
      failedExecutions: Int
    }
    timeSavedGroupBySubOrg(
      orgId: ID!
      workflowStatus: String
      updatedAt: String!
      useStatsTable: Boolean! = true
    ): [TimeSavedGroupByOrg!]!
    
    type TimeSavedGroupByOrg {
      workflowId: ID!
      workflowName: String
      secondsSaved: Int
      totalExecutions: Int
      ranForOrg: String
      }
    workflowExecutionStats(
      orgId: ID!
      createdSince: String!
      rollUpTimeSaved: Boolean
      includeSubWorkflows: Boolean
    ): WorkflowExecutionStats
    
    type WorkflowExecutionStats {
      delayed: Int!
      failed: Int!
      humanSecondsSaved: Int!
      paused: Int!
      pending: Int!
      running: Int!
      succeeded: Int!
    }
    workflowExecution(
      where: WorkflowExecutionWhereInput
      search: WorkflowExecutionSearchInput
    ): WorkflowExecution
    
    type WorkflowExecution {
      childExecutions: [WorkflowExecution!]!
      completionHandledExecution: WorkflowExecution
      completionHandlerExecutions: [WorkflowExecution!]!
      conductor: WorkflowExecutionConductor
      createdAt: String
      id: ID
      numAwaitingResponseTasks: Int
      numSuccessfulTasks: Int
      organization: Organization!
      orgId: ID!
      originatingExecutionId: ID
      parentExecution: WorkflowExecution
      parentExecutionId: ID
      parentTaskExecutionId: ID
      pendingTasks: [PendingTask]
      processedCompletionAt: String
      status: String
      subExecutions: [WorkflowExecution!]!
      taskLogs: [TaskLog!]!
      updatedAt: String
      workflow: Workflow!
    }
    workflowExecutions(
      where: WorkflowExecutionWhereInput
      search: WorkflowExecutionSearchInput
      limit: Int
      offset: Int
      order: [[String!]!] = [["createdAt"]]
      includeSubOrgs: Boolean
    ): [WorkflowExecution]
    workflowExecutionContexts(workflowExecutionId: ID!): JSON
    dailyTimeSavedByDateRange(
      orgId: ID!
      startDate: String!
      endDate: String!
    ): [TimeSavedByDate!]!
    
    type TimeSavedByDate {
      date: String!
      seconds: Int!
    }
    workflowPatch(id: ID!): WorkflowPatch!
    
    type WorkflowPatch {
      id: ID!
      patchType: PatchType!
      patch: JSON!
      comment: String!
      commentDescription: String
      user: User
      workflowId: ID!
      foreignId: ID
      createdAt: String!
      updatedAt: String!
    }
    workflowPatches(
      where: WorkflowPatchWhereInput
      orderBy: WorkflowPatchOrderByInput = createdAt_DESC
      limit: Int
      offset: Int
      createdSince: String
    ): [WorkflowPatch!]!
    workflow(
      where: WorkflowWhereInput
      search: WorkflowSearch
    ): Workflow
    
    type Workflow {
      autoInstallingForManagedOrgs: [Organization!]!
      action: Action
      clonedFrom: Workflow
      clonedFromId: ID
      cloneOverrides: JSON
      clones: [Workflow]!
      crates: [Crate!]
      completionListeners: [Trigger!]!
      createdAt: String
      createdBy: User
      createdById: ID
      description: String
      humanSecondsSaved: Int!
      id: ID
      input: [String!]!
      inputSchema: JSON
      isSynchronized: Boolean
      name: String
      notes: [WorkflowNote!]
      organization: Organization!
      orgId: ID!
      output: [JSON]!
      outputSchema: JSON
      packsUsed: [Pack!]!
      parentWorkflows: [WorkflowTask]
      permission: Permission
      schemaVersion: String
      tags: [Tag!]!
      tasks: [WorkflowTask!]!
      tasksObject: JSON
      taskActions: [Action!]!
      timeout: Int
      tokens: [JSON!]
      triggers: [Trigger]
      type: WorkflowType!
      unpackedFrom: Crate
      unpackedFromId: ID
      updatedAt: String
      updatedBy: User
      updatedById: ID
      varsSchema: JSON
      version: String
      visibleForOrganizations: [Organization!]!
    }
    workflows(
      where: WorkflowWhereInput
      search: WorkflowSearch
      hasListeners: Boolean
      hasParentWorkflows: Boolean
      hasTriggers: Boolean
      hasTriggerOfType: TriggerOfType
      hasTokens: Boolean
      isOptionsGenerator: Boolean
      isClone: Boolean
      isSyncClone: Boolean
      hasClones: Boolean
      isCrate: Boolean
      isCrateSource: Boolean
      hasTagIds: [ID!]
      excludeTagIds: [ID!]
      requireMatchingTasks: Boolean
      limit: Int
      offset: Int
      order: [[String!]!] = [["name"]]
    ): [Workflow!]!
    workflowNote(where: WorkflowNoteWhereInput): WorkflowNote
    
    type WorkflowNote {
      id: ID
      title: String
      clonedFrom: WorkflowNote
      clonedFromId: ID
      createdAt: String
      content: String
      metadata: JSON
      index: Int!
      updatedAt: String
      workflow: Workflow
      workflowId: ID
    }
    workflowNotes(
      where: WorkflowNoteWhereInput
      search: WorkflowNoteSearchInput
      limit: Int
      offset: Int
      order: [[String!]!] = [["index"]]
      ): [WorkflowNote!]!
    workflowTask(where: WorkflowTaskWhereInput): WorkflowTask
    
    type WorkflowTask {
      action: Action
      actionId: ID
      description: String
      humanSecondsSaved: Int
      id: ID
      input: JSON
      isMocked: Boolean
      join: Int
      metadata: JSON
      mockInput: JSON
      name: String
      next: [WorkflowTransition!]!
      packOverrides: [PackOverride!]
      publishResultAs: String
      retry: WorkflowTaskRetry
      runAsOrgId: String
      timeout: Int
      transitionMode: TransitionModes
      with: WorkflowTaskWithItems
      workflow: Workflow
      workflowId: ID
      securitySchema: JSON
    }
    workflowTasks(
      where: WorkflowTaskWhereInput
      limit: Int
      offset: Int
      order: [[String!]!] = [["name"]]
    ): [WorkflowTask!]!
    createActionOptions(
      actionOptions: [ActionOptionInput!]!
      replace: Boolean
    ): [ActionOption]
    operation_type: "mutation"
    operation: "createActionOptions"
    variable_values:
      actionOptions:
        - optionLabel: "Environment"
          optionValue: "production"
          organizationId: "{{ CTX.org_id }}"
          packConfigId: "{{ CTX.pack_config_id }}"
          resourceName: "server"
      replace: false
    fields: "id, optionLabel, optionValue"
    unlinkClone(id: ID!, objectType: CloneableObjectType!): ID
    
    enum CloneableObjectType {
      form
      template
      trigger
      workflow
      page
      site
    }
    operation_type: "mutation"
    operation: "unlinkClone"
    variable_values:
      id: "{{ CTX.workflow_id }}"
      objectType: "workflow"
    createComponent(component: CreateComponentInput!): Component
    
    input CreateComponentInput {
      orgId: ID!
      name: String!
      description: String
      nodeTree: JSON!
      workflows: [ID]
      isSynced: Boolean
    }
    updateComponent(component: UpdateComponentInput!): Component
    deleteComponent(id: ID!): Boolean
    duplicateComponent(id: ID!): Component
    createForeignObjectReference(
      foreignObjectReference: CreateForeignObjectReferenceInput
    ): ForeignObjectReference
    
    input CreateForeignObjectReferenceInput {
      actionId: ID
      id: ID
      identifier: ID
      orgId: ID!
      packConfigId: ID
      referenceId: ID!
      workflowExecutionId: ID
    }
    createOrUpdateForeignObjectReference(
      foreignObjectReference: CreateForeignObjectReferenceInput
    ): ForeignObjectReference
    createForm(form: FormCreateInput!): Form
    
    input FormCreateInput {
      clonedFromId: ID
      cloneOverrides: JSON
      description: String
      fields: [FormFieldInput!]
      id: ID
      isSynchronized: Boolean
      name: String
      orgId: ID!
      unpackedFromId: ID
    }
    
    operation_type: "mutation"
    operation: "createForm"
    variable_values:
      form:
        name: "User Information Form"
        description: "Collects user information for onboarding"
        orgId: "{{ CTX.org_id }}"
        fields:
          - type: "TEXT_INPUT"
            index: 0
            schema:
              label: "Full Name"
              required: true
    fields: "id, name, description, fields { id, type, schema }"
    submitForm(
      id: ID!
      values: JSON!
      triggerId: ID!
      orgId: ID!
    ): JSON
    setFormTags(form: SetFormTagsInput!): Form
    
    input SetFormTagsInput {
      id: ID!
      tagIds: [ID!]!
    }
    shallowCloneForm(
      id: ID!
      orgId: ID!
      overrides: ShallowCloneOverridesInput
      : Form)
    updateForm(form: FormUpdateInput!): Form
    deleteForm(id: ID!): Void
    updateOrgTriggerInstance(
      orgTriggerInstance: OrgTriggerInstanceInput!
    ): OrgTriggerInstance
    
    input OrgTriggerInstanceInput {
      id: ID
      isManualActivation: Boolean
      organization: OrganizationInput
      orgId: ID
      lastSearchedAt: String
      trigger: TriggerUpdateInput
      triggerId: ID
      state: JSON
    }
    createOrgVariable(orgVariable: OrgVariableCreateInput!): OrgVariable
    
    input OrgVariableCreateInput {
      cascade: Boolean!
      id: ID
      name: String!
      value: String!
      category: OrgVariableCategory
      orgId: ID!
      packConfigId: ID
    }
    operation_type: "mutation"
    operation: "createOrgVariable"
    variable_values:
      orgVariable:
        name: "api_endpoint"
        value: "https://api.example.com/v1"
        category: "general"
        cascade: true
        orgId: "{{ CTX.org_id }}"
    fields: "id, name, value, category, cascade"
    deleteOrgVariable(id: ID!): ID
    updateOrgVariables(
      orgVariables: [OrgVariableUpdateInput!]!
    ): [OrgVariable!]!
    
    input OrgVariableUpdateInput {
      cascade: Boolean
      category: OrgVariableCategory
      id: ID
      name: String!
      value: String
      orgId: ID
      packConfigId: ID
    }
    bulkCreateOrganizations(
      organizations: [OrganizationInput!]!
    ): [Organization!]!
    bulkDeleteOrganizations(organizationIds: [ID!]!): Void
    createOrganization(organization: OrganizationInput): Organization
    
    input OrganizationInput {
      domain: String
      id: ID
      isEnabled: Boolean
      managingOrgId: ID
      name: String!
      orgSlug: String
      rocSiteId: String
      tid: String
      tagIds: [ID!]
    }
    createOrganizations(
      organizations: [OrganizationInput!]!
    ): [Organization]
    deleteOrganization(id: ID!): Void
    updateManagedAndSubOrganizations(
      organization: OrganizationUpdateInput!
    ): Int
    updateOrganization(organization: OrganizationUpdateInput): Organization
    bulkUpdateOrganizationFeaturePreviewSettingByLabel(
      isEnabled: Boolean!
      label: String!
      orgIds: [ID!]!
    ): [OrganizationFeaturePreviewSetting!]!
    synchronizePackBundleConfigs(
      orgId: ID!
      packBundleId: ID!
      primaryPackConfigId: ID!
    ): [SynchronizedPackConfig!]!
    createPackConfig(packConfig: PackConfigCreateInput!): PackConfig
    
    input PackConfigCreateInput {
      id: ID
      name: String!
      default: Boolean
      description: String
      config: JSON
      metadata: JSON
      orgId: ID!
      packId: ID!
    }
    deletePackConfig(id: ID!, orgId: ID!): Void
    refetchPackConfigRefOptions(
      packConfigId: ID!
      reference: JSON
    ): JobRequestedResponse
    testPackConfig(packConfig: PackConfigTestInput!): JobRequestedResponse
    updatePackConfig(packConfig: PackConfigUpdateInput!): PackConfig
    updatePackConfigs(
      packConfigs: [PackConfigUpdateInput!]!
    ): [PackConfig!]!
    generatePackOrBundleAuthUrl(
      orgId: ID!
      packBundleId: ID
      packConfigId: ID
      extra: JSON
    ): AuthUrlResponse
    
    type AuthUrlResponse {
      authUrl: String
      error: String
    }
    installPack(orgId: ID!, packId: ID!, name: String): Organization
    getPackInstallations(packId: ID!): PackInstalledByResponse
    getPackPageUrl(integrationRef: String!, pagePath: String!): String
    updatePack(pack: PackUpdateInput!): Pack
    createPage(
      page: PageCreateInput!
      preset: String
      nodes: [PageNodeInput]
    ): Page
    
    input PageCreateInput {
      id: ID
      loader: Loader
      siteId: ID
      workflows: [WorkflowInput]
      name: String!
      path: String!
      variables: [JSON]
      orgId: ID!
      clonedFromId: ID
      isSynchronized: Boolean
      cloneOverrides: JSON
    }
    updatePage(
      page: PageUpdateInput!
      nodes: [PageNodeInput]
    ): Page
    deletePage(id: ID!): Void
    updatePageNode(id: ID!, props: JSON!): PageNode
    updatePageNodeByCraftId(
      craftId: String!
      pageId: ID!
      props: JSON!
    ): PageNode
    createSite(site: SiteCreateInput!): Site
    
    input SiteCreateInput {
      name: String
      domain: String
      orgId: ID!
      template: String
      theme: JSON
      pages: [PagesImportInput]
      clonedFromId: ID
      isSynchronized: Boolean
      cloneOverrides: JSON
    }
    updateSite(site: SiteUpdateInput!): Site
    updateSites(sites: [SiteUpdateInput!]!): [Site!]!
    deleteSite(id: ID!): Void
    validateSiteCustomDomainDNS(id: ID!): DNSValidationResponse
    
    type DNSValidationResponse {
      isValid: Boolean
      message: String
    }
    createTag(tag: TagCreateInput!): Tag
    
    input TagCreateInput {
      id: ID
      name: String
      description: String
      orgId: ID!
      color: String
    }
    deleteTag(id: ID!): ID
    updateTag(tag: TagUpdateInput!): Tag
    updateTags(tags: [TagUpdateInput!]!): [Tag!]!
    setOrganizationTags(tagIds: [ID!]!, orgId: ID!): Organization
    createTemplate(template: TemplateCreateInput!): Template
    
    input TemplateCreateInput {
      body: String!
      clonedFromId: ID
      cloneOverrides: JSON
      contentType: String
      context: JSON
      description: String
      id: ID
      isShared: Boolean
      isSynchronized: Boolean
      language: String
      name: String!
      orgId: ID!
      tags: [TagInput!]
      unpackedFromId: ID
    }
    
    ## Best Practices
    
    ### Query Optimization
    
    1. **Limit Data Retrieval**: Only request the fields you actually need
    2. **Use Pagination**: Implement proper limit and offset for large datasets
    3. **Filter Early**: Apply filters at the query level rather than post-processing
    
    ### Error Handling
    
    ```yaml
    # Example workflow task with error handling
    - name: execute_graphql_query
      action: rewst.generic_graph_request
      parameters:
        operation_type: "query"
        operation: "workflows"
        variable_values:
          limit: 100
          where:
            orgId: "{{ CTX.org_id }}"
      on_failure:
        - log_error:
            message: "GraphQL query failed: {{ RESULT.error }}"
    {
      "orgVariables": [
        {
          "id": "var1",
          "name": "setting1",
          "value": "updated_value1"
        },
        {
          "id": "var2",
          "name": "setting2",
          "value": "updated_value2"
        }
      ]
    }
    {
      "where": {
        "orgId": "{{ CTX.org_id }}"
      },
      "limit": 1000
    }
    {
      "where": {
        "managingOrgId": "{{ CTX.parent_org_id }}"
      },
      "order": [["name"]]
    }
    id
    name
    description
    createdAt
    updatedAt
    tasks {
      id
      name
      action {
        name
        pack {
          name
        }
      }
    }
    triggers {
      id
      name
      enabled
    }