Sort by Topics, Resources
Clear
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.

Salto for

Zendesk

Articles

SHARE

How to organize and clean up Zendesk macros using Salto, ChatGPT and Git

Scott Dixon

December 20, 2023

4

min read

One of Salto's customer, a large retail company, has a huge Zendesk instance: their production environment has about 16 000 macros. To clean up and manage all these macros and other configuration elements that depend on them, they needed a better change management process.

Having Salto as their configuration management platform for Zendesk helped get full visibility into their macro library (you can try it for yourself with our 1-month free trial>>). But to clean up the macros that are no longer needed, we had to come up with a process where different divisions that create and use macros can align on the cleanup process.

The first step was to categorize and sort all existing macros.

Experience the Ease & Confidence of NetSuite Customizations with Salto

Automate the way you migrate Jira configurations from sandbox to production

What if Zendesk was 4x less work?

Request a Demo ≥

STAY UP TO DATE

Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.

Categorizing and sorting macros

The customer has a naming strategy for their macros where they used the “::” syntax in Zendesk to categorize by division that owned the macro. We agreed on a strategy where we would provide a Google spreadsheet containing all the macros in production, broken down by the division, and share with everyone across the company who needs to review them. The spreadsheet would also contain a column to mark macros as "reviewed" as well as those marked for deletion.

But adding 16,000 macros to this spreadsheet manually would take weeks. It would be much faster to use a script to create the list of all macros with the division name and a link back to Salto. I used ChatGPT to generate a Python script using the following prompt:

You have a folder that holds .nacl files from Salto that represent individual configurations within 1 Zendesk environment. You need to provide a list of these configurations with these 5 attributes:

1. salto_id: the Salto ID
2. zendesk_title: The actual title of the configuration in Zendesk
3. department: The department that owns the configuration
4. salto_url: The URL to access the configuraion in Salto

Here is an example of the contents a nacl file:

zendesk.macro SRD__FAQs__test_macro@ffffs {
title = "SRD::FAQs::test macro"
active = true
default = false
description = "a test macro"
actions = [
{
field = "ticket_form_id"
value = zendesk.ticket_form.instance.SRD___Enable_new_feature@sbsss
},
{
field = "subject"
value = "SRD FAQ"
},
]
raw_title = "SRD::FAQs::test macro"
}

For more information on .nacl files, here is a link to the documentation on .nacl syntax: https://github.com/salto-io/salto/blob/main/docs/user_guide.md#nacl-case.

1. The Salto ID (salto_id)
This ID can be found by opening the file and finding the string of text that follows "zendesk.macro" up until the "{" character on the first line. In the example above, the salto_id is: "SRD__FAQs__test_macro@ffffs".

2. The actual title of the configuration in Zendesk (zendesk_title)
This title can be found by locating the value of the "raw_title" attribute in the .nacl file. In the example above, the zendesk_title is: "SRD::FAQs::test macro".

3. the department that owns the configuration (department)
The department that owns the configuration can be found by parsing the zendesk_title and extracting the first string that occurs before the first "::". In the example above, the department is: "SRD".

4. The URL to access the configuration in Salto (salto_url)
The URL can be constructed by using the salto_id in conjunction with the Salto organization ID (org_id) and the Salto environment id (env_id). In the example above, assuming the that org_id is 6beb4cab-b3c4-40bb-b181-20e4c49e83a2 and the env_id is a5236736-1be2-4b67-be5c-6883e6a6439d, the salto_url is https://app.salto.io/orgs/6beb4cab-b3c4-40bb-b181-20e4c49e83a2/envs/a5236736-1be2-4b67-be5c-6883e6a6439d/explore?element=zendesk.macro.instance.SRD__FAQs__test_macro@ffffs.

Provide a Python script that will generate a csv file that lists each configuration with its salto_id, zendesk_title, department, and salto_url.


After some tweaking, I ended up with the following script:


import csv
import re
import os

# Path to the folder containing .nacl files
NACL_FOLDER = "PATH/TO/NACL/FILE"

# Salto organization ID and environment ID
ORG_ID = "SALTO_ORGANIZATION_ID"
ENV_ID = "SALTO_ENVIRONMENT_ID"

# Output CSV file
OUTPUT_FILE = "output.csv"

macros_wo_dept = 0
total_macros = 0
all_dept_names = set()


