actualbudget/actual · error · Error

Unsupported scheduled frequency

Error message

Unsupported scheduled frequency: ${frequency}

What it means

When importing YNAB5 schedules, mapYnabFrequency converts YNAB frequency strings (e.g. 'Never', 'Daily', 'Weekly', 'Every 2 Weeks', 'Monthly', 'Every 2 Months', 'Every 3 Months', 'Yearly') into RecurConfig. Any frequency value outside the switch cases hits the default branch and throws this error.

Solutions

  1. Inspect the YNAB5 JSON for scheduledTransactions with an unrecognized frequency and re-create those schedules with a supported value (Never, Daily, Weekly, Every 2 Weeks, Monthly, Every 2/3 Months, Yearly, etc.).
  2. Update Actual to the latest version — new YNAB frequencies are often added to mapYnabFrequency over time.
  3. As a workaround, edit the schedule in YNAB to use a supported frequency, re-export, and re-import.
  4. Patch mapYnabFrequency locally to map the new frequency to the closest supported RecurConfig and file an upstream issue.

Example fix

// before (unsupported value in JSON)
"frequency": "Twice a Month"
// after (supported value)
"frequency": "Every 2 Weeks"
Defensive patterns

Strategy: try-catch

Validate before calling

const SUPPORTED = ['Never','Daily','Weekly','Every 2 Weeks','Monthly','Every 2 Months','Every 3 Months','Every 4 Months','Twice a Month','Every 4 Weeks','Yearly'];
function validateFrequencies(ynabJson) {
  return (ynabJson.scheduledTransactions || [])
    .filter(s => !SUPPORTED.includes(s.frequency));
}

Type guard

function hasSupportedFrequency(s) {
  return typeof s.frequency === 'string' &&
    ['Never','Daily','Weekly','Every 2 Weeks','Monthly','Yearly'].includes(s.frequency);
}

Try / catch

try {
  await importBudget(ynab5Json);
} catch (e) {
  if (e.message.startsWith('Unsupported scheduled frequency')) {
    const freq = e.message.split(': ')[1];
    // re-create those schedules in YNAB with a supported frequency or upgrade Actual
  } else throw e;
}

Prevention

When it happens

Trigger: Importing a YNAB5 JSON export whose scheduled transaction has a frequency string the importer does not recognize — typically a newly added YNAB frequency value (like 'Twice a Month' or a localized/unexpected value) that predates or postdates the importer's mapping.

Common situations: Importing exports from newer YNAB versions that introduced new schedule frequencies; hand-edited YNAB5 JSON with a typo in the frequency field; third-party tools generating YNAB5 exports with nonstandard frequency values.

Related errors


AI-assisted analysis of actualbudget/actual@d4334cb6e6 (2026-08-29). Data as JSON: /api/errors/64b834a00515d770. Report an issue: GitHub.

Appendix: source

Thrown at packages/loot-core/src/server/importers/ynab5.ts:166

        patterns: getYnabMonthlyPatterns(dateFirst),
      };
    case 'everyOtherYear':
      return { frequency: 'yearly', interval: 2 };
    case 'twiceAMonth': {
      return {
        frequency: 'monthly',
        patterns: getYnabTwiceMonthlyPatterns(dateFirst),
      };
    }
    case 'twiceAYear': {
      return {
        frequency: 'monthly',
        interval: 6,
        patterns: getYnabMonthlyPatterns(dateFirst),
      };
    }
    default:
      throw new Error(`Unsupported scheduled frequency: ${frequency}`);
  }
}

function getScheduleDateValue(
  scheduled: ScheduledTransaction,
): RecurConfig | string {
  const dateFirst = scheduled.date_first;
  const frequency = scheduled.frequency;

  if (frequency === 'never') {
    return scheduled.date_next;
  }

  const mapped = mapYnabFrequency(frequency, dateFirst);
  return {
    frequency: mapped.frequency,
    interval: mapped.interval,
    patterns: mapped.patterns,

View on GitHub (pinned to d4334cb6e6)