actualbudget/actual · error · Error
Error parsing Budget.yfull file
Error message
Error parsing Budget.yfull file
What it means
parseFile parses the Budget.yfull contents with JSON.parse and throws this error when the text is not valid JSON. YNAB4 stores the budget as JSON, so a parse failure means the file content is corrupt, empty, or not actually a YNAB4 yfull document.
Source
Thrown at packages/loot-core/src/server/importers/ynab4.ts:476
e.startsWith(join(budgetPath, 'devices')),
);
const deviceGUID = findLatestDevice(zipped, deviceFiles);
const yfullPath = join(budgetPath, deviceGUID, 'Budget.yfull');
let contents;
try {
contents = Buffer.from(zipped[getFile(entries, yfullPath)]).toString(
'utf8',
);
} catch (e) {
logger.log(e);
throw new Error('Error reading Budget.yfull file');
}
try {
return JSON.parse(contents);
} catch {
throw new Error('Error parsing Budget.yfull file');
}
}
View on GitHub (pinned to d4334cb6e6)
Solutions
- Validate the extracted file (python3 -m json.tool Budget.yfull) to confirm whether the JSON is malformed.
- Restore a clean Budget.yfull from another YNAB4 backup or re-export from YNAB4.
- Ensure the cloud-storage placeholder was fully downloaded (file size > 0) before zipping/importing.
- If you edited the file, revert your changes or re-validate the JSON syntax.
Defensive patterns
Strategy: validation
Validate before calling
function isBudgetYfullJson(text) {
try {
const j = JSON.parse(text);
return j && typeof j === 'object' && 'version' in j;
} catch { return false; }
} Type guard
function isRecord(v) {
return typeof v === 'object' && v !== null && !Array.isArray(v);
} Try / catch
try {
const budget = parseFile(buffer);
} catch (e) {
if (e.message === 'Error parsing Budget.yfull file') {
// extract Budget.yfull, run python3 -m json.tool to locate the corruption
} else throw e;
} Prevention
- Extract and JSON-validate Budget.yfull when imports fail repeatedly.
- Beware cloud-storage placeholder files — ensure full download before zipping.
- Never hand-edit Budget.yfull without validating the JSON afterwards.
- Keep multiple YNAB4 backups; verify the newest one imports before deleting older ones.
When it happens
Trigger: parseFile(buffer) where the extracted Budget.yfull entry decodes to text that JSON.parse rejects — truncated file, HTML error page saved inside the zip, or an incompatible file format.
Common situations: Zip created from a partially synced cloud folder (file placeholder downloaded empty); user hand-edited Budget.yfull and broke the JSON; importing a YNAB5/nYab archive whose yfull is not plain JSON.
Related errors
- Error reading zip file
- json-parse-error
- Could not find account for transaction when importing
- Could not find file: ${path}
- File name matches multiple files: ${path}
AI-assisted analysis of actualbudget/actual@d4334cb6e6 (2026-08-29).
Data as JSON: /api/errors/9c15e9f6d327d900.
Report an issue: GitHub.