def extract_data_from_nacl(nacl_content, org_id, env_id):
    global macros_wo_dept
    global total_macros
    global all_dept_names

    # Extract salto_id
    salto_id_match = re.search(r'zendesk\.macro\s+(.*?)\s+\{', nacl_content)
    salto_id = salto_id_match.group(1) if salto_id_match else None

    # Extract zendesk_title
    zendesk_title_match = re.search(r'raw_title\s+=\s+"(.*?)"', nacl_content)
    zendesk_title = zendesk_title_match.group(1) if zendesk_title_match else None

    # Extract department
    if zendesk_title and "::" in zendesk_title:
        department = zendesk_title.split('::')[0]
        all_dept_names.add(department.lower())
    else:
        department = ""
        macros_wo_dept += 1

    # Construct salto_url
    salto_url = f"https://app.salto.io/orgs/{org_id}/envs/{env_id}/explore?element=zendesk.macro.instance.{salto_id}"

    total_macros += 1

    return department, zendesk_title, salto_url, salto_id

def generate_csv_from_nacl_folder(nacl_folder, org_id, env_id, output_file):
    macros_wo_dept = 0
    total_macros = 0
    with open(output_file, 'w', newline='') as csvfile:
        csv_writer = csv.writer(csvfile)
        csv_writer.writerow(['department', 'zendesk_title', 'salto_url', 'salto_id'])

        for root, dirs, files in os.walk(nacl_folder):
            for file in files:
                if file.endswith('.nacl'):
                    with open(os.path.join(root, file), 'r') as f:
                        nacl_content = f.read()
                        department, zendesk_title, salto_url, salto_id = extract_data_from_nacl(nacl_content, org_id, env_id)
                        csv_writer.writerow([department, zendesk_title, salto_url, salto_id])



print(f"Parsing nacl files in {NACL_FOLDER} and generating csv file {OUTPUT_FILE}")

generate_csv_from_nacl_folder(NACL_FOLDER, ORG_ID, ENV_ID, OUTPUT_FILE)

print(f"{total_macros} nacls parsed, {macros_wo_dept} macros have no departments listed")

dept_num = len(all_dept_names)

if dept_num:
    print(f"{dept_num} departments found")
    


We provided this script to the customer to run on their Git repository locally (Salto can automatically create and update a repository for each Zendesk environment you connect). They moved the output of the CSV into a Google spreadsheet which I reformatted according to their requirements:

Additionally, the customer wanted to know which macros had missing references. I used the below prompt for ChatGPT to generate a Python script:

You have a folder that holds .nacl files from Salto that represent individual configurations within 1 Zendesk environment. You need to provide a list of all of the configurations that have a missing reference. Here is an example of a .nacl file with a missing reference:

zendesk.macro DanAvigdorAwesomeMacroDemo {
title = "DanAvigdorAwesomeMacroDemo"
active = true
default = false
description = "Demo"
actions = [
{
field = zendesk.ticket_field.instance.KingDanAvigdor_tagger
value = zendesk.ticket_field__custom_field_options.instance.missing_10402303135255
},
]
raw_title = "DanAvigdorAwesomeMacroDemo"
_alias = "DanAvigdorAwesomeMacroDemo"
}

In the above example "zendesk.ticket_field__custom_field_options.instance.missing_10402303135255" is a missing reference because the last part of the string (missing_10402303135255) contains the string "missing" along with a numeric string. This script should only list the configurations that contain a missing reference. And once you have identified the missing reference, the configuration should be listed with the following 5 attributes (in that order):

1. salto_id: the Salto ID
2. zendesk_title: The actual title of the configuration in Zendesk
3. division: The division that owns the configuration
4. salto_url: The URL to access the configuration in Salto

For more information on .nacl files, here is a link to the documentation on .nacl syntax: https://github.com/salto-io/salto/blob/main/docs/user_guide.md#nacl-case.

1. The Salto ID (salto_id)
This ID can be found by opening the file and finding the string of text that follows "zendesk.macro" up until the "{" character on the first line. In the example above, the salto_id is: "SRD__FAQs__test_macro@ffffs".

2. The actual title of the configuration in Zendesk (zendesk_title)
This title can be found by locating the value of the "raw_title" attribute in the .nacl file. In the example above, the zendesk_title is: "SRD::FAQs::test macro".

