# Examples

> Nineteen ready-made workflows to copy onto your canvas: routing, status follow-ups, closures, AI hand-offs, Discord alerts and more.

Source: https://joely.io/documentation/automations/examples
Last updated: 2026-10-31

Every example below is a real workflow. Copy it, paste it on your canvas, fill in what belongs to your project, and it is ready to run. The empty canvas offers the same list: click **Use template** in the middle of a new workflow.

## How to use an example

1. Click **Copy workflow** on an example.
2. Open **Automations** in the dashboard, then start a new workflow.
3. Press `Ctrl+V` (`Cmd+V` on a Mac) on the empty canvas.
4. Open the nodes marked as not configured and fill them in.
5. Save the workflow. It turns on as soon as it is complete.

An example only ships what any project can use. **A value that belongs to one project arrives empty**: a team member, a Discord channel, a Tebex category, a form button, a tag or a webhook URL. The text around it is already written, so a Discord notification keeps its title and message while it waits for its channel. Until every node is filled in, the workflow saves as a [draft](https://joely.io/documentation/automations/building-workflows.md) and cannot be turned on.

Two requirements come from the nodes themselves:

- *Assign to a user* needs the **Team** plan. On a lower plan, an example containing it opens the upgrade window instead of landing on the canvas.
- *Ask AI* and *Tag with AI* need the **AI assistant** to be on for the project. While it is off, those actions are skipped and the rest of the workflow runs.

Messages are written in English. Edit them to your own voice, or turn on **Translate for the customer** on a chat message (**Team** plan).

## Route tickets by package category

Send each ticket to the maintainer of its package category, whether the package is known at creation or linked later.

Workflow: Ticket creation + Package selected → Field condition → Assign to a user

Needs configuration: Field condition, Assign to a user

A rule on a category keeps working as the shop adds scripts, where a rule on packages would need updating each time. The two triggers cover both cases: the package is known when the ticket opens, or it gets linked later. The action uses **Add to assignees**, so a ticket about two scripts reaches both maintainers when you run one workflow per category.

## Ask for the package, then route

Ask the customer which package a new ticket is about, assign it when they answer, and lower its priority when they do not know.

Workflow: Ticket creation → Ask for the package

- **Package selected:** Assign to a user → Post message
- **None / other:** Set priority → Post message

Needs configuration: Assign to a user

The run waits for the customer's answer. When they name a package, the ticket goes to the member you pick and a system line records the choice. When they answer *Other / not listed*, the ticket drops to *Low* and the customer is asked for more detail.

## Customer replied, back to the team

Move a ticket out of Awaiting customer as soon as the customer answers, and tell the assigned staff.

Workflow: On chat message → Field condition → Field condition → Set status → Discord notification

A ticket stays in **Awaiting customer** after the customer answers, so it can sit unnoticed in a filtered list. This workflow moves it to **In progress** and sends a Discord DM to the assigned team members. A ticket with no assignee moves all the same, the DM just has nobody to reach.

## Staff replied, awaiting customer

Move a ticket to Awaiting customer when a team member replies, so the list shows whose turn it is.

Workflow: On chat message → Field condition → Field condition → Set status

The mirror of the previous example. *Team member* also matches the project owner, and never the assistant or a workflow, so an AI reply does not move the ticket, and neither does an internal note. Use both examples together and the status shows whose turn it is.

## Soft close after Resolved

Warn the customer when a ticket is resolved, then close it after 3 days unless they reply.

Workflow: Status changed → Field condition → Post message → Schedule closure

The customer gets a heads-up, then 3 days to answer. **Cancel if the customer replies** is checked: a reply cancels the closure and hands the ticket back as **Open**.

## Follow up, then close silent tickets

Check in when a customer has not answered for 3 days, then close the ticket 3 days later unless they reply.

Workflow: No activity → Field condition → Post message → Schedule closure

The *No activity* trigger is set to 3 days, and the condition keeps it to tickets where a team member spoke last, so a customer waiting for an answer is never chased. *Team member* does not include the assistant: a ticket the AI answered last gets no follow-up. The follow-up does not restart the silence clock. If the customer answers, the closure is cancelled and the ticket goes back to **Open**; if not, it closes 3 days later.

## AI first, then hand off

Let the AI answer a new ticket, and assign a team member when it says a human will take over.

Workflow: Ticket creation → Ask AI → Field condition → Assign to a user → Discord notification

Needs configuration: Assign to a user

The assistant answers the ticket as soon as it opens. When it tells the customer that a person will take over, the **AI asked for a human** field turns true: the ticket goes to the member you pick, who gets a Discord DM. With the automatic reply on, the customer still gets a single answer, because the auto-reply is not scheduled for a message *Ask AI* already answered.

## First reply takes the ticket

Assign an unassigned ticket to the team member who answers it first.

Workflow: On chat message → Field condition → Field condition → Assign to a user

*Assign to a user* targets **Whoever triggered this**, so there is nobody to pick. The check on **Assignees** is what makes it "first": once someone is assigned, later replies stop at the condition. An internal note does not take the ticket. This example is complete as soon as you paste it, but it still needs the **Team** plan.

## Urgent Discord alert

Mark tickets opened from one form button as urgent and post them in a Discord channel.

Workflow: Ticket creation → Field condition → Set priority → Discord notification

Needs configuration: Field condition, Discord notification

Pick the form button customers use for urgent requests, and the Discord channel to alert. The workflow sets the priority itself because portal tickets start at *Medium*: a condition testing for *Urgent* right after **Ticket creation** would only ever match tickets opened by your team.

## Qualify with buttons

Ask the customer what they need with three buttons, and treat each answer its own way.

Workflow: Ticket creation → Post message

- **I found a bug:** Set priority
- **I have a question:** Ask AI
- **Something else:** Post message

Each button is an output of the message, and the run waits for the customer's click: a bug raises the priority, a question goes to the assistant, anything else leaves an internal note for the team. The question branch needs the AI assistant to be on. Only a package question holds the automatic reply back, so with the auto-reply on, the assistant can answer next to the buttons, then again if the customer picks the question.

## Reopened ticket alert

Tell the assigned staff when a closed ticket comes back, and set its priority to High.

Workflow: Status changed → Field condition → Discord notification → Set priority

The DM goes to the assigned team members only: the customer who reopened the ticket does not need to hear about it. A ticket with no assignee has nobody to notify, and the priority is set all the same. The action sets *High* whatever the ticket had, so a ticket that was *Urgent* comes back at *High*.

## Sync status changes to your tools

Send every status change to your own endpoint, and leave an internal note when it refuses the call.

Workflow: Status changed → Call a webhook → Field condition → Post message

Needs configuration: Call a webhook

Add your endpoint's URL and adapt the JSON body, which is already filled with the ticket number, the subject and both statuses. An endpoint that answers with an error still counts as reached, so the condition on **Webhook succeeded** can leave a note. An endpoint that cannot be reached at all fails the run, which then shows in the [run history](https://joely.io/documentation/automations/runs-and-quota.md).

## Welcome and triage

Greet the customers who open a ticket from one form button and set the priority of that request.

Workflow: Ticket creation → Field condition → Post message → Set priority

Needs configuration: Field condition

Pick the form button this greeting is for. Add one workflow per button when each request type deserves its own message and priority.

## Tag with AI, flag the rest

Let the AI tag new tickets, and leave a note on the ones none of your tags fits.

Workflow: Ticket creation → Tag with AI → Field condition → Post message

Needs configuration: Tag with AI

Pick the tags the assistant may use. It adds the ones that clearly apply, and an empty **Tags added** is what tells the workflow nothing fit, so a team member can tag the ticket by hand. It does not use your monthly AI responses, and each run only counts as an automation run. The note is also posted when the node is skipped: the AI is off for the project, or every tag you allowed is already on the ticket.

## Escalate command

Add an /escalate command to the composer: it sets the priority to Urgent, logs why and warns the assigned staff.

Workflow: Command → Set priority → Post message → Discord notification

Adds `/escalate <reason>` to the staff composer. The reason is required, and the note is posted under the name of the team member who ran the command. This is the one example a **private workflow** can hold, since it starts from a command. Command names are unique per project: if `/escalate` is already taken, saving the workflow is refused until you rename it on the trigger.

## Guided install by framework

Ask which framework the customer runs on an install request, then let the AI give the matching steps.

Workflow: Ticket creation + Package selected → Field condition → Field condition → Field condition → Post message

- **ESX:** Add tag → Ask AI → Field condition
- **True:** Set status
- **True:** Discord notification
- **False:** Set status
- **QBCore:** Add tag → joins Ask AI
- **Qbox:** Add tag → joins Ask AI
- **Other:** Add tag → Set status → Discord notification

Needs configuration: Field condition, Add tag, Discord notification

Pick the form button customers use for install help, the Tebex category of your scripts, one tag per framework, and the Discord channel of both alerts. The two triggers cover a package known when the ticket opens and a package linked later. List the same four tags in the third condition: a ticket already carrying one stops there, which is what keeps the question from being asked twice. Each button adds its tag. ESX, QBCore and Qbox then meet on *Ask AI*, which reads the answer through `{choice.label}`. *Other* skips the assistant: the ticket moves to **Required action** and the channel is alerted. After *Ask AI*, when the assistant says a person should take over, the ticket moves to **Required action** and the channel is alerted; otherwise it moves to **Awaiting customer**. The AI assistant has to be on. Only the AI's own package question holds the automatic reply back, so with the auto-reply on, the assistant can answer next to the buttons, then again once the customer picks.

## No customer left waiting

Alert the team when a customer has been waiting for 24 hours and raise the ticket to Urgent after 3 days. When the customer stopped answering, follow up then close it.

Workflow: No activity → Field condition

- **True:** Field condition → Field condition
- **True:** Discord notification
- **False:** Discord notification
- **False:** Field condition → Post message

Workflow: No activity → Field condition

- **True:** Field condition → Set priority → Discord notification
- **False:** Field condition → Set status

Needs configuration: Discord notification

Two chains in one workflow, one per *No activity* trigger, each firing once per silence. **Last author** *is* **Customer** and the status condition keep them to tickets waiting on your team. After 24 hours, a ticket with no assignee alerts the Discord channel you pick, and any other sends a DM to its assigned team members. After 3 days, the priority goes to *Urgent* and a second channel is alerted. Any message from your team or the assistant ends the silence and starts a new one, so a ticket answered in time never goes *Urgent*. When the customer is no longer the last author and the status is **Awaiting customer**, the same two delays follow up instead: after 24 hours the customer gets a reminder, and after 3 days the ticket moves straight to **Closed**. The reminder does not restart the silence, a customer reply does. Any other status is left alone, so a ticket your team is still working on stays open.

## Answer pre-sale questions

Let the AI answer questions before a purchase, and hand them to a team member when it needs a human or the customer wants more.

Workflow: Ticket creation → Field condition

- **True:** Add tag
- **True:** Ask for the package
- **Package selected:** Ask AI → Field condition
- **True:** Set priority → Assign to a user → Discord notification
- **False:** Post message
- **Yes, thanks:** Send payment link
- **I have another question:** joins Set priority
- **None / other:** joins Set priority

Needs configuration: Field condition, Add tag, Assign to a user

Pick the form button for questions before a purchase, the tag and the member who takes over. The customer picks a product, and the assistant answers about it. *Yes, thanks* sends a payment link for that product, and the ticket stays open. The ticket goes to *High* and reaches your member by Discord DM in three cases: the assistant says a person should take over, the customer has another question, or they answer *Other / not listed*. *Send payment link* needs the **Plus** plan, *Assign to a user* the **Team** plan, and the AI assistant has to be on. The package question does not hold the automatic reply back: with the auto-reply on, the assistant can answer next to it, then again once the customer picks.

## Send feature requests to your roadmap

Let the AI spot feature requests, send them to your roadmap tool, thank the customer and close the ticket.

Workflow: Ticket creation → Tag with AI → Field condition

- **True:** Set priority
- **True:** Call a webhook → Field condition
- **True:** Post message → Schedule closure
- **False:** Add tag
- **False:** Post message

Needs configuration: Tag with AI, Call a webhook, Add tag

Pick the tags the assistant may use, such as *feature-request*, and add your endpoint's URL. A ticket none of them fits stops at the first condition. The others drop to *Low*, and the JSON body, already filled with the ticket number, the subject, the packages and the tags, goes to your endpoint. When it accepts the call, the customer is thanked and the ticket closes in 3 days unless they reply. When it answers with an error, the ticket gets the tag you pick and an internal note, so the idea can be copied by hand. An endpoint that cannot be reached at all fails the run, which then shows in the [run history](https://joely.io/documentation/automations/runs-and-quota.md).
