Workflow action
Text toolkit
ut_text
Slugs, case conversion, {{placeholder}} templates, truncation, extraction, fuzzy matching, word counts and masking for workflow text.
About
What it does
Text toolkit covers the text clean-up and reshaping that workflows do all the time. Make URL- and file-safe slugs from titles (accents folded, & spelled out), convert between camelCase, snake_case, kebab-case, CONSTANT_CASE, Title Case and Sentence case, fill {{placeholder}} templates from an object with nested paths and fallbacks, shorten text for previews without cutting words in half, and pull values out from between markers.
For messy input there is fuzzy matching: Levenshtein distance, normalised similarity and Jaro-Winkler between two values, or the best match of a typed name in a list of candidates with a threshold, which is useful for matching free-text supplier or customer names to your records. Word count returns words, characters, sentences, paragraphs and reading time, and Mask hides card numbers, account numbers or email addresses before they are logged or sent. Everything runs in the sandbox with no network or data access.
Good for
- Match a supplier name typed on a form to the closest name in your vendor list
- Build a notification from a template with the requester's and record's fields
- Mask account or card numbers before writing them to a log, task or email
After installing
- Install the package: the action appears in Extensibility → Workflow actions and in the workflow designer's palette under Custom actions.
- Drag Text toolkit onto a workflow, choose the function and map its inputs from variables or form fields.
- Use the outputs from the data picker, e.g. {{slug_slug}} or {{match_best_match}}.
- Try the included "Text clean-up (sample)" workflow from the API or its start form: it slugs a title, fuzzy-matches a name and masks an account number.
Examples
Real inputs, real outputs
Each example ran in the sandbox when this gallery was built; the outputs are exactly what the step returns.
A slug from a title slugify
Inputs
{
"text": "Crème brûlée & Café Menu 2026!"
}Outputs
{
"slug": "creme-brulee-and-cafe-menu-2026"
}Best match for a misspelt name similarity
Inputs
{
"value": "Jon Smyth",
"candidates": [
"John Smith",
"Joan Smythe",
"Jonas Schmidt"
],
"threshold": 0.85
}Outputs
{
"distance": null,
"similarity": null,
"jaro_winkler": null,
"best_match": "Joan Smythe",
"best_score": 0.9515,
"best_index": 1,
"matched": true
}Fill a message template template
order.ship_date is missing, so its fallback "soon" is used.
Inputs
{
"template": "Hi {{customer.first_name}}, your order {{order.id}} ships {{order.ship_date | soon}}.",
"data": {
"customer": {
"first_name": "Aroha"
},
"order": {
"id": "SO-1042"
}
}
}Outputs
{
"result": "Hi Aroha, your order SO-1042 ships soon.",
"missing": [],
"replaced": 3
}Mask a card number mask
Inputs
{
"value": "4111 1111 1111 1111",
"mode": "keep_last",
"keep": 4
}Outputs
{
"masked": "**** **** **** 1111"
}Identifier to camelCase change_case
Inputs
{
"text": "customer order ID",
"case": "camel"
}Outputs
{
"result": "customerOrderId"
}Reference
Functions, inputs and outputs
The designer generates each function's input panel from these declarations; outputs appear in the data picker with their types.
Slugify slugify
Turn text into a URL- and file-name-safe slug: accents removed (é → e, ß → ss), & becomes "and", everything else that is not a letter or digit becomes the separator.
Inputs
textstring · required — The text to turn into a slug.separatorstring — Placed between words (up to 3 punctuation characters).lowercaseboolean — Lowercase the slug.max_lengthinteger — Optional: cut the slug to this many characters, at a word boundary when possible (0 = no limit).
Outputs
slugstring — For example creme-brulee-and-cafe-menu-2026.
Change case change_case
Convert between camelCase, PascalCase, snake_case, kebab-case, CONSTANT_CASE, Title Case, Sentence case, UPPER and lower. Words are split on spaces, punctuation and case changes (parseHTTPResponse → parse HTTP response).
Inputs
textstring · required — The text or identifier to convert.casechoice · camel / pascal / snake / kebab / constant / title / … — The case to convert to.
Outputs
resultstring
Fill template template
Replace {{name}} placeholders with values from an object. Paths reach nested values ({{customer.name}}, {{items[0].sku}}) and {{name | fallback}} gives a default. Objects and lists are inserted as JSON.
Inputs
templatetext · required — Text with {{placeholders}}.dataobject — The values, as an object.missingchoice · keep / blank / error — Keep the {{placeholder}}, leave it blank, or fail the step.
Outputs
resulttext — The filled-in text.missinglist of strings — Placeholder paths that had no value (and no fallback).replacedinteger — How many placeholders were filled.
Truncate truncate
Shorten text to a number of characters or words and add an ellipsis. In character mode the result, ellipsis included, fits the length and does not cut a word in half when it can avoid it.
Inputs
texttext · required — The text to shorten.lengthinteger · required — Maximum characters (or words).bychoice · chars / words — Count characters or words.ellipsisstring — Added when the text is cut; enter none for no ellipsis.preserve_wordsboolean — In character mode, cut at the last space instead of mid-word.
Outputs
resulttexttruncatedboolean — Whether the text was shortened.
Extract between extract_between
Find the text between a start and an end marker (the first match or all of them). Leave the start empty to read from the beginning, or the end empty to read to the end.
Inputs
texttext · required — The text to search.startstring — Text just before the value.endstring — Text just after the value.allboolean — Return every match instead of the first.include_markersboolean — Keep the start and end markers in the result.case_sensitiveboolean — Match the markers exactly (off: ignore case).trimboolean — Trim spaces around each match.
Outputs
valuestring — The first match (empty when none).matcheslist of strings — Every match (one when All matches is off).countintegerfoundboolean
Similarity / fuzzy match similarity
Compare a value with another (Levenshtein distance, normalised similarity 0–1 and Jaro-Winkler) and/or find its best fuzzy match in a list of candidates, with a threshold.
Inputs
valuestring · required — The text to compare or look up.compare_tostring — Optional: a second text to compare with.candidateslist — Optional: a list of texts to find the best match in.thresholdnumber — Score (0–1) at or above which it counts as a match.methodchoice · jaro_winkler / levenshtein — Score used for the candidate list and the threshold.case_sensitiveboolean — Off: compare ignoring case (spaces are always normalised).
Outputs
distanceinteger — Levenshtein distance between Value and Compare to (empty without Compare to).similaritynumber — 1 − distance / longer length (0–1).jaro_winklernumber — Jaro-Winkler score (0–1).best_matchstring — The candidate with the highest score (empty without candidates).best_scorenumberbest_indexinteger — Position of the best match in the list (from 0; −1 when none).matchedboolean — Whether the score reaches the threshold.
Word count word_count
Count words, characters (with and without spaces), sentences and paragraphs, and estimate the reading time.
Inputs
texttext — The text to count (empty text counts as 0).words_per_minuteinteger — Words per minute for the reading time.
Outputs
wordsintegercharactersintegercharacters_no_spacesintegersentencesintegerparagraphsintegerreading_minutesinteger — Rounded up; 0 for empty text.
Mask mask
Hide part of a sensitive value: keep the last or first N characters, mask everything, or mask an email address (a***@example.com). Spaces and dashes can stay visible so the shape remains readable.
Inputs
valuestring · required — The value to mask.modechoice · keep_last / keep_first / email / all — What to keep visible.keepinteger — N for Keep the last / first N (never more than half of the value is shown).mask_charstring — The character that replaces hidden ones.preserve_separatorsboolean — Leave spaces, dashes, dots, slashes, + and brackets unmasked.
Outputs
maskedstring
Network
None. The action cannot make requests.
Data and files
None. It only sees its inputs.
Secrets
None.
Install
Install it in your workspace
Works on UserTasks cloud and any self-hosted instance. The action lands in Extensibility → Workflow actions, enabled, with its sample workflow.
In the app
- Open Extensibility → Workflow actions → Browse gallery and choose Install on Text toolkit. Or download workflow-action-text-toolkit-1.0.0.utpkg and drag it onto Automations → Packages.
- The wizard verifies the checksum, every file hash and the signature, and shows what it adds.
- In the workflow designer, drag Text toolkit from Custom actions, pick a function and fill its inputs. Save & Test shows the typed outputs.
With the CLI
curl -fLO https://usertasks.com/gallery/workflow-action-text-toolkit-1.0.0.utpkg
usertasks packages install workflow-action-text-toolkit-1.0.0.utpkg
usertasks activities test ut_text -f '{"operation":"slugify"}'Verify the download
- File SHA-256
- aaaa3b20dfd3e1166f441f30ae62b19dda7df50c77cab177c74cfe3d5477010e
- Package checksum (what is signed)
- sha256:9c16b3fc932b8552c4aa4ed8857cea5f961922266d7e358a1bd9261f4ffe9556
- Module SHA-256
- 393bb9c0379ccfa3d8b0871b041a32cdf7ca72f39fc37566022d39c300883b4e
- Signer
- UserTasks Gallery · 49:f3:04:90:47:02:4d:07:28:61:3d:dc:bb:aa:db:11
More workflow actions
All actionsCrypto & IDs
ut_crypto
UUID v4/v7 and ULIDs, SHA hashes, HMAC webhook signatures with a stored secret, base64/hex/URL encoding, random and one-time codes, and HS256 JWTs.
UUID · ULID · Hash · HMAC signature · Encode · Decode · +4 more
10 functions Uses secrets
Data transform
ut_data
Select by JSON path, map, filter, sort, group and aggregate, pivot, de-duplicate and join lists of records, and convert CSV to JSON and back.
Select (JSON path) · Map fields · Filter · Sort · Group & aggregate · Pivot · +5 more
11 functions Pure computation
Dates & business calendar
ut_dates
Business days around holidays, SLA due times in working hours across time zones and DST, durations and ages, recurring schedules and fiscal periods.
Add business days · SLA due time · Duration / age · Convert time zone · Next occurrences · Fiscal period
6 functions Pure computation