3. the division that owns the configuration (division)
The division that owns the configuration can be found by parsing the zendesk_title and extracting the first string that occurs before the first "::". In the example above, the division is: "SRD". If there is no "::" in the zendesk_title, that this configuration doesn't belong to a particular division. So in that case, the division can be left blank.

4. The URL to access the configuration in Salto (salto_url)
The URL can be constructed by using the salto_id in conjunction with the Salto organization ID (org_id) and the Salto environment id (env_id). In the example above, assuming the that org_id is 6beb4cab-b3c4-40bb-b181-20e4c49e83a2 and the env_id is a5236736-1be2-4b67-be5c-6883e6a6439d, the salto_url is https://app.salto.io/orgs/6beb4cab-b3c4-40bb-b181-20e4c49e83a2/envs/a5236736-1be2-4b67-be5c-6883e6a6439d/explore?element=zendesk.macro.instance.SRD__FAQs__test_macro@ffffs.

Provide a Python script that will look inside a folder at all the nacl files (assume that all nacl files are in a single folder. so you can provide a path to that folder.) and generate a csv file that lists each configuration with its division first, then the zendesk_title, then the salto_url, and then the salto_id

Here's the script I sent to the customer after some tweaking:


import csv
import re
import os

# Path to the folder containing .nacl files
NACL_FOLDER = "/PATH/TO/FOLDER"

# Salto organization ID and environment ID
ORG_ID = "org_id"
ENV_ID = "env_id"

# Output CSV file
OUTPUT_FILE = "missing_refs_output.csv"

def extract_data_from_nacl(nacl_content, org_id, env_id):
    # Check for missing references
    missing_references = re.findall(r'zendesk\..*?\.instance\.missing_\d+', nacl_content)
    if not missing_references:
        return None

    # Extract salto_id
    salto_id_match = re.search(r'zendesk\.macro\s+(.*?)\s+\{', nacl_content)
    salto_id = salto_id_match.group(1) if salto_id_match else None

    # Extract zendesk_title
    zendesk_title_match = re.search(r'raw_title\s+=\s+"(.*?)"', nacl_content)
    zendesk_title = zendesk_title_match.group(1) if zendesk_title_match else None

    # Extract division
    division = zendesk_title.split('::')[0] if zendesk_title and "::" in zendesk_title else ""

    # Construct salto_url
    salto_url = f"https://app.salto.io/orgs/{org_id}/envs/{env_id}/explore?element=zendesk.macro.instance.{salto_id}"

    return division, zendesk_title, salto_url, salto_id

def generate_csv_from_nacl_folder(nacl_folder, org_id, env_id, output_file):
    with open(output_file, 'w', newline='') as csvfile:
        csv_writer = csv.writer(csvfile)
        csv_writer.writerow(['division', 'zendesk_title', 'salto_url', 'salto_id'])

        for root, dirs, files in os.walk(nacl_folder):
            for file in files:
                if file.endswith('.nacl'):
                    with open(os.path.join(root, file), 'r') as f:
                        nacl_content = f.read()
                        data = extract_data_from_nacl(nacl_content, org_id, env_id)
                        if data:
                            csv_writer.writerow(data)




generate_csv_from_nacl_folder(NACL_FOLDER, ORG_ID, ENV_ID, OUTPUT_FILE)
    


They were able to run this script and after sharing the output, we formatted the final spreadsheet for them to review with their internal devisions. In hindsight, I could have combined these two into a single sheet that marks a particular macro for having a missing reference.

STAY UP TO DATE

Tips & tricks from Zendesk masters

Subscribe to our newsletter to learn how to customize Zendesk and keep your agents happy

Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.

This is a monthly email with educational content. No spam (we promise).

By using Salto, ChatGPT and Git, we were able to automate the process that otherwise would take their team weeks to accomplish—or would eventually translate into technical debt that blocks their customer support from staying more agile and effective.

You're welcome to try this hack if you have hundreds of Zendesk macros that you need to clean up. You will be able to do that with Salto's free trial! If you want to see Salto in action and chat with Salto experts, get in touch with us.

WRITTEN BY OUR EXPERT

Scott Dixon

Customer Engineering

