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...
Loading...
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.
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.
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.
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.


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.
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.
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






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.
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.
Returns the average, or arithmetic mean, of a list of numbers.
Result of example:
You are resetting a user's password and would like to generate a friendly password.
This action generates an easy password with adjective, name, number, symbol and random caps.
There are no parameters for this transform.
This transform has no parameters, so no usage examples can be given.
Example 1:
Example 2:
Example 3:
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.
List
List to average


List to Measure
The array/list to get the length of.
Result of Example:

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.
Variable Contents
The value of the variable you are setting.
Result from Example:

5FAirBAnDIcooT39!GREENBoNoBo73=KINDSNakE41$5I am a test!Add or Subtract from a DateTime
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.
Result from Example 1 (if run on 04/16/2025):
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.
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.
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.
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.
This transform action will look at a list of boolean values and return true if any of the elements are true.
List
List of boolean values to check against.
This transform will output a boolean value.
Example output from Example 1:
Follow these steps to get the embeddable link:
Navigate to Automations > Workflows.
Click on the Workflow that includes the form trigger.
Click Edit Trigger in the top menu.
Click on Copy Embeddable iFrame code.
This copies the embeddable Iframe code. Paste the code into your compatible webpage editor.
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.
Result from Example 1:
Result from Example 2:
If a form field of a form unpacked from a Crate isn't populating with information, you have two options.
Identify the issue by digging into the form.
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.
Navigate to Automations > Forms.
Open the form in question.
Scroll down in the right side menu. Click on any field that's further down in the field list.
Click on the field. This will open its information in the right side menu.
Scroll down to see if the field is a dynamic field. If it is, Dynamic Options will be toggled on.
Confirm if the field has Workflow Generated toggled on. If so, look at the options generator in the Workflow field beneath it.
Open the options generator by clicking .
Effortlessly create high-quality documentation for your workflow actions without getting caught up in details.
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.
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.
Click Generate Auto-Documentation to generate documentation for the entire workflow.
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.
RoboRewsty is also available to help when you publish a workflow. Click on the RoboRewst icon to generate a detailed change log, then Submit.
You have received a time value in epoch time from an API and would like to convert it to a date time string representation.
Given an integer for epoch time, convert it to a date time string.
For this example the now( ) method is feeding in a value of 1747395397.
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.
This transform will take two dates and an operator, it will then perform a comparison based on the operator and return a boolean value.
The expected output for this transform is a boolean value based on the comparison of the two dates.
Result Output for Example 1:
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.
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.
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") }} .
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.
Measures the length of a String. It will return the number of characters in that string.
Result of Example:
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.
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.
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.
This sub workflow has no inputs.
automation_log: Standardized Rewst automation log
duo_user_count: List of DUO companies and their counts.
build automation log: Logging
get_user_count: Data retrieval
duo_list_accounts: Duo integration: List Accounts
duo_list_users: Duo integration: List Users
Used in setting the duo_accounts alias.
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.
company_id - string; This would be a Microsoft Entra tenant ID.
automation_log: Standardized Rewst automation log
license_counts: List of Rewst orgs and their license counts in Office 365.
BEGIN: Core integration: noop
workflows_365_get_users: Data retrieval
Create Automation Log: Creation/initialisation
Example for input parameter 'company_id'
Used in publishing 'license_counts'
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.
This transform action will look at a list of boolean values and return true if all of the elements in the list are true.
This transform will output a boolean value.
Example output from Example 1:
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.
This sub workflow has no inputs.
automation_log: Standardized Rewst automation log
auvik_user_count: List of auvik companies and their counts.
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
Used in input parameter 'id'
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.
This sub workflow has no inputs.
automation_log: Standardized Rewst automation log
rmm_user_count: List of Datto RMM companies and their counts.
Get_Datto_RMM_Device_Counts: Data retrieval
datto_rmm_list_sites: Datto RMM integration: List Sites
build automation log: Logging
BEGIN: Core integration: noop
Used in input parameter 'site'
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.
This sub workflow has no inputs.
automation_log: Standardized Rewst automation log
proofpoint_user_count: List of ProofPoint companies and their counts.
handle failure actions: Core integration: noop
Get Proofpoint Counts: Data retrieval
build automation log: Logging
proof_point_list_organizations: ProofPoint integration: List Organizations
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.
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.
Trim whitespace characters from a variable.
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.
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.
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
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.
BEGIN: Core integration: noop
create_ticket: Creation/initialisation
format_output: Core integration: noop
failed: Core integration: noop
Task: set_variables | Context: Used in publishing 'company_id'
Task: set_variables | Context: Used in publishing 'issue_type_id'
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.
This sub workflow has no inputs.
automation_log: Standardized Rewst automation log
subscription_name_and_quantity: List of Pax8 companies and their counts.
BEGIN: Core integration: noop
handle failure actions: Core integration: noop
pax_8_get_product: Data retrieval
pax_8_list_companies: Pax8 integration: List Companies
Used in publishing 'subscription_name_and_quantity'
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.
This sub workflow has no inputs.
cwa_counts: This output will contain a list of companies from Automate along with their counts.
connect_wise_automate_list_companies: ConnectWise Automate integration: List Companies
connect_wise_automate_list_computers: Calculation
build automation log: Logging
calculate_final_count: Calculation
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.
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:
One for when you hire internal users at your organization
One for adding users for your customers
Navigate to Automations > Forms.
Click ⋮ and select the Clone option on the form you want to clone.
Rename your form to something unique and define a few other fields:
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.
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.
This transform will check whether or not a string provided via the 'String to Check' input is a valid JSON string.
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:
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.
Encode a string in base64.
Result of Example 1:
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.
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 }}
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.
check_sendas_field: Communication/notification
Send_Email: Communication/notification
core_sendmail: Communication/notification
microsoft_graph_get_user: Data retrieval
Used in input parameter 'subject'
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.
automation_log: Standardized Rewst automation log
huntress_count: List of Huntress companies and their counts.
huntress_list_organizations: Huntress integration: List Organizations
get_huntress_agent_count: Data retrieval
build automation log: Logging
BEGIN: Core integration: noop
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.
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.
This sub workflow has no inputs.
automation_log: Standardized Rewst automation log
ninja_device_counts: List of Ninja RMM companies and their counts.
BEGIN: Core integration: noop
ninja_rmm_list_organizations: NinjaRMM integration: List Organizations
list_workstations: NinjaRMM integration: List Devices
list_servers: NinjaRMM integration: List Devices
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.
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.
choose_variable - string
options: Array of queues.
datto_psa_resource_role_queues_query_field_definitions: Datto Autotask PSA integration: resource_role_queues_query_field_definitions
This is used to populate the queues data alias.
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.
choose_variable - string
options: Array of agent objects.
list_agents: HaloPSA integration: List Agents
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.
ticket_type - string
choose_variable - string
options: Array of ticket subtype objects.
list_ticket_subtypes: Datto Autotask PSA integration: List Ticket Fields with Picklists
This is used in publishing the ticket_subtypes data alias.
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.
This sub workflow has no inputs.
automation_log: Standardized Rewst automation log
glue_counts: List of ITGlue companies and their counts.
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
Creates a list of organizations that have the attribute my-glue-account-id populated.
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.
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.
This sub workflow has no inputs.
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.
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.
choose_variable
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".
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.
This sub workflow has no inputs.
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.
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.
This sub workflow has no inputs.
"2025-05-16T00:00:00+00:00"{{ [true, false, true, true] }}True202527Organization: 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:
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.
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.
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.
An accordion list of all included tasks






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.











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.

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.

