Custom transform
With our new Custom transform step, you can create your own custom Parabola transformation steps by simply typing out instructions using plain language. The days of stringing together dozens of steps to work through complex logic are over—and in its place, we’re introducing our most powerful step ever.
The Custom transform step is included on all plans at launch at no additional cost. Parabola reserves the right charge for usage of AI-powered steps.
Generate custom steps for your exact needs
The Custom transform step lets you describe the logic you want to run on your data, and automatically generates a custom step using AI. This improvement will eliminate complex building patterns, enable faster Flow building, and unlock totally new data transformation and analysis capabilities.

How to use the step
The Custom transform step works best for logic-based tasks—calculations, formatting, and structured transformations—similar to what you’d normally do with Excel formulas or Parabola’s other Transform steps.
Your input
- A table of data
- Data transformation instructions—exactly how you'd explain it to a teammate
- Example prompt: "Calculate total revenue for men's products by SKU per month. Return the following columns: Month, SKU, Product Title, and Revenue. Format revenue as currency ($100.00)."
Parabola's output
- An updated dataset, transformed based on your instructions
- Documentation outlining the logic in your AI-generated code
Locking your instructions
- Once you’re happy with the results of the step, you can select "Keep the logic" to ensure consistent results. More in the FAQs below.
Try it now with sample data
Video overview
Example use cases
The list of ways that you can use this step are truly endless. Here are some examples for inspiration—and you can find fleshed-out example prompts below:
- Perform calculations across rows of data, like percent of total and weighted average calculations
- Perform date math, like adding a number of days or weeks to a date value to calculate SLA performance, or extracting the week-of-the-year as a number
- Perform complex statistical calculations, like finding the first and third quartile
- Create pivot tables or add subtotal and total rows, like a dynamic sales report where you can see both sales totals and averages by metric
- Dynamically convert column names based on patterns, like assigning week numbers to columns for upcoming periods in your demand planning table
- Duplicate rows based on conditional logic, like duplicating order line items with where the quantity is greater than one for your 3PL
- Add rows to fill in the values between two numbers or dates, like filling in all values between two zip codes
- Extract text using custom logic, like extracting values from the middle of a consistently-formatted list
- Generate unique IDs, like SKUs for all new parts received from a vendor
- [Beta] Create JSON schemas and HTML tables, like API request bodies and nicely-designed tables to insert in email bodies
In short: If you can describe it in code or Excel, you can probably build it with this step.
Build your own use case using a custom transform
Templates
Want to see the step in action? Explore these Templates from our use case library that leverage this step:
- Carrier scorecard: In this Template, we use the Custom transform step to calculate scorecard metrics such as damage-free rate, total shipments by carrier, and on-time performance. We also use the step to generate an HTML-formatted table, which we then include in a Send email by rows step.
- Inventory reconciliation: To identify discrepancies in this Flow, we use a Custom transform step to remove retired products, calculate discrepancies across our ERP, WMS, and Shopify, and then output a "SKU Status" column indicating where discrepancies exist.
- Freight & parcel invoice audit: To identify billing overages, in this Template we use a Custom transform step to calculate discrepancies between our quoted rate and amount invoiced—calculating both the actual amount and a percentage. From there, we format our results accordingly.
Best practices
As with any tool that leverages LLMs, the more specific your instructions are, the better your results will be. Here are some prompting tips:
- Be as specific as possible regarding your target output. Specify whether columns or rows should be added, removed, or modified. If you’re adding new columns, specify how you want the column(s) to be named.
- In your instructions, reference exact column names from your input table.
- Use examples to clarify complex logic.
Beyond prompting, here are some additional best practices:
- Break large processes into multiple Custom transform steps to maintain Flow readability and improve results. The more you ask the LLM to do in a single prompt, the less accurate the results will be.
- Enable “Keep this logic” once your results are accurate.
- If you need help fine-tuning your prompt, run it through ChatGPT and ask, “How should I improve these instructions for use in Parabola’s Custom transform step?”
- If your Flow results on values being very standardized after this step, consider using a Standardize with AI step for post-processing.
Put these into practice in-app
FAQs
- Q: How broad should my prompts be within a single step?
- A: Custom transform step results will be most accurate with focused prompts. Think about one Custom transform step as doing a similar amount of work as any other Parabola Transform step for best results. For more complex tasks, consider using multiple Custom transform steps
- Q: When should I use out-of-the-box Transform steps (like Filter rows) vs. Custom transform?
- A: If a step already exists for the transformation you’re trying to accomplish, we will always recommend using the pre-built step. Steps like Edit columns and Add math column have been extensively tested by Parabola’s engineering team to ensure they are performative and results are accurate. We recommend you use a Custom transform step when you need a step that doesn’t yet exist.
- Q: Can this step accept multiple inputs or combine tables?
- A: The Custom transform step can only accept a single input table; it cannot take two or more input tables. Continue using steps like Combine tables and Stack tables for multi-input transformations.
- Q: What’s the difference between “Regenerate logic each time” and “Keep this logic”?
- A: Regenerate logic each time: When this setting is enabled, the step will re-evaluate your instructions and data every time the step runs before generating the custom code that powers your step. This is like getting a fresh set of eyes on the data and instructions every time, and can be useful if context from your data may change from run-to-run and should be taken into consideration when step logic is being generated.
- A: Keep this logic: When this setting is enabled, we’ll use the same logic summary to generate code every time the Flow runs without re-looking at your instructions or data. This ensures that your step logic stays consistent from run to run.
- Q: When should I use steps like Experiment with AI or Categorize with AI instead of a Custom transform step?
- A: The Custom transform step is best for logic-based transformations—especially those involving math or data analysis.For interpreting or generating content, steps like Extract with AI and Categorize with AI will be the most useful.
- Q: Can this step pull information from the web or external services?
- A: No; this step cannot search the web today. You can use Parabola’s API steps to pull in external data.
- Q: How is this step priced?
- A: The Custom transform step is included on all plans at launch at no additional cost. Parabola reserves the right charge for usage of AI-powered steps.
- Q: Are there any step limitations or ‘gotchas?’
- A: Keep these in mind when working with this step:
- This step works best when tabular data is coming in and out, just like our normal Transform steps. While the step does have some HTML- and JSON-generating capabilities, these additional output formats are in beta today.
- This step can only take a single table in.
- This step cannot search the web.
- This step cannot accept multiple inputs.
- Keep in mind that LLM-generated steps can be less predictable than pre-built Parabola steps.
- A: Keep these in mind when working with this step:
Example prompts
These prompts are meant to show off some common categories of use cases for the Custom transform step. They should also provide guidance for what "good prompting" looks like in practice:
Conditional if/else logic
- SLA monitoring: Create a new column called “SLA Status.” Compare the “Order date” against the “Shipment date” columns. If the difference between the two dates is 2 business days or less, set the column value to, “Within SLA.” If the difference is 3 business days or more, return the value, “SLA Breach.”
- Refund reporting: If the "Order Status" column equals "Cancelled" and "Payment Received" equals "No," create a new column called "Refund Action Needed" with the value "Initiate Refund"; otherwise set it to "No Action." Capitalize all values.
- Shipping categorization: Create a column named "Shipping Category" where if "Shipping Time (Days)" is less than or equal to 2, set it to "Express"; if between 3 and 7, set it to "Standard"; if greater than 7, set it to "Delayed." Output should be in all uppercase letters.
Simple math calculations
- Price calculation: Create a column "Discounted Price (USD)" by taking "Original Price" * (1 - ("Discount %" / 100)). Format results as currency with two decimal places, e.g., $123.45.
- Days to ship: Create a new column called "Days to Ship" by subtracting "Order Date" from "Ship Date." Ensure the result is a whole number and append the word "days" (e.g., "5 days").
Complex math calculations & statistics
- Percentiles: Using the "Total Spend (USD)" column, calculate the percentile rank for each customer based on their total spend compared to all customers. The percentile rank should represent the percentage of customers who spent less than the current customer. Store the result in a new column named "Spend Percentile (%)". Format the value as a percentage with two decimal places (e.g., "92.45%"). Example: If a customer’s spend is higher than 92% of other customers, their "Spend Percentile (%)" should show "92.00%". Only consider customers with "Account Status" equal to "Active" when calculating percentile rankings.
- CAGR: Calculate the "CAGR (%)" using "Initial Investment," "Final Value," and "Investment Years" columns, using the formula: ((Final Value / Initial Investment)^(1/Investment Years) - 1) * 100. Round to two decimal places and format results with a "%" symbol at the end.
- Weighted average: Compute a "Performance Score" by multiplying "Test Score" * 0.5 + "Project Score" * 0.3 + "Attendance Score" * 0.2. Output this score rounded to the nearest whole number and store it in a new column called "Total Performance (Pts)."
Discrepancy detection & validation
- Rate audit: Create a new column called "Pricing Discrepancy Flag." If "Expected Price" and "Billed Price" differ by more than 5%, mark it as "Review Needed"; otherwise, "OK." Format results in title case.
- Data validation: Create a column "Date Validation Result" where if "Contract End Date" is earlier than "Contract Start Date" or if "Contract Length (Months)" is negative, set value to "Invalid Dates"; otherwise "Valid." Results should be in all caps.
Text parsing and extraction
- Domain extraction: From the "User Email" column, extract the domain (everything after "@") and store it in a new column called "Email Provider," converting all domains to lowercase.
- Zip code parsing: From the "Address" column, extract just the ZIP code assuming it is always the last 5 digits, and store it in a new column called "ZIP Code" as a pure numeric field (no quotes or special characters).
Data clean-up & formatting
- Name clean-up: Clean the "Full Name" column by trimming leading/trailing spaces, replacing multiple spaces with a single space, and converting names to title case (e.g., "mARy aNN SMITH" becomes "Mary Ann Smith").
- Phone number reformatting: In the "Phone Number" column, remove any non-numeric characters and reformat numbers in the (XXX) XXX-XXXX format. Output clean phone numbers in a new column called "Formatted Phone Number."
JSON & HTML generation
- Building HTML block: Create an HTML <div> block for each product, formatted as: <div><h2>Product Name</h2><p>Price: $Price USD</p></div>. Use the columns "Product Name" and "Price." Store it in a column called "Product HTML Snippet."
- Slack message request body generation: Create a new column called, “Slack message JSON.” Use the data in the row to generate a JSON-formatted Request Body for me to put into a Slack API call. Ensure the JSON is valid. In the message, include information about the product sold and total revenue. For instance, "New sale! 4 Women's Atheleisure Tops were sold for $120." Format currency with zero decimals. Follow the JSON scheme outlined below:
Pivot-table-style reformatting
- Sales reporting by country: Group by "Country" and sum "Total Sales (USD)," "Units Sold," and "Profit Margin." Output one summarized row per country, rounding all monetary fields to two decimal places. Include a currency sign (ex. $120.70).
- Adding total rows: Analyze the product sales data and return the following columns, formatted as outlined in parenthesis: Product Title, Total Sales (Currency: $100.00), Quantity Sold (Integer: 1 or 40), Avg Units Sold per Day (Rounded to 1 decimal place: 20.7). Do not include the information in parenthesis in the header names. Sort the data by Men’s, then Women’s, then Unisex. Under each category of products, include a sub-total row (for instance, showing total sales across all men’s products). Put the sub-total row directly under the corresponding category rows in the middle of the table, and print "{GENDER} SUB-TOTAL" in all caps. At the bottom of the dataset, include a total row that aggregates/averages metrics across every row.
Table reformatting
- Pivoting values to headers: Pivot the dataset so that each unique value in the "Order Month" column becomes a new column, and the corresponding "Revenue" values are placed into each month’s column. For example: If "Order Month" has "January" and "February," create two new columns "Revenue - January" and "Revenue - February" populated with the "Revenue" amount. Fill in "0" where a month is missing for a customer. Store the pivoted result and maintain the original "Customer ID" and "Customer Name" columns at the beginning.
- Creating category headers: Pivot the dataset where each unique "Payment Method" (e.g., Credit Card, PayPal, Gift Card) becomes a new column. Populate the new columns with the total "Amount Paid" for each customer. Example: Create columns "Credit Card," "PayPal," etc. Missing payment types for customers should be set to "$0.00". Format all amounts as currency with two decimal places.