As a customer engineer at Salto, Scott is working closely with customers to optimize their change management process. Prior to joining Salto, he led multiple solutions engineering teams where he found his passion for solid technical documentation. Before entering the tech world, Scott was a journalist for a Japanese news agency covering everything from global monetary policy following the Great Recession to orangutans using iPads in Toronto.

Sort by Topics, Resources
Clear
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.

Salto for

Zendesk

SHARE

How to organize and clean up Zendesk macros using Salto, ChatGPT and Git

Scott Dixon

December 20, 2023

4

min read

One of Salto's customer, a large retail company, has a huge Zendesk instance: their production environment has about 16 000 macros. To clean up and manage all these macros and other configuration elements that depend on them, they needed a better change management process.

Having Salto as their configuration management platform for Zendesk helped get full visibility into their macro library (you can try it for yourself with our 1-month free trial>>). But to clean up the macros that are no longer needed, we had to come up with a process where different divisions that create and use macros can align on the cleanup process.

The first step was to categorize and sort all existing macros.

What if Zendesk was 4x less work?

Request a Demo Get started with Salto

Categorizing and sorting macros

The customer has a naming strategy for their macros where they used the “::” syntax in Zendesk to categorize by division that owned the macro. We agreed on a strategy where we would provide a Google spreadsheet containing all the macros in production, broken down by the division, and share with everyone across the company who needs to review them. The spreadsheet would also contain a column to mark macros as "reviewed" as well as those marked for deletion.

But adding 16,000 macros to this spreadsheet manually would take weeks. It would be much faster to use a script to create the list of all macros with the division name and a link back to Salto. I used ChatGPT to generate a Python script using the following prompt:

You have a folder that holds .nacl files from Salto that represent individual configurations within 1 Zendesk environment. You need to provide a list of these configurations with these 5 attributes:

1. salto_id: the Salto ID
2. zendesk_title: The actual title of the configuration in Zendesk
3. department: The department that owns the configuration
4. salto_url: The URL to access the configuraion in Salto

Here is an example of the contents a nacl file:

zendesk.macro SRD__FAQs__test_macro@ffffs {
title = "SRD::FAQs::test macro"
active = true
default = false
description = "a test macro"
actions = [
{
field = "ticket_form_id"
value = zendesk.ticket_form.instance.SRD___Enable_new_feature@sbsss
},
{
field = "subject"
value = "SRD FAQ"
},
]
raw_title = "SRD::FAQs::test macro"
}

For more information on .nacl files, here is a link to the documentation on .nacl syntax: https://github.com/salto-io/salto/blob/main/docs/user_guide.md#nacl-case.

1. The Salto ID (salto_id)
This ID can be found by opening the file and finding the string of text that follows "zendesk.macro" up until the "{" character on the first line. In the example above, the salto_id is: "SRD__FAQs__test_macro@ffffs".

2. The actual title of the configuration in Zendesk (zendesk_title)
This title can be found by locating the value of the "raw_title" attribute in the .nacl file. In the example above, the zendesk_title is: "SRD::FAQs::test macro".

3. the department that owns the configuration (department)
The department that owns the configuration can be found by parsing the zendesk_title and extracting the first string that occurs before the first "::". In the example above, the department is: "SRD".

4. The URL to access the configuration in Salto (salto_url)
The URL can be constructed by using the salto_id in conjunction with the Salto organization ID (org_id) and the Salto environment id (env_id). In the example above, assuming the that org_id is 6beb4cab-b3c4-40bb-b181-20e4c49e83a2 and the env_id is a5236736-1be2-4b67-be5c-6883e6a6439d, the salto_url is https://app.salto.io/orgs/6beb4cab-b3c4-40bb-b181-20e4c49e83a2/envs/a5236736-1be2-4b67-be5c-6883e6a6439d/explore?element=zendesk.macro.instance.SRD__FAQs__test_macro@ffffs.

Provide a Python script that will generate a csv file that lists each configuration with its salto_id, zendesk_title, department, and salto_url.


After some tweaking, I ended up with the following script:


import csv
import re
import os

# Path to the folder containing .nacl files
NACL_FOLDER = "PATH/TO/NACL/FILE"

# Salto organization ID and environment ID
ORG_ID = "SALTO_ORGANIZATION_ID"
ENV_ID = "SALTO_ENVIRONMENT_ID"

# Output CSV file
OUTPUT_FILE = "output.csv"

macros_wo_dept = 0
total_macros = 0
all_dept_names = set()


