Auto-tag new orders with company metafield values, with Mechanic.

Mechanic is a development and ecommerce automation platform for Shopify. :)

Auto-tag new orders with company metafield values

When new orders are created, this task will check to see if any of the configured metafields are set on the company which placed the order, and if so then it will add order tags based on the metafield values.

Runs Occurs whenever an order is created and Occurs when a user sends an order to Mechanic. Configuration includes metafields and tag prefixes and truncate long tags.

15-day free trial – unlimited tasks

Documentation

When new orders are created, this task will check to see if any of the configured metafields are set on the company which placed the order, and if so then it will add order tags based on the metafield values.

Configure this task by adding company metafields on the left, in the form of namespace.key, and the optional paired tag prefixes on the right. Prefixes should include a divider and/or spacing as needed (e.g. "Batch: ", "attn_").

This task supports the following metafield types - "boolean", "date", "date_time", "number_decimal", "number_integer", and "single_line_text_field". List versions of each type are also supported (e.g. "list.single_line_text_field"). List metafields with multiple values set on the company will result in an order tag being added for each value.

IMPORTANT: Shopify limits order tags to 40 characters. If a tag (including the optional prefix) exceeds that length, then that tag will not be set on the order. Enable the "Truncate long tags" option to have the task truncate tags to a maximum of 40 characters. Truncations are made from the right side of the tag.

Developer details

Mechanic is designed to benefit everybody: merchants, customers, developers, agencies, Shopifolks, everybody.

That’s why we make it easy to configure automation without code, why we make it easy to tweak the underlying code once tasks are installed, and why we publish it all here for everyone to learn from.

(By the way, have you seen our documentation? Have you joined the Slack community?)

Open source
View on GitHub to contribute to this task
Subscriptions
shopify/orders/create
mechanic/user/order
Tasks use subscriptions to sign up for specific kinds of events. Learn more
Options
metafields and tag prefixes (keyval, required), truncate long tags (boolean)
Code
{% assign metafields_and_tag_prefixes = options.metafields_and_tag_prefixes__keyval_required %}
{% assign truncate_long_tags = options.truncate_long_tags__boolean %}

{% assign metafields = metafields_and_tag_prefixes | keys %}
{% assign supported_metafield_types
  = array
  | push:
    "boolean",
    "date",
    "date_time",
    "number_decimal",
    "number_integer",
    "single_line_text_field"
%}

{% if event.topic == "shopify/orders/create" or event.topic == "mechanic/user/order" %}
  {% capture query %}
    query {
      order(id: {{ order.admin_graphql_api_id | json }}) {
        id
        name
        tags
        purchasingEntity {
          __typename
          ... on Customer {
            id
          }
          ... on PurchasingCompany {
            company {
              metafields(
                first: 250
                keys: {{ metafields | graphql_arguments }}
              ) {
                nodes {
                  key
                  type
                  value
                }
              }
            }
          }
        }
      }
    }
  {% endcapture %}

  {% assign result = query | shopify %}

  {% if event.preview %}
    {% capture result_json %}
      {
        "data": {
          "order": {
            "id": "gid://shopify/Order/1234567890",
            "name": "#PREVIEW",
            "purchasingEntity": {
              "__typename": "PurchasingCompany",
              "company": {
                "metafields": {
                  "nodes": [
                    {
                      "key": {{ metafields.first | json }},
                      "type": "list.single_line_text_field",
                      "value": "[\"Preview value\"]"
                    }
                  ]
                }
              }
            }
          }
        }
      }
    {% endcapture %}

    {% assign result = result_json | parse_json %}
  {% endif %}

  {% assign order = result.data.order %}

  {% if order.purchasingEntity.__typename != "PurchasingCompany" %}
    {% log "This order is not a company purchase; skipping." %}
    {% break %}
  {% endif %}

  {% comment %}
    -- loop through any of the configured metafields that were found on the company for this order
  {% endcomment %}

  {% assign tags_to_add = array %}

  {% for metafield in order.purchasingEntity.company.metafields.nodes %}
    {% assign tag_prefix = metafields_and_tag_prefixes[metafield.key] %}
    {% assign metafield_type = metafield.type | remove: "list." %}

    {% unless supported_metafield_types contains metafield_type %}
      {% log
        message: "Unsupported metafield type for this task.",
        metafield: metafield,
        supported_metafield_types: supported_metafield_types
      %}
      {% continue %}
    {% endunless %}

    {% comment %}
      -- convert all values to an array so list metafield types can more easily be supported
    {% endcomment %}

    {% if metafield.type contains "list." %}
      {% assign metafield_values = metafield.value | parse_json %}
    {% else %}
      {% assign metafield_values = array | push: metafield.value %}
    {% endif %}

    {% comment %}
      -- determine tags by metafield value, if there is a prefix tag configured, and length
    {% endcomment %}

    {% for metafield_value in metafield_values %}
      {% assign tag = metafield_value | prepend: tag_prefix  %}

      {% if tag.size > 40 %}
        {% comment %}
          -- order tags only support 40 characters max
        {% endcomment %}

        {% if truncate_long_tags %}
          {% assign truncated_tag = tag | slice: 0, 40 %}

          {% log
            message: "Tag is too long to be set on the order, and tag truncation is enabled; applying to this tag.",
            original_tag: tag,
            truncated_tag: truncated_tag
          %}

          {% assign tag = truncated_tag %}

        {% else %}
          {% log
            message: "Tag is too long to be set on the order, and tag truncation is not enabled; skipping this tag,",
            tag: tag,
            tag_length: tag.size
          %}
          {% continue %}
        {% endif %}
      {% endif %}

      {% unless order.tags contains tag %}
        {% assign tags_to_add = tags_to_add | push: tag %}
      {% endunless %}
    {% endfor %}
  {% endfor %}

  {% comment %}
    -- add tags to the order as needed
  {% endcomment %}

  {% if tags_to_add != blank %}
    {% action "shopify" %}
      mutation {
        tagsAdd(
          id: {{ order.id | json }}
          tags: {{ tags_to_add | json }}
        ) {
          node {
            ... on Order {
              name
              tags
            }
          }
          userErrors {
            field
            message
          }
        }
      }
    {% endaction %}

  {% else %}
    {% log "No tagging operations needed for this order." %}
  {% endif %}
{% endif %}
Task code is written in Mechanic Liquid, an extension of open-source Liquid enhanced for automation. Learn more