Creating custom task

Built-in code editors give you a chance to built any integration you require. Possibilities are endless - your limit is your imagination. There are couple of things to keep in mind when creating a task. 1. Permissions

To keep security at highest level app would requests only very basic permissions when installed. However, when creating a task some additional permissions might be required, for example you might need write_orders permission to add a tag to an order. App automatically detects required permissions when task code is compiled. However you need to help compiler a bit. When defining REST/GraphQL requests do it at very top of the task:

{%- comment -%}Start REST and GraphQL definitions{%- endcomment -%}
{% capture mutation %}
  mutation tagsAdd($id: ID!, $tags: [String!]!) {
    tagsAdd(id: $id, tags: $tags) {
      node {
        id
      }
      userErrors {
        field
        message
      }
    }
  }
{% endcapture %}

Next, you can use dummy input to tell compiler what variables it should expect.

{%- comment -%} Feed compiler with dummy values to evaluate permissions required.{%- endcomment -%}
{% if mode.compiler %}
  {% json dummy_mutation_variables %}
    {
      "id": "gid://shopify/Order/123456",
      "tags": "test"
    }
  {% endjson %}
  {% assign result = mutation | graphql: dummy_mutation_variables %}
{% endif %}
{%- comment -%}END REST and GraphQL definitions{%- endcomment -%}

Above code snippet won't be executed when your task actually runs. It is because it is wrapped in if condition. mode.compiler is set to true only when creating/editing task.

After adding above code, compiler knows what to expect from your task and can easily evaluate permissions it needs to run your task. You can now save it and return to app dashboard, you are going to be prompted to update app permissions.

After clicking Update permissions button you should see a popup window where you can update app permissions. Some browsers (e.g. Safari) blocks popups by default. You can allow your browser to display popups by clicking Unblock button next to URL field.

Here is how you would tell compiler about any REST request:

{%- comment -%}Start REST and GraphQL definitions{%- endcomment -%}
{% json fulfillment_request_options %}
    {
      "path": "",
      "method": "POST",
      "body": {
        "fulfillment": {
          "location_id": "123456",
          "notify_customer": false,
          "status": "success"
        }
      }
    }
{% endjson %}

{%- comment -%} Feed compiler with dummy values to evaluate permissions required.{%- endcomment -%}
{% if mode.compiler %}
  {% assign order_fulfillment_endpoint = "/orders/123456/fulfillments.json" %}
  {% assign fulfillment_request_options["path"] = order_fulfillment_endpoint %}
  {% assign result = fulfillment_request_options | rest %}
{% endif %}
{%- comment -%}END REST and GraphQL definitions{%- endcomment -%}

Last updated