def extract_data_from_nacl(nacl_content, org_id, env_id):
    global macros_wo_dept
    global total_macros
    global all_dept_names

    # Extract salto_id
    salto_id_match = re.search(r'zendesk\.macro\s+(.*?)\s+\{', nacl_content)
    salto_id = salto_id_match.group(1) if salto_id_match else None

    # Extract zendesk_title
    zendesk_title_match = re.search(r'raw_title\s+=\s+"(.*?)"', nacl_content)
    zendesk_title = zendesk_title_match.group(1) if zendesk_title_match else None

    # Extract department
    if zendesk_title and "::" in zendesk_title:
        department = zendesk_title.split('::')[0]
        all_dept_names.add(department.lower())
    else:
        department = ""
        macros_wo_dept += 1

    # Construct salto_url
    salto_url = f"https://app.salto.io/orgs/{org_id}/envs/{env_id}/explore?element=zendesk.macro.instance.{salto_id}"

    total_macros += 1

    return department, zendesk_title, salto_url, salto_id

def generate_csv_from_nacl_folder(nacl_folder, org_id, env_id, output_file):
    macros_wo_dept = 0
    total_macros = 0
    with open(output_file, 'w', newline='') as csvfile:
        csv_writer = csv.writer(csvfile)
        csv_writer.writerow(['department', 'zendesk_title', 'salto_url', 'salto_id'])

        for root, dirs, files in os.walk(nacl_folder):
            for file in files:
                if file.endswith('.nacl'):
                    with open(os.path.join(root, file), 'r') as f:
                        nacl_content = f.read()
                        department, zendesk_title, salto_url, salto_id = extract_data_from_nacl(nacl_content, org_id, env_id)
                        csv_writer.writerow([department, zendesk_title, salto_url, salto_id])



print(f"Parsing nacl files in {NACL_FOLDER} and generating csv file {OUTPUT_FILE}")

generate_csv_from_nacl_folder(NACL_FOLDER, ORG_ID, ENV_ID, OUTPUT_FILE)

print(f"{total_macros} nacls parsed, {macros_wo_dept} macros have no departments listed")

dept_num = len(all_dept_names)

if dept_num:
    print(f"{dept_num} departments found")
    


We provided this script to the customer to run on their Git repository locally (Salto can automatically create and update a repository for each Zendesk environment you connect). They moved the output of the CSV into a Google spreadsheet which I reformatted according to their requirements:

Additionally, the customer wanted to know which macros had missing references. I used the below prompt for ChatGPT to generate a Python script:

You have a folder that holds .nacl files from Salto that represent individual configurations within 1 Zendesk environment. You need to provide a list of all of the configurations that have a missing reference. Here is an example of a .nacl file with a missing reference:

zendesk.macro DanAvigdorAwesomeMacroDemo {
title = "DanAvigdorAwesomeMacroDemo"
active = true
default = false
description = "Demo"
actions = [
{
field = zendesk.ticket_field.instance.KingDanAvigdor_tagger
value = zendesk.ticket_field__custom_field_options.instance.missing_10402303135255
},
]
raw_title = "DanAvigdorAwesomeMacroDemo"
_alias = "DanAvigdorAwesomeMacroDemo"
}

In the above example "zendesk.ticket_field__custom_field_options.instance.missing_10402303135255" is a missing reference because the last part of the string (missing_10402303135255) contains the string "missing" along with a numeric string. This script should only list the configurations that contain a missing reference. And once you have identified the missing reference, the configuration should be listed with the following 5 attributes (in that order):

1. salto_id: the Salto ID
2. zendesk_title: The actual title of the configuration in Zendesk
3. division: The division that owns the configuration
4. salto_url: The URL to access the configuration in Salto

For more information on .nacl files, here is a link to the documentation on .nacl syntax: https://github.com/salto-io/salto/blob/main/docs/user_guide.md#nacl-case.

1. The Salto ID (salto_id)
This ID can be found by opening the file and finding the string of text that follows "zendesk.macro" up until the "{" character on the first line. In the example above, the salto_id is: "SRD__FAQs__test_macro@ffffs".

2. The actual title of the configuration in Zendesk (zendesk_title)
This title can be found by locating the value of the "raw_title" attribute in the .nacl file. In the example above, the zendesk_title is: "SRD::FAQs::test macro".

