๐ What's new in LedgerBee
Highlights
Split your profit and loss by dimension
Pick a dimension such as department or project, and the profit and loss shows one column per value, plus an Unassigned column. Revenue, expenses and net result are totalled for each value. CSV, Excel, PDF and emailed reports carry the same split, and split PDFs print in landscape.
Credit note numbers are given when you send
A draft credit note no longer takes a number from your series when you save it. It gets its number only when it is sent and booked, so deleted or refused drafts no longer leave gaps. Drafts show "-" in lists and "Draft" in the editor. The customer portal now shows only credit notes that have actually been sent.
Hivey checks your VAT and shows what it found
Ask Hivey to "check VAT" and it runs the VAT page's pre-filing checks. It reports whether the period is ready to file as a checklist. Click any line to see the findings behind it, such as unsent invoices, VAT code mismatches or unmatched bank lines.
Reusable discounts on invoices and quotes
Pick from saved discount records on invoice lines and whole documents, instead of typing discounts by hand. Reorder discounts by dragging, and see totals before and after saving. When the customer, date or currency changes on a draft, discounts that no longer apply are marked instead of silently dropped. Quotes warn you when a chosen discount expires before the quote does. Credit notes show the original invoice's discounts and credit the discounted amounts correctly. New invoices and credit notes now start in your company's own currency.
โจ Improvements
- Companies whose credit notes have no prefix see a warning offering to apply the suggested CN prefix or go to settings. Creating a credit note is blocked until a prefix is set. The credit notes list is now sorted newest first.
- Supplier account statements are recognised as their own document type, labelled "Account statement - not a bill" in the inbox. They are never booked as bills, sent to Hivey, or auto-matched to payments, but stay available for manual review.
- Approving a payment, subscription or journal entry now responds immediately. If a follow-up step such as sending to the bank or booking the entry fails or stalls, the request shows the reason and offers Retry without a new approval. A refused journal booking shows which account and line needs fixing, and the approver is notified.
- When a bank line is matched to a foreign-currency invoice, the exchange-difference line now inherits the invoice's dimension values. You can review and edit them before booking.
- Depreciation and disposal postings for fixed assets now carry the dimension value the asset was purchased with, so they appear correctly in dimension reports.
- If an e-conomic import cannot close an accounting year, the message now says which condition caused it and what to do next.
- Discounts can target a product group or customer group, so you no longer need a separate assignment for each product and customer pair.
- When you convert a quote whose discounts have changed, you choose whether to keep the quoted figures or use the current discounts. A dialog compares both.
- Changing a discount now lists the open quotes, order confirmations and invoice drafts it affects. It also tells you which keep their original figures and which adopt the new ones. Opened documents show a banner with the old and new figures.
- Discount codes: shoppers can enter a code at checkout. You can add, activate or deactivate, and delete unused codes, and require a code for a discount. Each code can be limited to one customer, a maximum number of redemptions, or an expiry date.
- Webshops can check which discounts apply to a cart before creating an order. The check shows the reduction per line, the total reduction, which codes don't apply and why, and the remaining uses.
- Help and support now live in the Hivey chat. Type /helpfor links to the knowledge base, developer docs, website, release notes and support email. The header help menu and Support page are removed.
- Reorder the top menu by dragging, or with Space and the arrow keys. You can remove items, restore hidden ones, or ask Hivey to set up the menu around your work. Changes apply to all open tabs in that company.
- The notifications page is now a paged table (25 per page) that you can filter by type and status. Mark-read and dismiss are one-click icon buttons on each row.
๐ Bug fixes
- Companies can now re-import invoices and postings from e-conomic when the previous year remains open.
- Correcting a foreign-currency payment now keeps its bank line, and multi-line payment drafts keep all their lines when you pick or clear invoices.
- Reversed journal entries now show a "Reversed" badge.
- Correcting an entry from a closed period now starts on today's date, with an explanation, instead of failing until you choose another date.
- Invoices, credit notes, quotes, order confirmations, purchase orders and reminder letters now show a clean contact sentence when the company has only an email or only a phone number. The sentence is omitted when both are missing.
- Exchange rates now read the same on every screen: six decimals in tables, and the full stored precision in detail views. Same-currency rates show as 1,000000, and a missing rate shows as a dash.
- A VAT code with no rate in an uploaded chart of accounts is now refused, with a clear message, instead of being saved as 0%. Your existing chart is left untouched.
- Dashboard widgets created by Hivey now open in the builder with all settings exactly as made.
- A bank payment matched to an invoice split by department now carries the department values, so department balances clear correctly.
- Jyske Bank FIK payments now match their invoices automatically.
- Paid invoices and credit notes with a small amount left now show in customer statements and open-items reports, marked "Paid, amount left", with only the remaining amount.
- E-invoice line numbers now stay consistent across sends and match the order shown in the PDF.
- Dimensions and tags now keep their type once created, so existing accounting data stays valid.
- Invoice lines now appear in the order they were written, hand-entered line discounts are calculated and saved correctly, and previews show a clear message when a line with an amount lacks a VAT rate.
- Invoices with fees and discounts now calculate VAT correctly, matching the preview.
- Converting a quote now stops with a clear message, and creates nothing, when its discounts cannot be checked. You can press Convert again to retry.
- Deleting a product or product group that is still in use now shows a clear refusal. It lists the affected documents or the number of products to move, and offers archiving.
- Deleting a credit note while it is being sent now shows the same refusal as deleting a sent one.
- PDF invoices and credit notes now show a per-unit discount larger than the unit price correctly.
- Invoices from foreign-currency suppliers are now booked to real expense accounts instead of exchange-difference accounts.
- Paying a supplier bill that arrived as an e-invoice now marks it as paid for the supplier.
- Opening a deleted invoice now closes the editor with a clear "Invoice not found" message.
- Surcharge fees now match across invoice previews, quotes and final invoices, and surcharge credits stay credits when a quote is converted.
- The invoice preview in the template studio now shows the sender heading and payment terms in the same order as the PDF.
- Delete dialogs and messages for draft invoices, quotes and order confirmations now say "draft" instead of a dash.
- Saving an invoice with a missing or mismatched contact now shows a clear "Customer contact not found" message.
๐ง For developers & integrators
โ ๏ธ Breaking changes
- PUT /api/v1/dimensions/:idno longer acceptsisUnique. Sending it returns400 SHARED_VALIDATION_FAILED. Requests that omit it, including renames vianame, are unaffected.
- The public API credit note create request no longer accepts creditNoteNumber. The credit notenumberis nownulluntil the credit note is sent.
- The credit note list now includes numberless drafts. They sort after every number when descending and before every number when ascending.
- DELETE /api/v1/discounts/:id/assignments/:assignmentIdnow returns200(with awarningsfield) instead of204.
- The default list limitfor/invoicesand/credit-notesincreased from 10 to 25.
๐ MCP tools
- set_top_menu(new): lets an agent arrange a user's top menu of areas and pages, including hiding or pinning items.
- check_vat_readiness(new): answers whether a VAT period is ready to file, as a readiness checklist.
- list_vat_readiness_findings(new): answers what specific findings sit behind a VAT readiness check, such as unbooked drafts, unsent invoices, VAT code issues or unmatched bank lines.
๐ API & webhooks
- Cursor pagination:GETlist endpoints for/journal-entries,/draft-journal-entries,/invoices,/credit-notes,/quotes,/order-confirmations,/customers,/suppliers,/vendors,/products,/subscriptions,/shipmentsand/stockaccept acursorparameter. All list responses includenextCursorandhasMore. Page-number pagination still works, but requests for page 2 and beyond carry aDeprecationheader. New error codes:PAGINATION_INVALID_CURSOR,PAGINATION_CURSOR_SORT_NOT_SUPPORTED,PAGINATION_OFFSET_TOO_DEEP,PAGINATION_SORT_NOT_SUPPORTED.
- Quotes and credit notes:lowercase customer and price IDs are now accepted when you create them.
- Discount codes:
-
GET /v1/discounts/codes/{code}
looks up a code. It returns the code, its discount, whether it applies, and the reason if not (codeUnknown
, codeExpired
, codeInactive
, codeCustomerMismatch
, codeMaxRedemptionsReached
, notInGroup
, codeRequired
).-
GET /v1/discounts/{discountId}/codes
returns a paginated list of codes (limit
1โ100, default 25; returns page
, limit
, data
, total
, totalPages
).- The new API-key scope
discounts-check
restricts a key to code lookups, without access to discount listing.- Discounts marked "Only through a code" are excluded from
GET /v1/discounts/applicable
. Applying one by ID alone is rejected with codeRequired
.- The quote-line error
DISCOUNT_CODE_IN_USE
is returned when you try to delete a redeemed code.- Cart check:POST /v1/discounts/checkaccepts cart lines, discount codes and discount IDs. It returns reductions per line and in total, refusals with reasons, and remaining uses per discount. It does not reserve uses; limits are rechecked when an invoice is booked.
- Cart check rate limit:POST /v1/discounts/checkandGET /v1/discounts/codes/{code}share a limit of 600 per minute per API key. Each code tried counts as one unit, so a check with 20 codes uses 20. When the budget is exhausted, both return429 DISCOUNT_CHECK_RATE_LIMITEDwith aRetry-Afterheader.
- Discount assignments:/v1/discounts/{id}/assignmentsaccepts and returnsproductGroupIdandcustomerGroupIdon create, update and read. These are additive toproductIdandcustomerId. A document that references a group-targeted discount for a product or customer outside the group is refused with reasonnotInGroup.
- Quote conversion:
-
POST /v1/quotes/:id/convert
and POST /v1/order-confirmations/:id/convert
accept an optional discountPricing
("asQuoted"
or "current"
). They return a warnings
array with DISCOUNT_CHANGED_SINCE_QUOTE
codes.- New endpoint
GET /v1/sales-documents/:id/discount-changes
returns the comparison data.-
POST /v1/sales-documents/:id/convert
and GET /v1/sales-documents/:id/discount-changes
now return 409 DISCOUNT_CHANGES_UNAVAILABLE
when the discounts cannot be read. No document is created in that case. Previously they returned 500 INTERNAL_UNKNOWN_ERROR
.- Discount changes:
- New endpoint
GET /api/v1/discounts/:id/open-documents
returns metadata for open documents affected by a discount.- Responses from
PATCH /api/v1/discounts/:id
, PUT
/DELETE /api/v1/discounts/:id/amounts/:currency
, and POST
/PATCH /api/v1/discounts/:id/assignments
now include a warnings
field.-
GET /api/v1/invoices/:id/discount-changes
and GET /api/v1/sales-documents/:id/discount-changes
gain a pricedAsQuoted
field.- Open entries:GET /v1/open-entriesrows now carrysettledWithRemainder(truefor paid invoices and credit notes with a true leftover amount, otherwisefalse). Rows whose remainder cannot be confirmed due to set-aside e-conomic import matches also carryoutsideTotals: true. Both are counted intotals.perCurrency.
- Batch journal entries:error responses fromPOST /api/v2/journal-entries/batchnow includeentryIndex, the zero-based position of the rejected entry. It sits indetails, or at the top level for restriction errors.
- Product groups:DELETE /v1/product-groups/:idreturns409with codePRODUCT_GROUP_IN_USEanddetails.productCountwhen the group still has products.