docs
/
AI skills

Month-end close

Close a month in Business Made Books › Period close. Clear what didn't reach the books, reconcile the banks, work the checklist (bank, books balance, receivables, payables, payroll, locations, accruals, depreciation), run the close check, lock the month, and reopen it when something must change. What happens to anything dated in a closed month, and the Closing periods settings with auto-close.

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:

StatusMeans
CurrentThe month is still running. It can't be locked yet.
OpenEnded, not locked.
ClosedLocked by a person, or by auto-close ("(automatically)").
ReopenedWas 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-books lists what's missing. POST business-made/books/money-not-in-books/retry with one item books it. It answers 409 with the reason if it still can't.
  • POST business-made/books/resume-postings finishes entries left half-posted (status posting).

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>:

ItemDone whenHow
Bank reconciliationsomeone marks it doneMark 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 creditsNothing to press.
Receivables reviewno open invoices at month end, or Mark reviewedPOST months/<period>/reviews/ar { done: true, note? }
Payables reviewno open bills at month end, or Mark reviewedPOST months/<period>/reviews/ap
Payroll run recordeda payroll run is in the month, or Mark reviewedPOST months/<period>/reviews/payroll
Per-location sign-offevery business location is signed off (done when there are none)POST months/<period>/locations/<locationId>/sign-off { done: true, note? }
Contract accruals recordedevery loan, prepaid or accrual month due is postedPosted overnight, or Post due months now on the contract.
Monthly depreciation recordedevery asset's month is postedPosted overnight, or Post now on the asset.
Lock periodthe month is closedStep 5.

Undo on a marked item sends { done: false }. Once the month is closed, its checklist can't change: " is closed. Reopen it to change its close checklist." (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):

CheckKind
trial balance balancesblocking
balance sheet balancesblocking
no stuck postingsblocking
every paid order is postedblocking
cost of sales covers revenuewarning

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 . The call is 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.ts 205):
SettingWhat 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_periodBooked on the 1st of the first open month. Its transaction date is kept.
refuseNot 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 ? The call is 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 " is not closed." (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:

FieldOn screenDefault
autoCloseClose each month automaticallyon
autoCloseDaysdays after the month ends (1–60; the screen offers 1, 3, 5, 7, 10, 15, 20, 30)10
closedPeriodPostingWhen something is dated in a closed periodrecord_time
reopenByWho can reopen a closed period: Owner only (owner) / Owner and admins (owner_admins)owner
reopenReasonRequiredRequire a reason to reopenon
showBothTimesShow the transaction and recorded times when they differon

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.