Resources »

Workflows »

Close idle tickets

Introduction

When workers reply to tickets, they can use the “waiting” status to indicate that a response from the client is needed before continuing. When a client replies, the ticket status is automatically changed back to “open”, and notifications are sent to the owner and watchers.

However, sometimes a client never responds. Unless the ticket was given a specific “reopen” date, it will remain in the waiting status indefinitely.

This workflow will automatically close tickets that have been waiting for a client reply for a configurable length of time. It will also send a notification to the customer to let them know their ticket has been closed.

Installation

Click on Search » Workflows » (+) » (empty) and paste the following KATA:

workflow:
  name: cerb.ticket.auto_close
  description: Automatically close idle tickets
  version: 2025-01-29T00:16:45Z
  config:
    text/ticketAge:
      label: At what age should tickets be closed?
      default: -30 days
    text/closeMessage:
      label: What message should be sent upon closing?
      default: We haven't heard back from you in 30 days. This ticket has been automatically closed. You may reopen the ticket by replying to this message. This is an automated message.
records:
  automation/auto_close:
    fields:
      name: cerb.ticket.auto_close
      extension_id: cerb.trigger.automation.timer
      description: Automatically close idle tickets and send a notification to the customer.
      script@raw:
        start:
          set:
            config@json: {{cerb_workflow_config('cerb.ticket.auto_close')|json_encode}}
          
          record.search/glrxp2:
            output: results_ticket
            inputs:
              record_type: ticket
              record_query: status:w updated:"big bang to ${ticketAge}" reopen:0
              record_query_params:
                ticketAge: {{config.ticketAge}}
          
          repeat:
            each@csv: {{results_ticket|keys|join(',')}}
            as: ticketid
            do:
              record.update/close:
                output: updated_ticket
                inputs:
                  record_type: ticket
                  record_id: {{ticketid}}
                  fields:
                    status: c
              record.create/customerMessage:
                output: new_draft
                inputs:
                  record_type: draft
                  fields:
                    type: mail.transactional
                    params:
                      to: {{results_ticket[ticketid].initial_message_sender_email}}
                      subject: {{results_ticket[ticketid].subject}}
                      content: {{config.closeMessage}}
                    is_queued: 1
                    queue_delivery_date@date: now
              record.create/comment:
                output: new_comment
                inputs:
                  record_type: comment
                  fields:
                    author__context: app
                    author_id@int: 0
                    comment: Ticket closed due to idle timeout. A notification has been sent to the customer.
                    target__context: ticket
                    target_id@int: {{ticketid}}
      policy_kata@raw:
        commands:
          record.search:
            deny/type@bool: {{inputs.record_type is not record type ('ticket')}}
            allow@bool: yes
          record.update:
            deny/type@bool: {{inputs.record_type is not record type ('ticket')}}
            allow@bool: yes
          record.create:
            deny/type@bool: {{inputs.record_type is not record type ('comment','draft')}}
            allow@bool: yes
  automation_timer/auto_closeTimer:
    fields:
      name: cerb.timer.auto_close
      is_disabled@int: 0
      is_recurring@int: 1
      last_ran_at@int: 0
      next_run_at@int: 1738018800
      recurring_patterns@text:
        # Every hour
        0 * * * *
        
      recurring_timezone: America/Toronto
      automations_kata@raw:
        automation/zea2sx:
          uri: cerb:automation:cerb.ticket.auto_close
          disabled@bool: no

Configuration

When creating the workflow, you will be prompted for the max idle period before a ticket is automatically closed as well as the message to send to customers upon closing.

You can update the configuration at any time by opening the workflow profile and clicking “Edit Configuration”

Understanding how the auto-close workflow works

We just imported two resources. They work together to implement the auto-close functionality.

The cerb.ticket.auto_close automation checks if a ticket has been waiting for more than 30 days without a client response. If so, it closes it, sends the client a notification, by email and leaves a comment on the ticket.

cerb.timer.auto_close is an Automation Timer. It will trigger cerb.ticket.auto_close to run at whatever custom schedule you have set. The default is every hour.