A closed month can't change. Its posted entries are frozen, and anything new dated in it is booked in an open month or refused. Closing happens in Business Made Books › Period close (/books/close). For the same screen from the Business Made side, see Period close and entities. The endpoints are under business-made/period-close (appengine business-made/controllers/period-close.controller.ts, services/period-close.service.ts), called with call_appengine. A period is written YYYY-MM.
Period close opens on the current month. Its month picker covers the last 13 months (GET business-made/period-close/months?count=13). Each month is one of these:
| Status | Means |
|---|---|
| Current | The month is still running. It can't be locked yet. |
| Open | Ended, not locked. |
| Closed | Locked by a person, or by auto-close ("(automatically)"). |
| Reopened | Was closed, then reopened with a reason. Auto-close leaves it alone. |
Lock doesn't check the checklist. POST months/<period>/lock closes an ended month whatever the checklist says (lockMonth, 278). Auto-close doesn't check it either. Work the checklist first, and lock only on a yes.
Ask first
- Which month? It must have ended.
- Who signs off? The person who marks each item done, and the notes to keep (the statement balance, who reviewed payables).
- Lock now, or let auto-close do it? Auto-close is on by default, 10 days after the month ends.
Steps
1. Books: nothing left outside the books
Open Books (/books). A "stuck postings" banner, or money listed as not in the books, means a sale, payment, refund, bill payment or payroll run hasn't reached the ledger.
Hands on:
GET business-made/books/money-not-in-bookslists what's missing.POST business-made/books/money-not-in-books/retrywith one item books it. It answers 409 with the reason if it still can't.POST business-made/books/resume-postingsfinishes entries left half-posted (statusposting).
Check: GET business-made/books/balance-drift answers drifted: 0. That means every account's balance equals its posted ledger lines. Tell the owner about any drift. Don't repair it without a yes (POST …/balance-drift/repair).
2. Books › Bank: reconcile every account
Reconcile each bank and card account up to the month's last day, as in Reconcile the bank.
Check: each account's statement check reads "Reconciled: difference $0.00" on the month's last day.
3. Books › Period close: work the checklist
Pick the month. The checklist reads GET business-made/period-close/months/<period>/checks and GET business-made/books/reports/close-summary?period=<period>:
| Item | Done when | How |
|---|---|---|
| Bank reconciliation | someone marks it done | Mark done, write the note, Confirm reconciled: POST months/<period>/bank-reconciliation { done: true, note }. Its hint counts the month's bank lines still unmatched. |
| Books balance (debits = credits) | the month's posted debits equal its credits | Nothing to press. |
| Receivables review | no open invoices at month end, or Mark reviewed | POST months/<period>/reviews/ar { done: true, note? } |
| Payables review | no open bills at month end, or Mark reviewed | POST months/<period>/reviews/ap |
| Payroll run recorded | a payroll run is in the month, or Mark reviewed | POST months/<period>/reviews/payroll |
| Per-location sign-off | every business location is signed off (done when there are none) | POST months/<period>/locations/<locationId>/sign-off { done: true, note? } |
| Contract accruals recorded | every loan, prepaid or accrual month due is posted | Posted overnight, or Post due months now on the contract. |
| Monthly depreciation recorded | every asset's month is posted | Posted overnight, or Post now on the asset. |
| Lock period | the month is closed | Step 5. |
Undo on a marked item sends { done: false }. Once the month is closed, its checklist can't change: "PERIOD_CLOSED).
The Bank reconciliation hint counts only To review lines as unmatched (close-signoffs.ts). Lines still in Suggested count as matched. Confirm them in Books › Bank before you mark it done.
Stop: each Mark done, Mark reviewed and sign-off records the person's name. Mark one only when that person says it's done, and put their words in the note.
Check: reload the checks. Every row but Lock period is done.
4. Books › Reports: the close check and the statements
GET business-made/books/reports/close-check?from=<first day>&to=<last day>. With no dates it checks last month (month-end-close.service.ts):
| Check | Kind |
|---|---|
| trial balance balances | blocking |
| balance sheet balances | blocking |
| no stuck postings | blocking |
| every paid order is posted | blocking |
| cost of sales covers revenue | warning |
Studio doesn't show this report. Read it and tell the person what fails. Then open the month's Profit & Loss and Balance Sheet with them; see Financial reports.
A reversed entry fails "no stuck postings". The check counts every entry whose status isn't posted, void or draft (month-end-close.service.ts 89). So a reversed entry counts as stuck. Tested: after one manual reversal, close-check said "1 entry is stuck" while money-not-in-books listed nothing. When that's the only failure, look for reversed entries in the Journal. They aren't stuck.
5. Books › Period close: lock the month
Under Months, Lock period on the month, then Yes, lock POST business-made/period-close/months/<period>/lock.
Stop: show the checklist and the close check, and wait for yes on that month.
A month can be locked only after it has ended. Tested: locking the running month answered PERIOD_NOT_ENDED, "October 2026 has not ended yet. A month can be closed once it is over."
Once a month is closed:
- Its posted entries can't change, and it can't be deleted (
keepClosedMonthFrozen,PERIOD_CLOSE_PROTECTED). - Anything new dated in it (a sale, invoice, bill, payment, payroll run, journal entry) follows When something is dated in a closed period (
closing-periods.ts205):
| Setting | What happens |
|---|---|
record_time (default) | Booked today, at the time it's recorded. Its transaction date is kept. The note reads "September 2026 is closed, so this was booked on Oct 3." |
next_open_period | Booked on the 1st of the first open month. Its transaction date is kept. |
refuse | Not booked: PERIOD_CLOSED. The person picks an open date, or the month is reopened. |
Check: the month reads Closed and the Lock period row is done.
6. Books › Period close: reopen, when something must change
Reopen, then answer Why reopen POST months/<period>/reopen { reason }. A reason is required by default. Without one it answers REASON_REQUIRED, and a month that isn't closed answers "reopenMonth, 310; both tested). Who reopened it and why stay with the month and in the activity log.
A reopened month is held open: auto-close won't close it again. To close it, either lock it again (step 5), or press Let auto-close close it (POST months/<period>/resume-auto-close) so the next automatic run closes it.
Stop: reopening lets a closed month's figures change, after reports may have been sent. Show the reason and wait for yes.
Fix a mistake in a closed month with an entry dated today: Reverse… or Adjusting entry in Books › Journal. Both post in an open month and leave the closed month as it is. Reopen only when the figure must change inside that month.
7. Books › Period close: Closing periods settings
GET / POST business-made/period-close/settings:
| Field | On screen | Default |
|---|---|---|
autoClose | Close each month automatically | on |
autoCloseDays | days after the month ends (1–60; the screen offers 1, 3, 5, 7, 10, 15, 20, 30) | 10 |
closedPeriodPosting | When something is dated in a closed period | record_time |
reopenBy | Who can reopen a closed period: Owner only (owner) / Owner and admins (owner_admins) | owner |
reopenReasonRequired | Require a reason to reopen | on |
showBothTimes | Show the transaction and recorded times when they differ | on |
A change applies from then on. Nothing already booked moves, and no month is unlocked. Auto-close runs every day at 02:40 (books-auto-close, period-close.service.ts 80). It closes each ended month once its days have passed, skipping reopened months. Run automatic close now (POST business-made/period-close/auto-close/run) runs it at once and says what it closed.
Stop: before changing a setting or running auto-close now. Running it can close several months at once.
When it's done
- Every checklist row is done, with names and notes.
- The close check has no blocking failure, or only the reversed-entry one, explained.
- The month reads Closed.
What it can't do yet
- Lock and auto-close don't read the checklist (step 5).
- Reversed entries fail the close check (step 4).
- The close check isn't in Studio. It's API only.
- No saved bank reconciliation. Only the Mark done note keeps the statement figures.
Don'ts
- Don't lock, reopen, resume auto-close or run auto-close without a yes on that month.
- Don't mark an item done or reviewed for someone who hasn't said so.
- Don't reopen a month to fix something an adjusting entry today would fix.
- Don't repair balance drift without a yes.
- Don't change Closing periods settings to get one entry through.