Skip to content

Hourly

Mark digital orders as fulfilled automatically

Paid orders that match your rules, like digital products, are marked fulfilled without you touching them.

Runs
Hourly
Apps
Shopify
AI
Not needed
Access
read_orders, write_merchant_managed_fulfillment_orders

Send this to your assistant

Create a ClickRuntime automation: every hour, mark paid, unfulfilled Shopify orders that only contain products tagged digital as fulfilled.

Paste it into your assistant. It tells you what it will send or change before it runs live.

First time? Adding ClickRuntime to your assistant takes about two minutes.

Why use it

Why teams use this automation

Some Shopify stores sell products that need no shipping, or are fulfilled by a third party that never reports back: digital goods, print-on-demand items, drop-shipped products or items handed over in person. The orders remain unfulfilled in the admin, so the unfulfilled list fills with hundreds of orders that need no action. Real orders needing attention get lost among them, and reports on fulfillment time are meaningless because nothing is ever marked done.

Every hour the automation finds paid, unfulfilled orders, checks them against your rules, fetches the fulfillment orders for each, and creates a fulfillment so that Shopify records them as fulfilled. Orders that do not match are left alone. Stores selling digital items, gift cards or externally fulfilled goods use it to keep the unfulfilled list limited to real work.

What you get out of it

  • The unfulfilled list shows real work

    With no-ship orders closed automatically, whatever remains unfulfilled needs a person. Packers stop wading through noise and orders that really need shipping are seen first. When 300 digital orders no longer clutter the list, the one physical order with a note is seen first.

  • Customers receive their status updates

    When an order is marked fulfilled, Shopify can send the customer a notification. People who bought a digital product expect to see their order complete, and the confirmation reduces 'where is my order' emails.

  • Fulfillment reports become meaningful

    Average time to fulfill is only useful if orders are closed. Automated fulfillment gives you accurate figures for measuring how quickly real orders are handled. Average fulfillment time only means something if closed orders are really closed, instead of three hundred open digital ones.

  • Only orders meeting your rules are closed

    Rules such as product type, tag or payment status limit which orders are touched. A wrongly closed physical order would be a serious problem, so the conditions keep it narrow.

  • Hours of clicking removed

    Marking dozens of orders fulfilled by hand each day is repetitive and easy to forget. Handling it hourly means the admin is tidy without anyone remembering to do it. Clicking through dozens of gift card orders every evening is the sort of chore that gets forgotten.

How it works

What happens, step by step

  1. Every hour, the automation looks for paid Shopify orders that haven't been fulfilled yet.

  2. It checks each order against your rules, for example orders that only contain digital downloads.

  3. Matching orders are marked as fulfilled in Shopify, without anyone touching them.

Before it runs live

  • Connect Shopify

What you get

RunsHourly
Mark digital orders as fulfilled automaticallytoday, 9:00Succeeded
Shopify · Orders#1051 and #1053 marked fulfilled (digital download only)

Build your own

Need it to work differently?

This template is a starting point. Copy the prompt and change it, or describe a different automation from scratch, with your own conditions, more apps or an AI step. Your assistant writes it, tests it and runs it on ClickRuntime.
  • Your own rules

    Conditions, thresholds, filters and exceptions, written the way you'd explain them to a colleague.

  • Any number of apps

    One automation can read from one app and update several others. Over 248 apps are ready, and anything with an API works too.

  • AI where it helps

    Summaries, classification, extraction and drafts use ClickRuntime's built-in AI, with no extra key.

  • On a schedule or on each event

    Runs as often as every 5 minutes, or the moment an app sends an event, and keeps track of what it already handled.

Changes you can ask for

  • Act only on the items that match your own rules, and skip the rest
  • Add an AI step, for example to summarize, sort or draft a reply
  • Add another app, for example also send it to Slack
  • Combine it with other Shopify steps into one automation

Under the hood

The code that runs this automation

This is the Python script that runs each time the automation starts. Your AI assistant writes it for you when you send the prompt, and you allow each step in your assistant. To change how the automation works, describe the change to your assistant and it updates the script for you. For every function it can use, see the script reference.
auto_mark_orders_as_fulfilled.pyexample
from clickruntime import on_trigger, credentials, http, report_fetched

STORE = "your-store.myshopify.com"

def gql(query, variables=None):
    resp = http.post(f"https://{STORE}/admin/api/2025-07/graphql.json",
                     headers={"X-Shopify-Access-Token": credentials.connection("shopify", "store")},
                     json={"query": query, "variables": variables or {}})
    resp.raise_for_status()
    return resp.json()["data"]

FIND = """{ orders(first: 50, query: "financial_status:paid fulfillment_status:unfulfilled") { nodes {
  id name lineItems(first: 50) { nodes { product { tags } } }
  fulfillmentOrders(first: 5) { nodes { id status } } } } }"""
FULFIL = """mutation($f: FulfillmentInput!) { fulfillmentCreate(fulfillment: $f) {
  fulfillment { id } userErrors { message } } }"""

@on_trigger
def run(event):
    orders = [o for o in gql(FIND)["orders"]["nodes"]
              if o["lineItems"]["nodes"] and all("digital" in ((li["product"] or {}).get("tags") or [])
                                                for li in o["lineItems"]["nodes"])]
    report_fetched(len(orders))
    if not orders:
        return {"fulfilled": 0}
    done = []
    for o in orders:
        open_fos = [{"fulfillmentOrderId": fo["id"]} for fo in o["fulfillmentOrders"]["nodes"] if fo["status"] == "OPEN"]
        if open_fos:
            gql(FULFIL, {"f": {"lineItemsByFulfillmentOrder": open_fos, "notifyCustomer": True}})
            done.append(o["name"])
    return {"fulfilled": done}

FAQ

Common questions

What rules can decide which orders are fulfilled?
Any condition on order data, such as product type, tags, vendor, payment status or total. A common rule is that every line item is digital or tagged no-shipping. Orders that include any physical item are left alone, which prevents a real parcel from being marked shipped by mistake.
Does marking an order as fulfilled email the customer?
It can. Shopify sends a shipping confirmation when a fulfillment is created unless notifications are turned off, so digital sellers sometimes send their own message instead. Many stores add a short note in the confirmation explaining how to download or access the purchase.
Does it need access to fulfillment orders in Shopify?
Yes. The Shopify custom app token needs permission to read orders and manage fulfillments; without those scopes, creating fulfillments fails and the run log shows why. Stores with several locations should check that the app can see the location that owns each fulfillment order.
What permissions does it need?
read_orders, write_merchant_managed_fulfillment_orders. Nothing else in your accounts is used.
Does it need AI?
No. It runs without AI, so it doesn't use your plan's AI allowance.
How many runs does it use?
One run each time it checks. Checks that find nothing new and stop right away aren't counted.
Can I change how it works?
Yes. Describe the change to your AI assistant, for example a different schedule, channel or filter. It updates the automation, tests it and tells you what changed.

Set up “Mark digital orders as fulfilled automatically” from your assistant

Copy the prompt above, or connect your assistant first. Free plan, no credit card.