String to Measure
The string to get the length of.

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.

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

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.

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.

user_not_found: Core integration: noop
action_error: Core integration: noop
calculate_org_device_counts: Calculation
match_users_to_org: Core integration: noop
automation_log: Standardized Rewst automation log
immy_counts: List of ImmyBot companies and their counts.
BEGIN: Core integration: noop
get_device_count: Data retrieval
immy_bot_list_computers: Calculation
build automation log: Logging
action_error: Core integration: noop
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
options: Array of priorities.
get_priorities: Data retrieval
This is used in publishing the all_priorities data alias.
options: Array of company statuses.
get_company_statuses: Data retrieval
This is used in publishing all_company_statuses
automation_log: Standardized Rewst automation log
sentinel_counts: List of SentinelOne companies and their counts.
sentinel_one_list_sites: SentinelOne integration: List Sites
Begin: Core integration: noop
build automation log: Logging
choose_variable - string
options: Array of company classifications.
get_company_classifications: Data retrieval
This is used in publishing 'all_classifications'
all_integration_ids: Outputs a list of organizations, the organization object includes org info and their integration mappings.
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
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.
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:006False"2025-04-16T05:00:30-04:00"2025-04-16T08:07:04Z43{{ 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] }}FalseThis-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!TrueFalseVGhpcyBAaXMgbXkgdGVzdCBzdHJpbmcteWVlZWVoYXc=[
{
"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 }}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.
If troubleshooting the issue yourself, find the errors in the workflow execution and correct them.
If creating a ticket for Rewst support, copy the URL of your browser while viewing this information, and paste it into your support ticket.
You can also ask RoboRewsty to help you troubleshoot your execution results.

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.
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.
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.
Drag the Get User action onto the workflow builder canvas.
Add your user into the User ID field.
Set your context variable name under Publish Result As. The workflow action results will be stored as the value.
Add your data alias name. Click to open the Jinja editor and set up your data alias.
Use the following Jinja to create a new dictionary object and set the displayName and userPrincipalName keys.
Run the workflow. Then, click View Results
Click Load Context.
Expand the context to see our data alias filtered_user_details now only showing the displayName and userPrincipalName .
Data aliases are added via transitions. See more about how to use transitions in workflows here.
Click to add your data alias.
Paste the key into the key field. Click to open the Jinja editor and set up your data alias.
Click to remove a data alias.
Click and to move multiple data aliases up and down in the data alias list.
Navigate to Automations > Workflows.
Search for your desired workflow.
Click > to the far right of that workflow to open its workflow builder canvas.
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.
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 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.
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.
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:
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.
For information on how these work, see our documentation for advanced workflow operations.

Given a defanged URL, this action will refang the url by removing the added characters that prevent it from being directly usable.
URL
URL to refang
The expected result of this transform is a standard url.
Result from Example 1:
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.
Result of Example 1:
Result of Example 2:

Given a URL, this action will 'defang' the url by adding characters to prevent it from being directly usable.
URL
URL to defang
Colon
If true defang colons.
Dots
If true defang all dots.
The expected result of this transform is a defanged url.
Result from Example 1:
String
String to URL encode.
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"
Example output from Example 1:
This transform will return a list of integers from start to end.
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.
Result of Example:
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.
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.
.
Click in the top menu bar of your workflow's workflow builder canvas.
Click the Workflow Type drop-down selector.
Select Option Generator.
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 .
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.
The values here will be used in the Label Field an Value Field for a form field.
The Label is what gets shown to the user who fills out the form as an available choice.
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.
Boolean values: Represent true or false, similar to 1 (on) and 0 (off).
Logical operators: and, or, not determine conditions in 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.
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.
To ensure efficiency and maintainability, follow these best practices.
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:
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"
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.
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
Transforms a list into an object with extracted key-value pairs.
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.
[
{
"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.html34hXXps[:]//rewst[.]io/aprilfools/surprise.htmlThis-is-%40-test%212025-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"]
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















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.



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.
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.
In both of these examples, your new output object would look as follows:


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.
Open your webhook trigger inside the workflow.
Open the response headers.
Add the following headers:
Important - Match the exact origin of your site.
Avoid using * unless the webhook is fully public and returns no sensitive data.
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
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.
Try removing the slash from the end of your domain.
Add the OPTIONS method to the webhook.
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
In the Rewst platform:
Navigate to Workflows > Create.
Enter a workflow name, like My First Webhook Trigger.
Click Submit to proceed to a blank workflow creation screen.
Add a single no-op action to the canvas. Name it 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.
Name your trigger.
Toggle Enable on.
Choose the trigger type Core - Webhook.
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.
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 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.
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
Navigate to Automations > Workflows.
Locate the existing workflow that you want to address. Click Workflow Completion Handlers.
Note the two options in the Completion Handlers section. You'll need to choose which one you want to use:
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:
{{ COMPLETED_WORKFLOW.ORG.VARIABLES.cw_manage_company_id }}
{{ 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 }}
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.
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 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.
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
When designing workflows, keep these three guiding principles in mind.
Simplicity: Create workflows that are user-friendly and easy to understand.
Modularity: Break down workflows into smaller, reusable components.
Maintainability: Build workflows that are straightforward to update and maintain.
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.
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.
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.
Stay consistent with your styling when naming variables. Choose a naming convention, for example snake_case or camelCase, and apply it uniformly.
Employ descriptive and straightforward wording using snake_case for clarity.
Prefix integration-specific variables appropriately, like psa_ for PSA-related variables.
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.
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:
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 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.
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.
These are the essential platform components like webhooks, email dispatching, and .
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.
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.
These actions help you shape and modify your data for efficient workflow execution, replacing the need for complex Jinja statements.
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.
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.
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.
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 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:
A key
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.
Name: This can be a unique entry relevant to what the aim of the input is going to be. This should not contain spaces.
Label: This text field is used to set a friendly name. It's the field name visible at the time of input.
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.
When variables are created within the workflow, they become , and can be used directly in action inputs.
In the example below, creating a user in Microsoft 365 using three variables:
First Name
Last Name
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.
Similarly to the above, you can configure an output of a workflow. These are generally used in two situations:
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 .
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.
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].
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.
In the Rewst platform:
Navigate to Workflows > Create.
Enter a workflow name, like My First Webhook Trigger.
Click Submit to proceed to a blank workflow creation screen.
Add a single action to the canvas. Name it
Name your trigger.
Toggle Enable on.
Choose the trigger type relevant to your particular PSA ticket system:
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.
To see the trigger in action follow the below steps
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.
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.
After selecting all desired criteria, click Save then Close.
Your trigger criteria are now set and visible.
Copy these criteria values.
Paste them into other workflows you are configuring.
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.
These operations can be found inside each task's Advanced tab.
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 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.
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 .
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 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.
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:
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.
This allows you to adjust the number of seconds to wait for a task to complete. The default value is 10 minutes.
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.
Seamlessly integrate "With Items" task results into your original list.
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.
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.
The below scenario will attempt to illustrate how the Process With Items Results transform can be utilized to simplify With Items results collection.
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
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.
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.
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.
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.ageresults: {
"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!"
}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.
BEGINClick Add Trigger at the top of your workflow builder.
Datto PSA: Ticket Webhook
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.











Description: You can give a better description of what the field is used for.



















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"]
},
]This will run the workflow when another workflow completes
When this workflow completes...
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.
For When this workflow completes...
Click to choose the workflow to trigger.
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.
For Run this workflow when...
Click to choose the workflow to trigger.
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.






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.


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.
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 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.
{{ 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 }}.
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
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.
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
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
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
Remember to ask yourself the following questions while troubleshooting your results.
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.
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.
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.
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.
Click + Create.
Fill in the relevant fields with the information for your template.
Name
Description
Tags
Select the language you want to write your template in from the Language drop-down selector.
Click into your Editor panel on the left side of the screen to begin writing. View your progress in the Preview panel.
Scroll down and click Submit when finished.
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") }}.
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.
Click + Create.
Fill in the relevant fields with the information for your script.
Name
Description
Tags
Select the language you want to write your script in from the Language drop-down selector.
Click into your Text panel to begin writing.
Scroll down and click Submit when finished.
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.
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.
Results of example 1:
Results of example 2:


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.
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 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.
[
{
"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
]Open each selected integration's accordion menu to choose your Configuration Selection Mode for that integration.








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.

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.


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.
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.
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 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 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.
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:
Navigate to Automations > Workflows.
Search for the specific workflow.
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.
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.
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.
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.
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.
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.
This setting publishes the configured output, allowing your parent workflow to use the results of the subworkflow immediately.
Find your desired subworkflow in the Workflows actions menu in the left side of theWorkflow Builder.
Drag your subworkflow from the actions list to the Workflow Builder canvas within your parent workflow.
Click on the subworkflow to expose its configuration settings.
Enter sub_wf_results in the Publish Results As field.
Click Publish.
Results for subworkflows are nested inside published results for workflows. For example, the following Jinja wiuld contain the subworkflow data.
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.
Here are the parameters you have available to you within the action, and their descriptions:
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.
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:
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:
Inner join: useful when you're dealing with two datasets and only want to focus on data that is common between them.
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.
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:
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.
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.
Here are the parameters you have available to you within the action, and their descriptions:
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.
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:
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:
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.
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.
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.
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.
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.
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.
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.
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.
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 options filter works off of two boolean operators, which are used to build queries for a variety of filtering situations.
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.
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.
Create a new form by navigating to Automations > Forms > + Add.
Name your form, and click Submit.
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.
Click on the dragged form field to open the right side menu.
Click on Filter Options. This will open the Create Option Filters dialog.
Set up your desired filters using the AND and OR options, with relevant use of the +Rule and +Group buttons.
Click apply filter at the bottom right of your screen.
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.
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.
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.
Click to add new trigger criteria. This will add a new row of fields under the Trigger Criteria submenu.
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.
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.
Click to open a Monaco editor dialog.
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.
Equals
Not Equals
Contains
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.
Click to remove the related trigger criteria.
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.
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.
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.

Modify a specific field's value within your list objects.
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.
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.
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.
Assume that we have a list of objects called my_list that looks like this:
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:
After all these examples are performed in the transformation, your newly updated list would reflect these changes in their outputted results as such:
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.
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 .
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.
To modify an existing trigger, click Edit Trigger. If there are multiple triggers for the workflow, select the appropriate trigger from the dropdown menu.
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.
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.
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
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
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
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
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
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
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.
{{ CTX.sub_wf_results.output_data }}join_method: inner
list_1: list_1
list1_key: id
list_2: list_2
list2_key: idjinjaCopy 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 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.](https://docs.rewst.help/~gitbook/image?url=https%3A%2F%2F1835401289-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FAQQ1EHVcEsGKBPVHmiav%252Fuploads%252FMzz2xWTeCU1aqI7WruMI%252Fimage%2520%2866%29.png%3Falt%3Dmedia%26token%3D4a53c87d-1036-4dbd-bbd1-7d623bd94cc6&width=768&dpr=4&quality=100&sign=819ab16&sv=2)



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







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.






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
},
]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.
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.
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.
Click to add a new trigger.
Name your trigger with something simple but descriptive.
Toggle Enabled to on.
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.
If needed, add an .
Set your trigger criteria, if required for your workflow.
Think about which organizations you want the trigger to run for.
Selected Organization (Org Name) will be toggled on by default. Toggle to off if desired.
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.
If you want the automation to apply only for certain organizations, select them manually in the Organizations
Click Submit to save the trigger.
Click Create.
Give your workflow a Name, and add any tags you would like via the Tags drop-down selector.
Click Submit. This will launch the workflow builder.
Search for your desired action in the left side menu.
Click on it, drag it, and drop it onto the canvas.
Repeat this process to add all needed actions to your workflow.
Click on the placed task, which will open a configuration dialog featuring two sections:
A set of basic details fields at the top:
Name: A user-editable field for the task's identifier.
Reference: The integration pack and task description.
Output: Specifies where the task's output gets stored in the task logs.
Task ID: The unique ID for referencing this task.
Description: A user-fillable text box for additional task information.
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.
Four distinct tabs beneath the basic details:
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.
Note the Redact on Hover setting for inputs that are set to Password. This can be toggled on or off via the .
Remember to add between your tasks.
Click Test to see if your workflow executes as desired.
Click Publish to save your changes and push them to the desired effect.
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.
Click on the workflow that you want to configure.
Click on Configure Workflow Variables to edit the workflow.
Enter the amount of seconds it takes for the process in Time Saved (seconds).
Click Submit.
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.
Right-click the canvas and select Add Note. Alternatively, press and hold the control key, then drag your mouse to create a note.
Click and drag it to the desired location on the canvas.
Hover over the upper-right icon and click Edit Note to edit a note's content in the right side menu.
To delete notes, right-click the note and click Delete Note.
Select multiple workflow tasks and notes simultaneously by drawing a selection box around them.
Hold shift and drag your mouse, or hold the middle-mouse button and drag your mouse.
Once you’ve selected multiple tasks or notes, move them by dragging the selection box to the desired location.
With multiple tasks or notes selected, you can perform the following actions:
Delete Items: Press the delete key, or right-click the canvas and select Delete Selected Tasks.
Duplicate Items: Press ctrl+d, or right-click the canvas and select Duplicate Selected Tasks.
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.
Find the action you want to favorite.
Click the star icon next to the action.
To add a favorited action to your workflow:
Right-click on the workflow canvas.
Add an action from the favorites section.
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 }} .
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.


