HomeShopify & E-commerceShopify draft order invoice follow-up with…

Shopify draft order invoice follow-up with n8n

Shopify draft order invoice follow-up with n8n









A Shopify draft order invoice follow-up in n8n quietly chases the quotes your store already sent but never got paid for. If you run wholesale, custom, or quote-first orders, you create draft orders and email an invoice link, then the customer gets busy and the draft sits open for weeks. This guide builds a small n8n workflow that checks your open draft orders every morning, finds the ones older than three days, and emails each customer a friendly reminder with their secure checkout link, no manual chasing required.

Prefer to skip the build? The full guide below is free to follow. If you would rather import a tested workflow and be live in ten minutes, grab the ready-made template.

What it does

Draft orders are how Shopify handles quotes and manually created orders. You add products, set a price, and Shopify gives you an invoice_url, a secure page where the customer can pay. The problem is that once you send that link, nothing follows up. A draft can stay open indefinitely while the customer forgets, and you have no built-in reminder.

This workflow closes that gap. On a daily schedule it pulls every open draft order from the Shopify Admin API, keeps only the ones that are older than a threshold you set (three days by default) and still unpaid, then sends each customer a plain-text reminder email containing their original invoice link. Paid or cancelled drafts are ignored automatically, because Shopify no longer marks them as open.

It connects three services: Shopify (source of the draft orders), a small Code node (the aging and filtering logic), and Gmail (the reminder email). No spreadsheets, no third-party app, no customer data leaving your own accounts.

Why it beats the default

Shopify can email an invoice the moment you create a draft, but it will not chase that invoice for you. Shopify Flow, the built-in automation tool, does not expose draft order events either, so you cannot build this natively. That leaves most merchants doing one of three things: manually scrolling the Drafts screen every few days, exporting to a spreadsheet, or simply letting quotes go cold.

An n8n workflow beats all three because it is unattended and precise. It runs on a cron schedule with no human trigger, it reads the live draft status straight from the Admin API so it never reminds someone who already paid, and the reminder text, timing, and threshold are all yours to edit. You also own the whole thing: the email goes out from your Gmail, and nothing depends on a paid Shopify app subscription.

What you need

  • An n8n instance (Cloud or self-hosted, version 1.0 or newer).
  • A Shopify store with the Draft orders feature (available on all plans) and an Admin API access token. If you have not connected Shopify to n8n yet, follow how to connect Shopify to n8n (2026 method) first, then come back.
  • The Admin API scope read_draft_orders granted to your custom app.
  • A Gmail account connected to n8n for sending the reminders.

Build time is about 30 minutes from scratch, or under 10 minutes if you import the template and paste in your two credentials.

📌

This workflow uses the Shopify Admin REST API version 2026-04. If you copy the URL, keep the version current so Shopify does not return a deprecation warning.

Node-by-node list

Four core nodes, wired in a straight line. Here is the whole shape before we build it.

┌──────────────────────────────────────────────────────────────┐
│  SHOPIFY DRAFT ORDER INVOICE FOLLOW-UP                        │
│                                                              │
│  [Schedule 8am] → [HTTP: get open drafts] → [Code: filter]   │
│                                                    ↓         │
│                                        [Gmail: send reminder] │
│                                        (runs once per draft)  │
└──────────────────────────────────────────────────────────────┘
  
# Node Type Job
1 Every morning 8am Schedule Trigger Fires the workflow once a day.
2 Get open draft orders HTTP Request Pulls all open drafts from the Shopify Admin API.
3 Filter drafts needing reminder Code Keeps only open, unpaid drafts older than 3 days with an email.
4 Send invoice reminder Gmail Emails each remaining customer their invoice link.

Step-by-step build

Step 1 — Schedule Trigger

Add a Schedule Trigger node. Set the interval to Days and pick the hour it should run, for example 8. This makes the workflow run once every morning. A daily cadence is usually right for quote chasing; hourly would feel pushy and eat API calls for no benefit.

Step 2 — HTTP Request: get open draft orders

Add an HTTP Request node named Get open draft orders. Configure it like this:

  1. Method: GET
  2. URL: https://YOUR_STORE.myshopify.com/admin/api/2026-04/draft_orders.json?status=open&limit=250
  3. Authentication: Generic Credential Type then Header Auth.
  4. In the Header Auth credential, set Name to X-Shopify-Access-Token and Value to your Admin API access token.

The status=open query is the important part: Shopify returns only drafts that are still unpaid, so you never chase a completed order. The response looks like this:

{
  "draft_orders": [
    {
      "id": 1023491007,
      "name": "#D42",
      "status": "open",
      "email": "james.carter@gmail.com",
      "invoice_url": "https://your-store.myshopify.com/12345/invoices/abc123",
      "total_price": "1240.00",
      "currency": "USD",
      "created_at": "2026-07-22T14:30:00-04:00",
      "customer": { "first_name": "James", "email": "james.carter@gmail.com" }
    }
  ]
}

