{
  "name": "Atlassian Automation step rules for recurring tickets",
  "version": "2026-10-21",
  "checkedOn": "2026-10-20",
  "nextReview": "2026-11-02",
  "reviewSchedule": ["2026-11-02", "2026-12-01", "2026-12-04", "then the first Monday of each month"],
  "url": "https://eriksenlabs.com/data/automation-step-rules.json",
  "guide": "https://eriksenlabs.com/jira-service-management-recurring-tasks",
  "publisher": "Eriksen Labs (Eriksen ENK, Norway)",
  "license": {
    "name": "CC BY 4.0",
    "url": "https://creativecommons.org/licenses/by/4.0/",
    "attribution": "Eriksen Labs, Atlassian Automation step rules, https://eriksenlabs.com/jira-service-management-recurring-tasks"
  },
  "disclosure": "Eriksen Labs makes Recurring Requests & Templates for Jira Service Management, an app that schedules recurring requests without Automation.",
  "units": "Automation steps per calendar month, unless a field says otherwise.",
  "status": "Every step count in this file is Estimated: worked out from Atlassian's counting rules. Which steps ran in each run of our test flows is Observed in the audit log (see observations); the Usage meter did not show those runs when we looked, so no count is Measured. A recipe's 'measured' field holds the meter reading once there is one.",

  "sources": {
    "usage-calc": { "title": "How is your automation usage calculated", "url": "https://support.atlassian.com/cloud-automation/docs/how-is-my-usage-calculated/", "lastModified": "2026-09-04", "checkedOn": "2026-10-20" },
    "lic-automation": { "title": "Atlassian Automation (licensing FAQ)", "url": "https://www.atlassian.com/licensing/automation", "lastModified": null, "checkedOn": "2026-10-20" },
    "lic-ubp": { "title": "Usage-based pricing (licensing FAQ)", "url": "https://www.atlassian.com/licensing/usage-based-pricing", "lastModified": null, "checkedOn": "2026-10-20" },
    "extra-usage": { "title": "Manage extra usage for a meter", "url": "https://support.atlassian.com/subscriptions-and-billing/docs/manage-extra-usage-for-a-meter/", "lastModified": null, "checkedOn": "2026-10-20" },
    "usage-charges": { "title": "How usage-based pricing works", "url": "https://support.atlassian.com/subscriptions-and-billing/docs/usage-charges-and-billing/", "lastModified": null, "checkedOn": "2026-10-20" },
    "jsm-pricing": { "title": "Service Collection pricing", "url": "https://www.atlassian.com/collections/service/pricing", "lastModified": null, "checkedOn": "2026-10-20" },
    "jira-pricing": { "title": "Jira pricing", "url": "https://www.atlassian.com/software/jira/pricing", "lastModified": null, "checkedOn": "2026-10-20" },
    "confluence-pricing": { "title": "Confluence pricing", "url": "https://www.atlassian.com/software/confluence/pricing", "lastModified": null, "checkedOn": "2026-10-20" },
    "teamwork-pricing": { "title": "Teamwork Collection pricing", "url": "https://www.atlassian.com/collections/teamwork/pricing", "lastModified": null, "checkedOn": "2026-10-20" },
    "jpd-pricing": { "title": "Jira Product Discovery pricing", "url": "https://www.atlassian.com/software/jira/product-discovery/pricing", "lastModified": null, "checkedOn": "2026-10-20" },
    "perms": { "title": "Permissions required to manage automation flows", "url": "https://support.atlassian.com/cloud-automation/docs/permissions-required-for-jira-cloud-automation-rules/", "lastModified": "2026-04-29", "checkedOn": "2026-10-20" },
    "triggers": { "title": "Jira automation triggers", "url": "https://support.atlassian.com/cloud-automation/docs/jira-automation-triggers/", "lastModified": "2026-04-29", "checkedOn": "2026-10-20" },
    "limits": { "title": "Automation service limits", "url": "https://support.atlassian.com/cloud-automation/docs/automation-service-limits/", "lastModified": "2026-04-29", "checkedOn": "2026-10-20" },
    "set-to-recur": { "title": "Schedule work items to recur using automations", "url": "https://support.atlassian.com/cloud-automation/docs/automatically-clone-an-issue-when-done/", "lastModified": "2026-05-29", "checkedOn": "2026-10-20" },
    "sv-dates": { "title": "Automation smart values: date and time", "url": "https://support.atlassian.com/cloud-automation/docs/jira-smart-values-date-and-time/", "lastModified": "2026-08-21", "checkedOn": "2026-10-20" },
    "kb-schedule": { "title": "Schedule work items creation with Jira Cloud automation (KB)", "url": "https://support.atlassian.com/jira/kb/schedule-work-items-creation-with-jira-cloud-automation/", "lastModified": "2025-09-25", "checkedOn": "2026-10-20" },
    "kb-exclude": { "title": "How to exclude a specific date without using complicated Cron expressions (KB)", "url": "https://support.atlassian.com/automation/kb/exclude-specific-date-without-cron-in-automation/", "lastModified": "2025-11-05", "checkedOn": "2026-10-20" },
    "AUTO-1712": { "title": "AUTO-1712: Include timezone support for Cron jobs (Gathering Interest)", "url": "https://jira.atlassian.com/browse/AUTO-1712", "lastModified": "2026-07-02", "checkedOn": "2026-10-20" },
    "AUTO-971": { "title": "AUTO-971: Define non-working days and public holidays for BusinessDays (Gathering Interest)", "url": "https://jira.atlassian.com/browse/AUTO-971", "lastModified": "2026-09-18", "checkedOn": "2026-10-20" },
    "JSDCLOUD-14350": { "title": "JSDCLOUD-14350: Cloning with Automation does not set the Request Type (Gathering Interest)", "url": "https://jira.atlassian.com/browse/JSDCLOUD-14350", "lastModified": "2026-10-20", "checkedOn": "2026-10-20" },
    "JRACLOUD-94173": { "title": "JRACLOUD-94173: Monthly and quarterly options for recurring work items (Gathering Interest)", "url": "https://jira.atlassian.com/browse/JRACLOUD-94173", "lastModified": "2026-10-15", "checkedOn": "2026-10-20" }
  },

  "observations": {
    "test-2026-10-20": {
      "title": "Our test on our development site",
      "date": "2026-10-20",
      "url": "https://eriksenlabs.com/jira-service-management-recurring-tasks#what-we-tested",
      "where": "One service space on Eriksen Labs' own Jira Service Management development site, in Automation's flow builder.",
      "method": "12 test flows, each a scheduled trigger with a cron line, a {{smart values}} condition where the recipe needs one, and a Log action in place of Create work item, so nothing was created or changed. 28 runs: 25 by hand with Run scheduled flow now, and 3 on schedule. For each run we read the flow's audit log, which lists the components that ran. We also read the Basic tab's options and its preview of the next 10 runs, without saving a Basic schedule. All 12 flows were turned off afterwards.",
      "runs": [
        { "flow": "Monthly, no search", "cron": ["0 0 9 1 * ?"], "how": "By hand", "runs": 3, "ran": ["trigger", "action"], "status": "Success" },
        { "flow": "A JQL search that finds nothing", "cron": ["0 0 9 1 * ?"], "how": "By hand", "runs": 3, "ran": ["trigger"], "status": "No actions performed" },
        { "flow": "A condition that says no", "cron": ["0 0 9 1 * ?"], "how": "By hand", "runs": 3, "ran": ["trigger", "condition"], "status": "Success" },
        { "flow": "Daily business-day check (Atlassian’s KB), on a day it should not create", "cron": ["0 0 9 * * ?"], "how": "By hand", "runs": 3, "ran": ["trigger", "condition"], "status": "Success" },
        { "flow": "Three-day window for the 2nd business day, on a day it should not create", "cron": ["0 0 9 2-4 * ?"], "how": "By hand", "runs": 3, "ran": ["trigger", "condition"], "status": "Success" },
        { "flow": "Three-day window for the 14th business day, on that day", "cron": ["0 35 18 18-20 * ?"], "how": "1 on schedule, 2 by hand", "runs": 3, "ran": ["trigger", "condition", "action"], "status": "Success" },
        { "flow": "Quartz cron forms MON#1, 6L, LW, 1W, 3#3 and 20W", "cron": ["0 0 9 ? * MON#1", "0 0 9 ? * 6L", "0 0 9 LW * ?", "0 0 9 1W * ?", "0 10 19 ? * 3#3", "0 10 19 20W * ?"], "how": "8 by hand; 3#3 and 20W on schedule", "runs": 10, "ran": ["trigger", "action"], "status": "Success" }
      ],
      "totals": { "flows": 12, "runs": 28, "byHand": 25, "onSchedule": 3, "componentsRun": 56 },
      "cron": {
        "timeZone": "The Advanced (cron) tab says “CRON expressions are scheduled in UTC”. Our flows fired at 18:35 and 19:10 UTC, as written, while the site's users were on Europe/Oslo time (UTC+2 that day). {{now}} logged with +0000.",
        "accepted": ["0 0 9 1 * ?", "0 0 9 * * ?", "0 0 9 2-4 * ?", "0 35 18 18-20 * ?", "0 0 9 ? * MON#1", "0 0 9 ? * 6L", "0 0 9 LW * ?", "0 0 9 1W * ?", "0 10 19 ? * 3#3", "0 10 19 20W * ?"],
        "firedOnSchedule": ["0 35 18 18-20 * ?", "0 10 19 ? * 3#3", "0 10 19 20W * ?"],
        "notYetDue": ["0 0 9 ? * MON#1", "0 0 9 ? * 6L", "0 0 9 LW * ?", "0 0 9 1W * ?"],
        "dayNumbers": "Days of the week count from Sunday = 1: 3#3 fired on Tuesday 20 October, the month's third Tuesday. So 6L is the last Friday."
      },
      "basicTab": "Repeats every so many minutes, hours, days, weeks or months, at a time in a time zone it lets you pick, by default the user's own. Weekly, it shows a button for each day; we did not try choosing more than one. Monthly, it offers First day of month, Last day of month, the First to Fourth or Last of a weekday, or A date; it has no business-day option. Its preview for the last Friday at 09:00 Europe/Oslo showed 09:00 Oslo time on both sides of the March change (GMT+1, then GMT+2), and the first run after the October change at 09:00 GMT+1, although we set it up on summer time. We did not save or run a Basic schedule.",
      "meter": "The Usage tab (current month, its only date filter) showed 0 steps at nine checks from 18:43 to 20:43 UTC: the last 2 h 48 min after the first run (17:55 UTC) and 1 h 33 min after the last (19:10 UTC). No step count could be read from it. We don't know why, and we have not checked which plan the development site's Automation usage is counted under. We will check again.",
      "notPublished": "No screenshots are published: they show the site's private data."
    }
  },

  "rules": [
    { "id": "billing-start", "topic": "Billing starts", "rule": "Extra usage billing for Automation takes effect on 3 December 2026. Atlassian says billing begins that day for most meters, that the timing can depend on the capability and billing cadence, and that it will tell each organisation its date.", "value": "2026-12-03", "sources": ["usage-calc", "lic-ubp"] },
    { "id": "step", "topic": "What a step is", "rule": "Each trigger, condition, action, branch and loop that runs in a flow counts as one step.", "sources": ["usage-calc", "lic-automation"] },
    { "id": "no-match", "topic": "A trigger that finds nothing", "rule": "Still one step. A trigger that ends NO_MATCH is charged. So are SUCCESS, NO_ACTIONS_PERFORMED, SOME_ERRORS and ABORTED.", "sources": ["usage-calc"] },
    { "id": "failed-condition", "topic": "A condition that says no", "rule": "Ends the run: the steps after it do not run. In our test the audit log listed the trigger and the condition, and called the run Success. Atlassian’s exclude-a-date KB says such a run shows NO ACTIONS PERFORMED. Both statuses are charged.", "sources": ["kb-exclude", "usage-calc"], "observed": "test-2026-10-20", "observedOn": "2026-10-20" },
    { "id": "audit-log", "topic": "What the audit log shows", "rule": "Each run of a flow, with the components that ran in it. In our test: the trigger and the action for a plain flow; the trigger alone, with No actions performed, when its JQL search found nothing; the trigger and the condition when the condition said no; all three when it said yes.", "sources": [], "observed": "test-2026-10-20", "observedOn": "2026-10-20" },
    { "id": "not-counted", "topic": "What does not count", "rule": "THROTTLED runs where no step runs, system-side errors, and system components Atlassian runs for you. Rovo steps use Rovo credits instead of steps.", "sources": ["usage-calc", "lic-ubp"] },
    { "id": "pool", "topic": "The pool", "rule": "One pool per organisation, shared by every app, site and user. Allowances refresh monthly and unused steps do not roll over.", "sources": ["usage-calc", "lic-automation", "lic-ubp"] },
    { "id": "allowance", "topic": "Allowances", "rule": "Paid plans add a fixed number of steps per user to the pool. Free plans add a fixed number per subscription. See the allowances table.", "sources": ["usage-calc", "jsm-pricing", "jira-pricing", "confluence-pricing", "teamwork-pricing", "jpd-pricing"] },
    { "id": "overage", "topic": "Over the allowance", "rule": "$0.50 per 1,000 steps: (steps used minus allowance) divided by 1,000, times $0.50.", "value": 0.5, "sources": ["usage-calc", "lic-automation"] },
    { "id": "extra-default", "topic": "Extra usage default", "rule": "Extra usage is on by default for most organisations. Organisation and billing admins can turn it off per meter, or set a monthly limit.", "sources": ["lic-ubp", "extra-usage"] },
    { "id": "alerts", "topic": "Alerts", "rule": "Admins get an alert at 80% and at 100% of the allowance. The pages differ on which admins: organisation and billing admins, or billing admins only.", "value": [0.8, 1.0], "sources": ["usage-calc", "lic-automation", "lic-ubp", "extra-usage"] },
    { "id": "cliff", "topic": "With extra usage off", "rule": "At 100%, flows stop until the allowance refreshes, or until you add a step pack. Atlassian marks some kinds of pack as coming soon. Events in between are not queued or replayed, and manual triggers stop too.", "sources": ["lic-automation", "lic-ubp", "usage-calc"] },
    { "id": "sandbox", "topic": "Sandboxes", "rule": "Steps that run in a sandbox count toward the same allowance. The usage dashboard does not show sandbox and production separately.", "sources": ["lic-ubp"] },
    { "id": "usage-tab", "topic": "The Usage tab", "rule": "Shows the month’s steps, marked Estimate, and a High usage flows table. Its only date filter is a whole month. On our site it still showed 0 steps 2 h 48 min after the first of 28 test runs. We don’t know why.", "sources": [], "observed": "test-2026-10-20", "observedOn": "2026-10-20" },
    { "id": "basic-schedule", "topic": "The Basic schedule", "rule": "The scheduled trigger’s Basic tab repeats every so many minutes, hours, days, weeks or months, at a time in a time zone you pick, by default your own. Its preview keeps that local time when the clocks change; we have not run a Basic schedule across a change. Monthly, it offers the first or last day, the first to fourth or last of a weekday, or a date. It has no business-day option.", "sources": [], "observed": "test-2026-10-20", "observedOn": "2026-10-20" },
    { "id": "cron-utc", "topic": "Cron time zone", "rule": "A cron line, set on the scheduled trigger’s Advanced tab, runs in UTC. The tab says so, and our test flows fired at the UTC times. A time zone setting for cron is a request that is Gathering Interest.", "sources": ["AUTO-1712"], "observed": "test-2026-10-20", "observedOn": "2026-10-20" },
    { "id": "quartz", "topic": "Quartz cron forms", "rule": "Automation accepted MON#1 (first Monday), 6L (last Friday), LW (last weekday of the month), 1W (first weekday), 3#3, 20W and day ranges such as 2-4. Days of the week count from Sunday = 1. 3#3 and 20W fired on time; MON#1, 6L, LW and 1W were not yet due when our test ended.", "sources": [], "observed": "test-2026-10-20", "observedOn": "2026-10-20" },
    { "id": "now-utc", "topic": "{{now}}", "rule": "{{now}} returns the current date and time in UTC, so {{now.jiraDate}} is the UTC date. Our test flows logged it with +0000.", "sources": ["sv-dates"], "observed": "test-2026-10-20", "observedOn": "2026-10-20" },
    { "id": "one-cron", "topic": "One cron line", "rule": "A scheduled trigger takes one cron line. Two schedules need two flows, or one wider cron line plus a condition.", "sources": ["kb-exclude"] },
    { "id": "auto-disable", "topic": "Failing scheduled flows", "rule": "A scheduled flow that fails 10 times in a row turns itself off.", "value": 10, "sources": ["triggers"] },
    { "id": "business-days", "topic": "Business days", "rule": "Business-day smart values count Monday to Friday. They do not know your public holidays; the request for that is Gathering Interest.", "sources": ["sv-dates", "kb-schedule", "AUTO-971"] },
    { "id": "who-builds", "topic": "Who can build flows", "rule": "Space admins and Jira admins create and manage flows. Any user with view and edit permission can use Set to recur, unless a Jira admin turns that off for non-admins.", "sources": ["perms"] },
    { "id": "set-to-recur", "topic": "Set to recur", "rule": "Offers daily, weekly, every weekday and every 2 weeks. Copies most fields but not attachments, web links or linked items. Its flows are named “Clone on a schedule”, carry the label “Recurring”, and count toward usage.", "sources": ["set-to-recur", "perms", "JRACLOUD-94173"] },
    { "id": "clone-request-type", "topic": "Clones in Jira Service Management", "rule": "A work item cloned by Automation does not get the same or a default request type.", "sources": ["JSDCLOUD-14350"] }
  ],

  "disagreements": [
    { "id": "free-unit", "topic": "Free plans: per subscription or per user?", "detail": "The usage doc and the Jira, Confluence, Teamwork, Jira Product Discovery and Service Collection pricing pages say per subscription. The usage-based pricing FAQ says per user, per month for every Free plan. We use per subscription.", "sources": ["usage-calc", "jsm-pricing", "lic-ubp"] },
    { "id": "reset", "topic": "When the allowance resets", "detail": "“On your usage billing date” (usage doc), “at the start of your next monthly billing period” (Automation FAQ), “at the start of each billing cycle” and “regardless of billing cycle” (usage-based pricing FAQ), “at the start of each monthly billing cycle” (billing doc). We count days of your usage month, not calendar dates.", "sources": ["usage-calc", "lic-automation", "lic-ubp", "usage-charges"] },
    { "id": "mid-run", "topic": "Flows already running at 100%", "detail": "The Automation FAQ says flows that are mid-run finish. The usage-based pricing FAQ says new steps in a flow stop.", "sources": ["lic-automation", "lic-ubp"] },
    { "id": "alert-recipients", "topic": "Who gets the alerts", "detail": "Organisation and billing admins (usage doc, usage-based pricing FAQ), billing admins (Automation FAQ), organisation admins (extra usage doc).", "sources": ["usage-calc", "lic-automation", "lic-ubp", "extra-usage"] }
  ],

  "allowances": {
    "freeUnit": "subscription",
    "paidUnit": "user",
    "inputMaxUsers": 250000,
    "inputMaxUsersNote": "The highest per-site user cap any of these pricing pages states (Confluence). Used where a page states no cap.",
    "products": {
      "jsm": { "label": "Jira Service Management / Service Collection", "short": "JSM", "free": 1250, "standard": 3000, "premium": 6500, "enterprise": 9500, "freeMaxUsers": 3, "userNoun": "agents", "maxUsers": 100000, "sources": ["usage-calc", "jsm-pricing"] },
      "jira": { "label": "Jira", "short": "Jira", "free": 150, "standard": 400, "premium": 750, "enterprise": 1000, "freeMaxUsers": 10, "userNoun": "users", "maxUsers": 100000, "sources": ["usage-calc", "jira-pricing"] },
      "confluence": { "label": "Confluence", "short": "Confluence", "free": 50, "standard": 100, "premium": 250, "enterprise": 500, "freeMaxUsers": 10, "userNoun": "users", "maxUsers": 250000, "maxUsersNote": "Shown on the Standard plan.", "sources": ["usage-calc", "confluence-pricing"] },
      "teamwork": { "label": "Teamwork Collection", "short": "Teamwork", "free": 200, "standard": 2500, "premium": 5000, "enterprise": 7500, "freeMaxUsers": 10, "userNoun": "users", "maxUsers": null, "maxUsersNote": "Not stated on the pricing page.", "sources": ["usage-calc", "teamwork-pricing"] },
      "jpd": { "label": "Jira Product Discovery", "short": "JPD", "free": 100, "standard": 300, "premium": 500, "enterprise": 750, "freeMaxUsers": 3, "userNoun": "users", "freeMaxUsersNoun": "creators", "maxUsers": null, "maxUsersNote": "Not stated on the pricing page.", "sources": ["usage-calc", "jpd-pricing"] }
    }
  },

  "overage": {
    "usdPer1000": 0.5,
    "formula": "(steps used - allowance) / 1000 * 0.50",
    "alertsAt": [0.8, 1.0],
    "billingStarts": "2026-12-03",
    "extraUsageDefault": "on for most organisations",
    "sources": ["usage-calc", "lic-automation", "lic-ubp"]
  },

  "calendar": {
    "method": "Averages over the 400-year Gregorian cycle 2001-2400, by counting every day.",
    "daysPerMonth": 30.436875,
    "weekdaysPerMonth": 21.740625,
    "weeksPerMonth": 4.348125,
    "days26to31PerMonth": 5.436875
  },

  "stepFormula": {
    "plain": "steps a month = runs * (1 + conditions) + matches * (1 + extra actions)",
    "keepLocal": "To keep 09:00 local all year: a recipe with a Basic form (its \"basic\" field is set) picks the time zone on the Basic tab, whose preview keeps 09:00 local through the clock changes, and keeps its plain count. A recipe with no Basic form needs a cron line, which runs in UTC, so it uses the DST-safe form. We have run neither across a clock change.",
    "dstSafe": "steps a month = runs * (4 + conditions) + matches * (1 + extra actions), for a recipe with no Basic form",
    "dstSafeWhy": "The trigger fires at both UTC hours that can be 09:00 local. Each firing costs the trigger and the hour condition (2 + 2 = 4); the firing at the right hour then runs the date conditions.",
    "failedCondition": "A condition that fails ends the run, so nothing after it counts. Observed in the audit log on 20 October 2026: the action after a failed condition did not run. The run was labelled Success, where Atlassian's exclude-a-date KB says NO ACTIONS PERFORMED; both are charged.",
    "runsKeys": "A recipe's runs and matches are numbers, or names of calendar averages: daysPerMonth, weekdaysPerMonth, weeksPerMonth, weeksPerMonth/2, weeksPerMonth*2, days26to31PerMonth, 1/3, 1/12.",
    "pool": "sum over products of the Free allowance, or users * the per-user allowance",
    "share": "schedule steps / pool",
    "over": "max(0, other steps + schedule steps - pool)",
    "cost": "over / 1000 * 0.50 USD",
    "cliffDay": "only with extra usage off and over > 0: floor(pool / (steps used / daysPerMonth)) + 1, as a day of the usage month, assuming even use"
  },

  "jobs": [
    { "id": "daily", "label": "Every day" },
    { "id": "weekdays", "label": "Every weekday (Mon to Fri)" },
    { "id": "weekly", "label": "Weekly on one day" },
    { "id": "two-days", "label": "Two days a week (Mon and Thu)" },
    { "id": "biweekly", "label": "Every 2 weeks" },
    { "id": "monthly-date", "label": "Monthly on a date" },
    { "id": "quarterly", "label": "Quarterly on a date" },
    { "id": "yearly", "label": "Yearly on a date" },
    { "id": "nth-weekday", "label": "First Monday, last Friday" },
    { "id": "nth-bday", "label": "2nd business day" },
    { "id": "last-bday", "label": "Last business day" }
  ],

  "recipes": [
    { "id": "daily", "job": "daily", "method": "Every day (Basic tab)", "basic": "Every 1 day", "cron": "0 0 9 * * ?", "condition": null, "runs": "daysPerMonth", "conditions": 0, "matches": "daysPerMonth", "status": "estimated", "measured": null, "inOurTest": null },
    { "id": "weekdays", "job": "weekdays", "method": "Weekly, Monday to Friday (Basic tab)", "basic": "Every 1 week, on Mon to Fri", "basicNote": "Several days in one Basic flow: not tried. If it takes one day, a weekly flow per day costs the same steps.", "cron": "0 0 9 ? * MON-FRI", "condition": null, "runs": "weekdaysPerMonth", "conditions": 0, "matches": "weekdaysPerMonth", "status": "estimated", "measured": null, "inOurTest": null },
    { "id": "weekly", "job": "weekly", "method": "Weekly on one day (Basic tab)", "basic": "Every 1 week, on Mon", "cron": "0 0 9 ? * MON", "condition": null, "runs": "weeksPerMonth", "conditions": 0, "matches": "weeksPerMonth", "status": "estimated", "measured": null, "inOurTest": null },
    { "id": "two-days", "job": "two-days", "method": "Weekly, Monday and Thursday (Basic tab)", "basic": "Every 1 week, on Mon and Thu", "basicNote": "Several days in one Basic flow: not tried. If it takes one day, a weekly flow per day costs the same steps.", "cron": "0 0 9 ? * MON,THU", "condition": null, "runs": "weeksPerMonth*2", "conditions": 0, "matches": "weeksPerMonth*2", "status": "estimated", "measured": null, "inOurTest": null },
    { "id": "biweekly", "job": "biweekly", "method": "Every 2 weeks (Basic tab)", "basic": "Every 2 weeks, on Mon", "cron": null, "condition": null, "runs": "weeksPerMonth/2", "conditions": 0, "matches": "weeksPerMonth/2", "status": "estimated", "measured": null, "inOurTest": null },
    { "id": "monthly-date", "job": "monthly-date", "method": "Monthly on a date (Basic tab)", "basic": "Every 1 month, on a date", "cron": "0 0 9 1 * ?", "condition": null, "runs": 1, "conditions": 0, "matches": 1, "status": "estimated", "measured": null, "inOurTest": "Cron form run 3 times by hand: trigger and action, 2 a run." },
    { "id": "quarterly", "job": "quarterly", "method": "Every 3 months on a date (Basic tab)", "basic": "Every 3 months, on a date", "cron": "0 0 9 1 1,4,7,10 ?", "condition": null, "runs": "1/3", "conditions": 0, "matches": "1/3", "status": "estimated", "measured": null, "inOurTest": null },
    { "id": "yearly", "job": "yearly", "method": "Every 12 months on a date (Basic tab)", "basic": "Every 12 months, on a date", "cron": "0 0 9 15 3 ?", "condition": null, "runs": "1/12", "conditions": 0, "matches": "1/12", "status": "estimated", "measured": null, "inOurTest": null },
    { "id": "nth-weekday-basic", "job": "nth-weekday", "method": "Monthly on the first Monday (Basic tab)", "basic": "Every 1 month, on the First Monday (or the Last Friday)", "cron": null, "condition": null, "runs": 1, "conditions": 0, "matches": 1, "status": "estimated", "measured": null, "inOurTest": "Option seen on the Basic tab; its preview listed the next 10 last Fridays at 09:00 local. Not saved." },
    { "id": "nth-weekday-quartz", "job": "nth-weekday", "method": "Cron MON#1 or 6L", "basic": null, "cron": "0 0 9 ? * MON#1", "cronAlt": { "label": "Last Friday", "cron": "0 0 9 ? * 6L" },"condition": null, "runs": 1, "conditions": 0, "matches": 1, "status": "estimated", "measured": null, "inOurTest": "Both accepted; each run twice by hand: trigger and action, 2 a run. Not yet due when the test ended." },
    { "id": "nth-weekday-daily", "job": "nth-weekday", "method": "Daily check", "basic": "Every 1 day", "cron": "0 0 9 * * ?", "condition": "{{now.jiraDate}} equals {{now.firstOfTheMonth(1).jiraDate}}", "runs": "daysPerMonth", "conditions": 1, "matches": 1, "status": "estimated", "measured": null, "inOurTest": null },
    { "id": "nth-bday-window", "job": "nth-bday", "method": "Three-day window plus a check (cron)", "basic": null, "cron": "0 0 9 2-4 * ?", "condition": "{{now.jiraDate}} equals {{now.firstBusinessDayOfMonth.plusBusinessDays(1).jiraDate}}", "windowStart": "N + 2 * floor((N - 1) / 5), for N from 1 to 20; the window is that day and the two after it", "runs": 3, "conditions": 1, "matches": 1, "status": "estimated", "measured": null, "inOurTest": "Run 3 times by hand on a day it should not create: trigger and condition, 2 a run. The 14th-business-day window fired on schedule on its day and ran all 3." },
    { "id": "nth-bday-basic", "job": "nth-bday", "method": "Three Basic monthly flows (2nd, 3rd, 4th) plus a check", "basic": "Every 1 month, on a date: one flow each on the 2nd, 3rd and 4th", "basicNote": "Three flows to keep in step instead of one.", "cron": null, "condition": "{{now.jiraDate}} equals {{now.firstBusinessDayOfMonth.plusBusinessDays(1).jiraDate}}", "runs": 3, "conditions": 1, "matches": 1, "status": "estimated", "measured": null, "inOurTest": null },
    { "id": "nth-bday-daily", "job": "nth-bday", "method": "Daily check (Atlassian’s KB)", "basic": "Every 1 day", "cron": "0 0 9 * * ?", "condition": "{{now.jiraDate}} equals {{now.firstBusinessDayOfMonth.plusBusinessDays(1).jiraDate}}", "runs": "daysPerMonth", "conditions": 1, "matches": 1, "status": "estimated", "measured": null, "inOurTest": "Cron form run 3 times by hand on a day it should not create: trigger and condition, 2 a run; the action did not run." },
    { "id": "last-bday-lw", "job": "last-bday", "method": "Cron LW (last weekday)", "basic": null, "cron": "0 0 9 LW * ?", "condition": null, "runs": 1, "conditions": 0, "matches": 1, "status": "estimated", "measured": null, "inOurTest": "Accepted; run twice by hand: trigger and action, 2 a run. Not yet due when the test ended." },
    { "id": "last-bday-window", "job": "last-bday", "method": "Days 26 to 31 plus a check (cron)", "basic": null, "cron": "0 0 9 26-31 * ?", "condition": "{{now.jiraDate}} equals {{now.lastBusinessDayOfMonth.jiraDate}}", "runs": "days26to31PerMonth", "conditions": 1, "matches": 1, "status": "estimated", "measured": null, "inOurTest": null },
    { "id": "last-bday-daily", "job": "last-bday", "method": "Daily check", "basic": "Every 1 day", "cron": "0 0 9 * * ?", "condition": "{{now.jiraDate}} equals {{now.lastBusinessDayOfMonth.jiraDate}}", "runs": "daysPerMonth", "conditions": 1, "matches": 1, "status": "estimated", "measured": null, "inOurTest": null }
  ],

  "dstSafe": {
    "appliesTo": "Only recipes with no Basic form, which need a cron line: the three-day window, days 26 to 31, LW, and MON#1 or 6L. Every other recipe is set on the Basic tab, whose preview keeps 09:00 local, at no extra steps. The 2nd-business-day window also has a Basic form of its own: three monthly flows, one for each day of the window.",
    "how": "Run the trigger at both UTC hours that can be 09:00 local, for example 07 and 08 for Europe/Oslo. First condition: {{now.convertToTimeZone(\"Europe/Oslo\").format(\"HH\")}} equals 09. Then any date condition, then the action.",
    "basis": "convertToTimeZone and format(\"<pattern>\") are both on Atlassian's date smart values page. We have not run this form yet.",
    "sources": ["AUTO-1712", "sv-dates"],
    "status": "estimated",
    "measured": null
  },

  "changelog": [
    { "date": "2026-10-21", "version": "2026-10-21", "change": "First public version. Before publishing we re-checked every rule against Atlassian’s pages on 20 October 2026, and tested the recipes on our development site the same day (see What we tested). From the re-check, compared with our 10 October draft: Confluence’s user cap is 250,000 per site, not 100,000; the cap is now per product. Added the Free plans’ user caps, extra usage being on by default, sandbox steps counting, and scheduled flows turning off after 10 failures in a row. The DST-safe check uses format(\"HH\"), which Atlassian documents, instead of .hour, which it does not. Atlassian’s “exclude a date” KB skips times of day, not dates, and is cited for that only. From the test: only a cron line runs in UTC. The Basic tab has its own time zone, and its preview keeps 09:00 local, so the DST-safe form and its extra steps now apply only to recipes that need a cron line. The first Monday or last Friday is a Basic monthly schedule at 2 steps, and the 2nd-business-day window can be three Basic monthly flows at the same 7 steps. Automation accepted the Quartz forms MON#1, 6L, LW and 1W, so they are listed, with LW (2 steps) as the cheapest last-business-day recipe; they had not come due before the test ended. A failed condition is labelled Success on our site, not NO ACTIONS PERFORMED. The audit log’s counts of what ran in each run are marked Observed. The Usage meter had not shown the test runs, so every step count stays Estimated." }
  ]
}