Redefine your list structure by reshaping attribute values.
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.
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.
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.
Assume that we have a list of objects called my_list that looks like this:
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.
After all these actions are performed, your newly transformed list would output looking like this:


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.
In the Redacted Input Parameters and Redacted Output Parameters fields, customize redaction with JSONPath queries.
These queries can be entered manually in the editor, or chosen from the field's drop-down selector.























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)

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 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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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
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.
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.
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
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.
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.
The resulting task's output returns the verified information about the associated external object.
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.
Retrieval: Fetches external resource information.
User Execution: Runs under specified user credentials or default user.
Organization Specific: Requires organization ID for context.
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.
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.
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.
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.
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.
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.
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.
Output: The action returns a list of all forms, each item including information about a 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.
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.
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.
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.
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.
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.
Learn how to build and customize your Rewst Forms
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.
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.
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.
Selecting the Microsoft Graph integration to list all users.
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 .
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.
Default options can be selected for a form field linked to a workflow by following these steps.
Add a boolean property to each option result.
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
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:
The system checks who is logging in.
It validates which organization the user belongs to.
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.
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.
Then, confirm your browser's locale:
Open the browser console by pressing F12, then navigating to Console.
Run:
Expected outputs are as follows.
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:
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.
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:
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:
Locate the on the workflow.
Click View Form URLs.
Select the desired organization's form from the list.
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.
You can add default values for any of the form organization variables below:
Navigate to Configuration > Organization Variables.
Click Add at the top right.
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.
Navigate to Automations > Forms.
Open the User Onboarding Form.
Click to open the settings for the Email Domain Name field.
Enter true in the schema.enumSourceWorkflow.input.force_default setting.
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.
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)
Highlight any extra languages and click Remove so only one remains.
(Optional advanced step)
In the address bar, type about:config.
Search for: intl.locale.requested
Set it to:
en-AU for Australia
en-US for United States
en-GB for United Kingdom
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
Click the ⋯ next to any other languages and select Remove. This prevents Chrome from using fallback locales.
Click the ⋯ next to your chosen language.
Select Display Google Chrome in this language.
Restart Chrome to apply the change.
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)
Click the ⋯ beside any other languages and choose Remove.
Click the ⋯ next to your chosen language.
Select Display Microsoft Edge in this language and restart Edge.
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


















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/languagesedge://settings/languagesconsole.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 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.
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.
subjecttitlemessagerender_markdown(Custom HTML){{ template(“guid”) }}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.
<tr>
<td
style="text-align:center;padding:30px 0 30px 0;background-color:#1a2e05;color:#ffffff;">
<p style="display:inline-block;margin-right:10px;">© 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
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.
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.
DebugWhen 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.
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.
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.
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.
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:
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.
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.
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.
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.
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.
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.comhttps://www.svgrepo.com/download/533811/donuts-cake.svga,
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.comhtml: {{ CTX.news }}
style: find_all
value: ahtml: {
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.


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
Permission queries
Sensor type queries
Site and app management queries
Tag management queries
Task and execution analytics queries
Template management queries
Trigger type queries
Trigger management queries
User invite queries
User management queries
Workflow analytics queries
Workflow patch queries
Workflow management queries
Clone operations
Component mutations
Foreign object reference mutations
Form mutations
Organization trigger instance mutations
Organization variable mutations
Organization management mutations
Pack configuration mutations
Pack mutations
Page mutations
Site mutations
Tag mutations
Template mutations
Always validate user inputs before including in queries
Use organization and permission filters to restrict data access
Track usage patterns for potential security issues
Action configuration:
Operation type: mutation
Operation: updateOrgVariables
Variable values:
Action configuration:
Operation type: query
Operation: workflows
Variable values:
Action configuration:
Operation type: query
Operation: organizations
Variable values:
Verify the feature flag is enabled for your organization
Validate GraphQL syntax using a GraphQL validator
Check field names against the schema
Ensure variable types match the expected schema types
Implement exponential backoff for retries
Consider breaking large operations into smaller batches
Monitor API usage patterns
Begin with basic queries before building complex operations
For debugging, use the raw_query parameter to see exact queries
Review workflow execution logs for detailed error messages
Build queries incrementally, adding fields and filters gradually
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
id orgName email { name } .Raw Query: The complete raw GraphQL query string to execute - an alternative to operation-based approach
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: Booleancomponent(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!): JSONcrateUnpackingArgumentSet(
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
): FormmicrosoftCSPCustomer(
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): JSONpages(
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): JSONtag(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): TemplatetriggerType(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: Organizationuser(where: UserWhereInput, search: UserSearchInput): Userusers(
where: UserWhereInput
search: UserSearchInput
limit: Int
offset: Int
order: [[String!]!] = [["username"]]
): [User!]!getTestUsers(where: UserWhereInput): [User!]!getTestUserSession: UsertimeSavedGroupByWorkflow(
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!): JSONdailyTimeSavedByDateRange(
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!): ComponentdeleteComponent(id: ID!): BooleanduplicateComponent(id: ID!): ComponentcreateForeignObjectReference(
foreignObjectReference: CreateForeignObjectReferenceInput
): ForeignObjectReference
input CreateForeignObjectReferenceInput {
actionId: ID
id: ID
identifier: ID
orgId: ID!
packConfigId: ID
referenceId: ID!
workflowExecutionId: ID
}createOrUpdateForeignObjectReference(
foreignObjectReference: CreateForeignObjectReferenceInput
): ForeignObjectReferencecreateForm(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!
): JSONsetFormTags(form: SetFormTagsInput!): Form
input SetFormTagsInput {
id: ID!
tagIds: [ID!]!
}shallowCloneForm(
id: ID!
orgId: ID!
overrides: ShallowCloneOverridesInput
: Form)updateForm(form: FormUpdateInput!): FormdeleteForm(id: ID!): VoidupdateOrgTriggerInstance(
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!): IDupdateOrgVariables(
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!]!): VoidcreateOrganization(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!): VoidupdateManagedAndSubOrganizations(
organization: OrganizationUpdateInput!
): IntupdateOrganization(organization: OrganizationUpdateInput): OrganizationbulkUpdateOrganizationFeaturePreviewSettingByLabel(
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!): VoidrefetchPackConfigRefOptions(
packConfigId: ID!
reference: JSON
): JobRequestedResponsetestPackConfig(packConfig: PackConfigTestInput!): JobRequestedResponseupdatePackConfig(packConfig: PackConfigUpdateInput!): PackConfigupdatePackConfigs(
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): OrganizationgetPackInstallations(packId: ID!): PackInstalledByResponsegetPackPageUrl(integrationRef: String!, pagePath: String!): StringupdatePack(pack: PackUpdateInput!): PackcreatePage(
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]
): PagedeletePage(id: ID!): VoidupdatePageNode(id: ID!, props: JSON!): PageNodeupdatePageNodeByCraftId(
craftId: String!
pageId: ID!
props: JSON!
): PageNodecreateSite(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!): SiteupdateSites(sites: [SiteUpdateInput!]!): [Site!]!deleteSite(id: ID!): VoidvalidateSiteCustomDomainDNS(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!): IDupdateTag(tag: TagUpdateInput!): TagupdateTags(tags: [TagUpdateInput!]!): [Tag!]!setOrganizationTags(tagIds: [ID!]!, orgId: ID!): OrganizationcreateTemplate(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
}