Workflows
When something happens, do these steps — send a message, tag a customer, call another app. This page covers using your customers' details in those steps, and changing how they look.
Using details in a step
Any box with an Insert button can use details from the workflow — the customer’s name, the order total, the time of the booking. Pick one from Insert and it is placed in the box as a value in double curly brackets, like{{contact.firstName}}. When the workflow runs, it is replaced with the real detail for that customer.Tip
Open What this step can use at the top of a step to see every detail available there, with an example of what each one holds.
Changing how a detail looks
Next to every detail in Insert there is a Change it button. Use it to show money as money, a name in capitals, a date your way, or the date three days later. You pick changes from a list and see the answer straight away — no typing rules.1
Pick the detail
In any message or box, click Insert, find the detail, and click Change it.
2
Add changes
Search for what you want in everyday words — “money”, “add days”, “capitals”, “timezone”. Add as many as you like; each one works on the result of the one before it.
3
Check the answer, then insert
The Try it box shows the result with an example value, on your business’s clock and currency. Type your own example to test it.
{{trigger.order.total | add_percent:18 | currency}}— the total plus 18% GST, as money.{{trigger.appointment.startTime | subtract_time:1 day | format_date:dddd, D MMM [at] h:mm a}}— “Wednesday, 14 Oct at 2:30 pm”.{{contact.name | first | title}}— just the first name, with a capital letter.{{trigger.price | times:trigger.quantity}}— another detail can be used as the number.
Note
Dates are always shown on your business’s clock (Settings → timezone) unless you add Change timezone. A date typed like 05/10/2026 is read as 5 October unless your business uses US dollars, where it is read the American way.
Two steps for working things out
- Do a calculation. Type a sum using details, like
{{trigger.order.total}} * 18%. Use + − * / and brackets; round(), min(), max() and abs() work too. The answer appears under the box as you type, and is saved for later steps as{{vars.result}}(or the name you choose). If a detail is empty you choose whether to count it as 0 or stop; if it is words, the step stops and says which detail it was. - Change a value. Start with a detail, add changes from the same list as above, and save the result — handy when several later steps need the same changed value.
Saving records in your CRM
The Zoho CRM, HubSpot and Salesforce steps can create or update a record in any module or object, including your own custom ones. Chatbots can do the same with the Save a record steps.- Which module. Your custom modules appear by the names you gave them.
- What to do. Always create a new record, update the one that already has the same phone or email (otherwise create it), or update a record whose ID you insert from an earlier step.
- Fields to save. Pick a field and what to put in it. Required fields are listed so you can add them in one tap. A value that comes out empty is skipped, so it never wipes what is already there.
Note
Zoho CRM connections made before 16 October 2026 need to be connected again once to update records in custom modules, Accounts or Deals. Creating records works without it.
Every change: Text
Capitals, spaces, cutting, swapping words, pulling out an email.| Change | What it does | Written as | Example |
|---|---|---|---|
| UPPERCASE | Makes the text all capitals. | upper | priya → PRIYA |
| lowercase | Makes the text all small letters. | lower | PRIYA@SHOP.IN → priya@shop.in |
| Title Case | Capitalises the first letter of each word. | title | priya sharma → Priya Sharma |
| Capital first letter | Capitalises only the very first letter. | capitalize | your order is ready → Your order is ready |
| Trim spaces | Removes spaces from the start and end. | trim | Priya → Priya |
| Tidy spaces | Turns line breaks and double spaces into single spaces. | clean | Flat 4, MG Road → Flat 4, MG Road |
| First word | Just the first word — a first name from a full name. On a list, the first item. | first | Priya Sharma → Priya |
| Last word | Just the last word — a surname. On a list, the last item. | last | Priya Sharma → Sharma |
| First few words | Keeps only the first so-many words. | words:3 | Thank you so much for the order → Thank you so |
| Shorten | Cuts the text down to a number of characters and adds … | truncate:8 | Blue cotton kurta → Blue co… |
| First characters | Keeps the first so-many characters, without adding … | left:3 | ORD-2026-0042 → ORD |
| Last characters | Keeps the last so-many characters. | right:4 | 9876543210 → 3210 |
| Part of the text | Takes characters from a position you choose. | part:5,4 | ORD-2026-0042 → 2026 |
| Add before | Puts some text in front. | prepend:# | 42 → #42 |
| Add after | Puts some text on the end. | append:" kg" | 5 → 5 kg |
| Find and replace | Swaps every copy of some text for something else. Matches capitals exactly. | replace:-,/ | 2026-10-15 → 2026/10/15 |
| Remove text | Takes out every copy of some text. | remove:"+91 " | +91 98765 → 98765 |
| Split into a list | Breaks text into a list at a separator — a comma by default. | split | red, blue, green → red, blue, green |
| Digits only | Strips everything that isn't a number 0–9. | digits | +91 98765-43210 → 919876543210 |
| Remove web formatting | Removes HTML tags, keeping just the words. | strip_html | <p>Hello <b>Priya</b></p> → Hello Priya |
| Make link-friendly | Lowercase, with dashes instead of spaces — for links and codes. | slug | Diwali Sale 2026! → diwali-sale-2026 |
| Initials | The first letter of each word. | initials | Priya Sharma → PS |
| Hide all but the end | Hides letters and digits with * except the last few — for phone or card numbers. | mask | 9876543210 → ******3210 |
| Add leading zeros | Pads with zeros at the front to a fixed length — 42 becomes 00042. | pad:5 | 42 → 00042 |
| Count words | How many words there are. | count_words | Is my order ready → 4 |
| Reverse | Turns text, or a list, back to front. | reverse | abc → cba |
| Find a number | Pulls the first number out of a sentence. | extract_number | I want 3 boxes please → 3 |
| Find an email | Pulls the first email address out of a message. | extract_email | mail me at priya@shop.in thanks → priya@shop.in |
| Find a phone number | Pulls the first phone number (8 to 15 digits) out of a message. | extract_phone | call 98765 43210 after 5 → 9876543210 |
| Find a link | Pulls the first web link out of a message. | extract_url | see https://shop.in/a1 now → https://shop.in/a1 |
| For a web address | Escapes the text so it is safe inside a link. | urlencode | red shoes → red%20shoes |
| Base64 | Encodes the text as Base64 — some apps ask for this. | base64 | hi → aGk= |
Every change: Numbers & sums
Add, take away, multiply, percentages, rounding, money.| Change | What it does | Written as | Example |
|---|---|---|---|
| Add | Adds a number. A blank counts as 0, so this works as a counter. | plus:50 | 1200 → 1250 |
| Take away | Subtracts a number. | minus:100 | 1200 → 1100 |
| Multiply | Multiplies by a number — price times quantity. | times:3 | 250 → 750 |
| Divide | Divides by a number. Dividing by 0 gives a blank. | divide:4 | 1000 → 250 |
| Remainder | What is left over after dividing. | remainder:5 | 17 → 2 |
| Percentage of it | That percentage of the number — 18% of 1,000 is 180. | percent:18 | 1000 → 180 |
| Add a percentage | Adds a percentage on top — 1,000 plus 18% GST is 1,180. | add_percent:18 | 1000 → 1180 |
| Take off a percentage | Takes a percentage off — 1,000 less a 10% discount is 900. | less_percent:10 | 1000 → 900 |
| Round | Rounds to a number of decimal places (0 for a whole number). | round:2 | 12.345 → 12.35 |
| Round up | Always rounds up to a whole number. | round_up | 4.1 → 5 |
| Round down | Always rounds down to a whole number. | round_down | 4.9 → 4 |
| Without minus sign | Turns -50 into 50. | abs | -50 → 50 |
| Never below | If the number is smaller than this, use this instead. | at_least:0 | -3 → 0 |
| Never above | If the number is bigger than this, use this instead. | at_most:100 | 140 → 100 |
| Number with commas | Formats as a number with thousands separators. | number | 125000 → 1,25,000 |
| Fixed decimals | Always shows this many decimal places, with thousands separators. | decimals:2 | 1250 → 1,250.00 |
| Money | Formats as money in your currency — or type a currency code like USD. | currency | 1250 → ₹1,250.00 |
| Short number | Shows big numbers short — 1.2L, 3.4K. | compact | 120000 → 1.2L |
| 1st, 2nd, 3rd | Adds st, nd, rd or th. | ordinal | 22 → 22nd |
| Plain number | Reads the number out of text like "Rs. 1,250.50". Blank if there isn't one. | to_number | Rs. 1,250.50 → 1250.5 |
Every change: Dates & times
Show a date your way, add days, change the timezone, count days.| Change | What it does | Written as | Example |
|---|---|---|---|
| Date | Shows a date as DD/MM/YYYY, on your clock. | date | 2026-10-15T14:30:00+05:30 → 15/10/2026 |
| Time | Shows the time of day. | time | 2026-10-15T14:30:00+05:30 → 02:30 pm |
| Date and time | Shows both the date and the time. | datetime | 2026-10-15T14:30:00+05:30 → 15/10/2026, 02:30 pm |
| Date in my own style | Shows a date exactly how you want — pick a style or type one like D MMM YYYY. | format_date:"ddd, D MMM YYYY [at] h:mm a" | 2026-10-15T14:30:00+05:30 → Thu, 15 Oct 2026 at 2:30 pm |
| Add time | Moves a date later — 3 days, 2 hours, 1 month. | add_time:3 days | 2026-10-15T14:30:00+05:30 → 2026-10-18T14:30:00+05:30 |
| Take away time | Moves a date earlier — 1 day before an appointment. | subtract_time:2 hours | 2026-10-15T14:30:00+05:30 → 2026-10-15T12:30:00+05:30 |
| Start of the day / month | Jumps to the very start of the day, week, month or year. | start_of:month | 2026-10-15T14:30:00+05:30 → 2026-10-01T00:00:00+05:30 |
| End of the day / month | Jumps to the very end of the day, week, month or year. | end_of:day | 2026-10-15T14:30:00+05:30 → 2026-10-15T23:59:59+05:30 |
| Change timezone | Shows the date and time in another country's clock. Add a date style after this. | timezone:Asia/Dubai | 2026-10-15T14:30:00+05:30 → 2026-10-15T13:00:00+04:00 |
| Read a date written as | Reads a date typed in a set style, like 15/10/2026 or 15-Oct-2026, so the other date changes work on it. | parse_date:DD/MM/YYYY | 15/10/2026 → 2026-10-15T00:00:00+05:30 |
| Day of the week | Monday, Tuesday… | weekday | 2026-10-15T14:30:00+05:30 → Thursday |
| Month name | January, February… | month_name | 2026-10-15T14:30:00+05:30 → October |
| How long until | How many days (or hours…) from now until the date. | time_until:days | 2026-10-20 → 5 |
| How long ago | How many days (or hours…) have passed since the date. | time_since:days | 2026-10-10 → 5 |
| Time between two dates | How long from another date to this one — nights of a stay, days to deliver. | time_between:2026-10-15,days | 2026-10-18 → 3 |
| Age in years | Whole years since the date — a birthday gives an age. | age | 1990-05-20 → 36 |
| In plain words | "tomorrow", "in 3 days", "2 hours ago". | relative | 2026-10-16T18:00 → tomorrow |
| Standard date (for other apps) | The full date and time in the standard form other software reads. | iso | 15/10/2026 → 2026-10-15T00:00:00+05:30 |
| YYYY-MM-DD | Just the date, in the form spreadsheets and apps read. | iso_date | 2026-10-15T14:30:00+05:30 → 2026-10-15 |
| Unix timestamp | Seconds since 1970 — some apps ask for dates this way. | timestamp | 2026-10-15T14:30:00+05:30 → 1792054800 |
Every change: Lists
Join, count, add up, sort, pick one item.| Change | What it does | Written as | Example |
|---|---|---|---|
| Join a list | Turns a list into text with a separator between — a comma by default. | join:" / " | vip, gold → vip / gold |
| How many | The number of items in a list, or characters in text. | length | a, b, c → 3 |
| Pick one item | The item at a position — 1 is the first, -1 the last. | item:2 | Tea, Cup, Saucer → Cup |
| Only the first few | Keeps the first so-many items of a list. | limit:2 | a, b, c, d → a, b |
| One detail from each | From a list of items, keep one detail of each — every product's name. | pluck:name | {"name":"Tea","qty":2}, {"name":"Cup","qty":1} → Tea, Cup |
| Add them up | The total of a list of numbers. | sum | 100, 250, 50 → 400 |
| Average | The average of a list of numbers. | average | 4, 5, 3 → 4 |
| Smallest | The lowest number in a list. | smallest | 40, 12, 90 → 12 |
| Largest | The highest number in a list. | largest | 40, 12, 90 → 90 |
| Sort | Puts a list in order — A to Z, or smallest number first. | sort | pear, Apple, fig → Apple, fig, pear |
| Remove repeats | Keeps each item once. | unique | vip, gold, vip → vip, gold |
| Remove blanks | Drops empty items from a list. | drop_blanks | a, , b → a, b |
Every change: Other
A fallback for blanks, Yes / No, swapping codes for words.| Change | What it does | Written as | Example |
|---|---|---|---|
| Fallback | Used when the value is empty. A real 0 is kept. | default:friend | (empty) → friend |
| Yes or No | Shows Yes or No — or your own words — for a true / false value. | yesno | true → Yes |
| Swap codes for words | Turns codes into words: paid=Paid in full; pending=Not paid yet; *=Other. | swap:paid=Paid in full; pending=Not paid yet | pending → Not paid yet |
| As JSON | Turns a whole group of values into JSON text, for another app. | json | {"a":1} → {"a":1} |
| Read JSON | Reads JSON text into values you can use — for answers from another app. | parse_json | {"a":1} → {"a":1} |
Date styles
Date in my own style and Read a date written as use these letters. Put ordinary words in [square brackets], like[at].| Letters | Shows |
|---|---|
| D · DD · Do | 5 · 05 · 5th |
| M · MM · MMM · MMMM | 10 · 10 · Oct · October |
| YY · YYYY | 26 · 2026 |
| ddd · dddd | Thu · Thursday |
| h · hh · H · HH | 2 · 02 · 14 · 14 |
| mm · ss | minutes · seconds |
| A · a | PM · pm |
| Z | +05:30 |