Use “Post an entry” in Recued. One entry, any number of legs, written in a single all-or-nothing transaction. It will not post unless the legs sum to zero.
Post an entry
Use “Post an entry” in Recued. One entry, any number of legs, written in a single all-or-nothing transaction. It will not post unless the legs sum to zero.
Complete workflow
Use Ledger book in Recued for accounting, double entry, budget, and records. It includes 44 built-in actions and 15 ready-to-run workflows. Actions that change data use Recued's approval controls.
You are viewing one recipe in this workflow. Installing it opens the complete pack so its other recipes and background automations arrive together.
Use “Records runtime” in Recued. It helps you complete this workflow using the connections and settings you choose.
Use “The accounts” in Recued. Every account with its id — what you post to, and what anything else in this workflow needs before it can name one.
Use “The tags” in Recued. Every tag with its id and how deep it sits — the trees you can spend against, and the ids the rest of the pack takes.
Use “What it all comes to” in Recued. Each currency's balance read exactly, then converted at rates you give and added up.
Use “Every budget at once” in Recued. All your budgets for a period, each counting everything under its tag — in four queries, however many budgets you have.
Show all 16 recipes
Use “How a budget is doing” in Recued. What a budget has left, counting everything under its tag at any depth.
Use “What went under a tag” in Recued. Everything spent under one tag, including every tag beneath it, at any depth.
Use “The lines under a tag” in Recued. Every transaction line under a tag and everything beneath it — the lines themselves, not a total. With a CSV to copy.
Use “Open an account” in Recued. Adds an account to your chart. Its currency is fixed here and every line posted to it inherits it.
Use “Add a tag” in Recued. Adds a tag anywhere in your tree, at any depth. The tag and its place in the tree are written together or not at all.
Use “Tag a month of lines” in Recued. One tree at a time: every line in a period on one page, with a picker in the tag cell.
Use “Tag a transaction line” in Recued. Sets which tags a line belongs to, one per tree. Each tag and every tag above it counts the full amount.
Use “Set a budget” in Recued. A cap on a tag for one period. It counts everything under that tag, at any depth.
Use “Move a tag” in Recued. Puts a tag inside a different one. Everything recorded under it follows automatically — no transaction is rewritten.
Use “Delete a tag” in Recued. Removes a tag and everything beneath it. Refuses while anything is still tagged with it.
The legs must sum to zero
That is the whole of double entry, and it is checked before anything is written. £81.30 on the card, £61.30 to food, £25.00 to travel, £5.00 back in cash — four legs, one entry, one transaction.
⛔ All of it lands or none of it does. The entry and its legs go through core.records.batch, so there is no moment where the entry exists and its legs do not. Written one at a time, a crash halfway leaves a half-posted entry that looks posted and does not balance — and nothing downstream can tell that from an entry that never balanced in the first place.
Why the check is in pennies
⛔ Adding the amounts as decimals would refuse valid entries. -100.10 + 30.20 + 69.90 is 0.0000000000000142 in floating point, not zero. So every amount is multiplied by 100 and rounded to a whole penny first, and the sum of those integers is what has to be zero. Integer arithmetic is exact well past any amount you will ever type.
⚠ More than two decimal places is refused, not rounded. Otherwise the check would pass on the rounded figure while the stored amount said something else — a balanced entry made of unbalanced numbers. If you need thirds of a penny, decide where the odd one goes before you post.
⚠ The refusal has a tolerance, and it has to. 69.90 × 100 is 6990.000000000001, so an exact test would reject a perfectly ordinary amount. A genuine third decimal is out by at least 0.0999; float noise is out by around 1e-12. The line sits between them, four orders of magnitude clear of both.
Ids, and posting the same thing twice
⚠ Every leg needs its own id, and the entry's ref is its id. That is what makes re-posting safe: create is replay-safe, so sending the identical entry again writes nothing rather than duplicating it. Without stable leg ids a retry would replay the entry and duplicate its legs, which is the worst of both.
⛔ A ref already used by a DIFFERENT entry is refused — same id, different content, so the write conflicts. That is a uniqueness check you get for free rather than one this recipe has to remember to do.
One currency per entry
⛔ The currency comes from each leg's ACCOUNT, and every leg must agree. It is not something you type — a typed currency is a second source of truth that can quietly disagree with the account the money actually sits in.
⛔ All legs must be in one currency. -100 GBP and +100 USD sums to zero and balances nothing: a zero-sum check across currencies is arithmetic coincidence, not an invariant, and it would wave through an entry that is wrong in both books. A currency exchange is TWO entries through a clearing account — one in each currency — which is what double entry does anyway, and it leaves the rate visible as the difference between them rather than buried in a conversion.
What it does not do
⚠ It does not tag anything. Legs carry tags through leg_tag, which is a separate step — an entry is about money moving between accounts, and what you call it afterwards is a different decision.
How it works
Inspect the data fetches, transforms, gates, and output this recipe runs.
Settings
Configurable at install. Defaults shown — change them anytime in Recued.
ref
setting
=
[object Object]
memo
setting
=
booked on
setting
=
legs json
setting
=
[]