3. the division that owns the configuration (division)
The division that owns the configuration can be found by parsing the zendesk_title and extracting the first string that occurs before the first "::". In the example above, the division is: "SRD". If there is no "::" in the zendesk_title, that this configuration doesn't belong to a particular division. So in that case, the division can be left blank.

4. The URL to access the configuration in Salto (salto_url)
The URL can be constructed by using the salto_id in conjunction with the Salto organization ID (org_id) and the Salto environment id (env_id). In the example above, assuming the that org_id is 6beb4cab-b3c4-40bb-b181-20e4c49e83a2 and the env_id is a5236736-1be2-4b67-be5c-6883e6a6439d, the salto_url is https://app.salto.io/orgs/6beb4cab-b3c4-40bb-b181-20e4c49e83a2/envs/a5236736-1be2-4b67-be5c-6883e6a6439d/explore?element=zendesk.macro.instance.SRD__FAQs__test_macro@ffffs.

Provide a Python script that will look inside a folder at all the nacl files (assume that all nacl files are in a single folder. so you can provide a path to that folder.) and generate a csv file that lists each configuration with its division first, then the zendesk_title, then the salto_url, and then the salto_id

Here's the script I sent to the customer after some tweaking:


import csv
import re
import os

# Path to the folder containing .nacl files
NACL_FOLDER = "/PATH/TO/FOLDER"

# Salto organization ID and environment ID
ORG_ID = "org_id"
ENV_ID = "env_id"

# Output CSV file
OUTPUT_FILE = "missing_refs_output.csv"

def extract_data_from_nacl(nacl_content, org_id, env_id):
    # Check for missing references
    missing_references = re.findall(r'zendesk\..*?\.instance\.missing_\d+', nacl_content)
    if not missing_references:
        return None

    # Extract salto_id
    salto_id_match = re.search(r'zendesk\.macro\s+(.*?)\s+\{', nacl_content)
    salto_id = salto_id_match.group(1) if salto_id_match else None

    # Extract zendesk_title
    zendesk_title_match = re.search(r'raw_title\s+=\s+"(.*?)"', nacl_content)
    zendesk_title = zendesk_title_match.group(1) if zendesk_title_match else None

    # Extract division
    division = zendesk_title.split('::')[0] if zendesk_title and "::" in zendesk_title else ""

    # Construct salto_url
    salto_url = f"https://app.salto.io/orgs/{org_id}/envs/{env_id}/explore?element=zendesk.macro.instance.{salto_id}"

    return division, zendesk_title, salto_url, salto_id

def generate_csv_from_nacl_folder(nacl_folder, org_id, env_id, output_file):
    with open(output_file, 'w', newline='') as csvfile:
        csv_writer = csv.writer(csvfile)
        csv_writer.writerow(['division', 'zendesk_title', 'salto_url', 'salto_id'])

        for root, dirs, files in os.walk(nacl_folder):
            for file in files:
                if file.endswith('.nacl'):
                    with open(os.path.join(root, file), 'r') as f:
                        nacl_content = f.read()
                        data = extract_data_from_nacl(nacl_content, org_id, env_id)
                        if data:
                            csv_writer.writerow(data)




generate_csv_from_nacl_folder(NACL_FOLDER, ORG_ID, ENV_ID, OUTPUT_FILE)
    


They were able to run this script and after sharing the output, we formatted the final spreadsheet for them to review with their internal devisions. In hindsight, I could have combined these two into a single sheet that marks a particular macro for having a missing reference.

Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.

By using Salto, ChatGPT and Git, we were able to automate the process that otherwise would take their team weeks to accomplish—or would eventually translate into technical debt that blocks their customer support from staying more agile and effective.

You're welcome to try this hack if you have hundreds of Zendesk macros that you need to clean up. You will be able to do that with Salto's free trial! If you want to see Salto in action and chat with Salto experts, get in touch with us.

WRITTEN BY OUR EXPERT

Scott Dixon

Customer Engineering

As a customer engineer at Salto, Scott is working closely with customers to optimize their change management process. Prior to joining Salto, he led multiple solutions engineering teams where he found his passion for solid technical documentation. Before entering the tech world, Scott was a journalist for a Japanese news agency covering everything from global monetary policy following the Great Recession to orangutans using iPads in Toronto.