Step 3 — Code: filter drafts needing reminder

Add a Code node. This is where the aging logic lives. It walks the list of drafts, drops anything that is not open, has no invoice link, is younger than the threshold, or has no email address, and returns one clean item per draft that deserves a reminder.

const DAYS_BEFORE_REMINDER = 3;
const cutoff = Date.now() - DAYS_BEFORE_REMINDER * 24 * 60 * 60 * 1000;

const drafts = $input.first().json.draft_orders || [];
const out = [];

for (const d of drafts) {
  if (d.status !== 'open') continue;
  if (!d.invoice_url) continue;

  const created = new Date(d.created_at).getTime();
  if (created > cutoff) continue; // too fresh to chase yet

  const email = d.email || (d.customer && d.customer.email);
  if (!email) continue;

  const firstName = (d.customer && d.customer.first_name) || 'there';

  out.push({
    json: {
      email,
      first_name: firstName,
      draft_name: d.name,
      invoice_url: d.invoice_url,
      total_price: d.total_price,
      currency: d.currency,
    },
  });
}

return out;
💡

Tip: Because the node returns an array of items, the Gmail node after it runs once per item automatically. You do not need a separate loop node.

Step 4 — Gmail: send invoice reminder

Add a Gmail node, operation Send. Map the fields to expressions from the Code node:

  1. To: ={{ $json.email }}
  2. Subject: =Your quote {{ $json.draft_name }} is ready to complete
  3. Email Type: Text
  4. Message: a short reminder that references {{ $json.first_name }}, the total {{ $json.total_price }} {{ $json.currency }}, and the link {{ $json.invoice_url }}.

Save the workflow and switch it to Active. From tomorrow morning it runs on its own. To test right now, open a draft in Shopify, backdate is not possible, so temporarily set DAYS_BEFORE_REMINDER = 0 in the Code node and click Execute workflow: you should receive the reminder for any open draft with an email on file.

Common mistakes

  • Chasing paid orders. This only happens if you drop the status=open query. Keep it, and Shopify never hands you a completed draft.
  • Missing the read_draft_orders scope. Without it the HTTP node returns a 403. Add the scope in your custom app and reinstall it.
  • Using an old API version. A URL like /admin/api/2022-01/ may still work but will warn or break later. Use 2026-04.
  • Daily re-sends. Left as-is, an open draft gets an email every day. If that is too much, tag the draft after the first send and skip tagged drafts, or run the schedule every few days instead of daily.
  • Drafts with no email. Manually created drafts sometimes have no customer attached. The Code node skips these, but it is worth checking your Drafts screen so real quotes are not silently dropped.

Cost at realistic volume

This workflow is close to free to run. It makes one Shopify API call per day, well inside every plan’s limits. Gmail’s free tier sends up to 500 emails a day, and a store creating even a few dozen quotes a week will never approach that. n8n itself is free when self-hosted; on n8n Cloud a daily run plus a handful of reminder emails is a rounding error against the Starter plan’s monthly execution allowance.

Service Usage per day Cost
Shopify Admin API 1 request $0 (included)
Gmail send Typically under 20 emails $0 (free tier)
n8n 1 scheduled execution $0 self-hosted

🚀 Get the Shopify draft order invoice follow-up template

The guide above is free to follow. The download is the exact validated workflow JSON, so you skip the build entirely: import it, paste your Shopify and Gmail credentials, and set your reminder threshold. Want it done for you instead? See our done-for-you setup service.

Download the template ($12) →

Instant download · Works on n8n Cloud and self-hosted

Frequently asked questions

Does this workflow charge the customer automatically?

No. It only emails the secure invoice_url that Shopify already generates for each draft order. The customer clicks that link and completes checkout themselves, so payment always happens through your normal Shopify checkout, never inside n8n.

How do I stop reminding a customer who already paid?

When a draft order is paid, Shopify changes its status from open to completed. The workflow filters on status open, so a paid or converted draft is skipped automatically on the next run. You never have to remove people by hand.

Can I wait longer than three days before the reminder?

Yes. The delay lives in one line of the Code node: DAYS_BEFORE_REMINDER = 3. Change it to 5, 7, or any number of days. You can also duplicate the workflow to send a second nudge at a longer interval for drafts that stay open.

Will it send the same reminder every day forever?

By default it can re-send daily while the draft stays open. To send once only, add a Shopify tag or a note attribute after the first email, then skip drafts that already carry that marker. The template includes a comment showing where to add this guard.

Does this work on both n8n Cloud and self-hosted?

Yes. It uses only core n8n nodes: Schedule Trigger, HTTP Request, Code, and Gmail. There are no community nodes to install, so the same JSON imports and runs identically on n8n Cloud and any self-hosted instance.

Related guides