# Guides (Full)

---
source: /docs/guides.md

# Guides

Practical guides covering everything from your first sign-in to advanced financial workflows. Whether you're new to Bkper or looking to master specific features, start with the section that matches your needs.

  - [Getting Started](http://bkper.com/docs/guides/getting-started.md): A roadmap from your first Book and transaction to reporting, collaboration, and automation.
  - [Using Bkper](http://bkper.com/docs/guides/using-bkper/signing-in.md): Day-to-day workflows for Transactions, Accounts, Groups, Books, and features like properties and hashtags.
  - [Google Sheets](http://bkper.com/docs/guides/google-sheets.md): Use Bkper functions and features directly in Google Sheets for reporting and analysis.
  - [Automations](http://bkper.com/docs/guides/automations/bank-connections.md): Bank connections, automatic transaction imports, and workflow automations.
  - [Accounting Principles](http://bkper.com/docs/guides/accounting-principles/fundamentals/permanent-accounts.md): Double-entry bookkeeping, account types, receivables, payables, and financial modeling in Bkper.
  - [Account & Billing](http://bkper.com/docs/guides/account-and-billing/subscriptions.md): Plans, pricing, billing management, and account settings.
  - [Templates](http://bkper.com/docs/guides/templates/profit-and-loss.md): Pre-built Book templates for personal finances, business accounting, and more.
  - [Troubleshooting](http://bkper.com/docs/guides/troubleshooting/known-issues-google-sheets.md): Solutions to common issues and answers to frequently asked questions.

---
source: /docs/guides/account-and-billing/delete-account.md

# Delete Bkper Data and Close Account

You have full control over your data in Bkper. If you no longer need your data, you can delete it at any time without prior notice.

## Delete data

To delete recorded data from Bkper, **delete your books**. Before deleting a book, make a backup by using the Bkper Add-on for Google Sheets to fetch all transactions to a spreadsheet, or download a CSV file to your computer.

> **Caution**
> Once you delete a book, there is no way to recover the data.
## Remove Google account access

To revoke Bkper's access to your Google Account, go to [apps connected to your Google Account](https://security.google.com/settings/security/permissions).

Select **Bkper** on the list and click **Remove**.

![Google Account permissions page showing the option to remove Bkper access](http://bkper.com/docs/_astro/known-issues-web-app-2.2egYFMrX.png)

After revoking access, Bkper will no longer have access to any data from your Google Account. Note that this only removes the authorization — any recorded data is preserved in Bkper. To delete the data itself, delete your books as described above.

## Mobile app

To stop using Bkper on your phone, uninstall the Bkper app following the instructions for your device.

## Unsubscribe from emails

Stop receiving emails from Bkper by clicking any **unsubscribe** link at the bottom of Bkper emails.

![Bkper email footer showing the unsubscribe link](http://bkper.com/docs/_astro/delete-data-close-account-2.CJ0jAMdb.png)

## Deceased account holders

If you need to cancel the subscription or delete the data of someone who has passed away, send an email to [support@bkper.com](mailto:support@bkper.com). The Bkper team will help with the cancellation and any data removal.

---
source: /docs/guides/account-and-billing/google-cloud.md

# Bkper on Google Cloud

You can subscribe to Bkper through the Google Cloud Marketplace using your Google Cloud billing account. This gives you a single invoice from Google for all your GCP products and services, along with localized payment options.

If you subscribe directly through the Bkper web app (billed via Stripe), see [Manage Bkper Subscription](http://bkper.com/docs/guides/account-and-billing/manage-subscription.md) instead.

## Subscribe

Go to the [GCP Marketplace listing for Bkper](https://console.cloud.google.com/marketplace/details/bkper-public/bkper) and sign in with the book owner account.

Click the **VIEW ALL PLANS** button.

![Google Cloud Marketplace listing for Bkper with the View All Plans button](http://bkper.com/docs/_astro/subscribe-google-cloud-1.DFL36m2S.png)

Press the **SELECT** button on the plan of your choice.

![Plan selection screen on Google Cloud Marketplace](http://bkper.com/docs/_astro/subscribe-google-cloud-2.n2rg4lSE.png)

Select the correct billing account in the Purchase Details, accept the additional terms, and press **Subscribe** at the bottom of the page.

![Google Cloud Marketplace purchase details with billing account selection](http://bkper.com/docs/_astro/subscribe-google-cloud-3.pJ7L1HpN.png)

Once you have subscribed, press the **SIGN UP WITH BKPER** button.

![Google Cloud Marketplace page with the Sign Up With Bkper button](http://bkper.com/docs/_astro/subscribe-google-cloud-4.DtKA1aMn.png)

Go through the authorization and authentication flow to associate your GCP subscription with your Bkper login.

You are now subscribed to Bkper through the Google Cloud Marketplace. The GCP Marketplace page shows your subscription status.

![Google Cloud Marketplace showing the Bkper subscription status](http://bkper.com/docs/_astro/subscribe-google-cloud-5.DlTPq8za.png)

![Google Cloud Marketplace subscription detail for Bkper](http://bkper.com/docs/_astro/subscribe-google-cloud-6.Dbvxqm4V.png)

> **Note**
> - Bkper annual billing discounts are only available on the [Bkper Pricing page](https://app.bkper.com/b/#pricing:).
> - [Google Cloud Platform Terms](https://cloud.google.com/terms/) apply to payment, billing, and refund policies.
> - Bkper's [Refund Policy](http://bkper.com/docs/guides/account-and-billing/subscriptions.md#refund-policy) does **not** apply to Google Cloud purchases.
## Upgrade

To upgrade your Bkper subscription on Google Cloud, go to the [GCP Marketplace listing for Bkper](https://console.cloud.google.com/marketplace/details/bkper-public/bkper).

Scroll down to the pricing section and click **MANAGE ORDERS**.

![Google Cloud Marketplace Bkper listing with Manage Orders link](http://bkper.com/docs/_astro/upgrade-google-cloud-1.qkybJ5dF.png)

On the orders page, find the Bkper product, click the three-dot menu on the product line, and select **Change plan**.

![GCP orders page showing the Change plan option for Bkper](http://bkper.com/docs/_astro/upgrade-google-cloud-2.CXq4KJbj.png)

Choose the plan you want to upgrade to — for example, **Bkper Business**.

![Plan selection screen showing Bkper Business on Google Cloud](http://bkper.com/docs/_astro/upgrade-google-cloud-3.CCjtswnF.png)

Scroll to the end of the page, accept the additional terms, and press **CHANGE PLAN**.

![Google Cloud change plan confirmation with additional terms](http://bkper.com/docs/_astro/upgrade-google-cloud-4.C4zpk62P.png)

Confirm the change.

![Final confirmation dialog for the plan change on Google Cloud](http://bkper.com/docs/_astro/upgrade-google-cloud-5.B4L-Qxiz.png)

You are now on the upgraded plan. Verify it in the books you own by checking the bottom-left corner.

Please [contact the Bkper team](mailto:contact@bkper.com) to upgrade to the Bkper Professional tier.

## Downgrade

To downgrade your Bkper subscription on Google Cloud, go to the [GCP Marketplace listing for Bkper](https://console.cloud.google.com/marketplace/details/bkper-public/bkper).

Scroll down to the pricing section and click **MANAGE ORDERS**.

![Google Cloud Marketplace Bkper listing with Manage Orders link](http://bkper.com/docs/_astro/upgrade-google-cloud-1.qkybJ5dF.png)

On the orders page, find the Bkper product, click the three-dot menu on the product line, and select **Change plan**.

![GCP orders page showing the Change plan option for Bkper](http://bkper.com/docs/_astro/upgrade-google-cloud-2.CXq4KJbj.png)

Choose the plan you want to downgrade to — for example, **Bkper Standard**.

![Plan selection screen showing Bkper Standard on Google Cloud](http://bkper.com/docs/_astro/downgrade-google-cloud-1.Cxw629IO.png)

Scroll to the end of the page, accept the additional terms, and press **CHANGE PLAN**.

![Google Cloud change plan confirmation with additional terms](http://bkper.com/docs/_astro/upgrade-google-cloud-4.C4zpk62P.png)

Confirm the change.

![Final confirmation dialog for the plan change on Google Cloud](http://bkper.com/docs/_astro/upgrade-google-cloud-5.B4L-Qxiz.png)

You are now on the downgraded plan. Verify it in the books you own by checking the bottom-left corner.

## Cancel

To cancel your Bkper subscription on Google Cloud, you change your plan to **Bkper Free** through the GCP Marketplace.

Go to the [GCP Marketplace listing for Bkper](https://console.cloud.google.com/marketplace/details/bkper-public/bkper).

Scroll down to the pricing section and click **MANAGE ORDERS**.

![Google Cloud Marketplace Bkper listing with Manage Orders link](http://bkper.com/docs/_astro/upgrade-google-cloud-1.qkybJ5dF.png)

On the orders page, find the Bkper product, click the three-dot menu on the product line, and select **Change plan**.

![GCP orders page showing the Change plan option for Bkper](http://bkper.com/docs/_astro/upgrade-google-cloud-2.CXq4KJbj.png)

Choose the **Bkper Free** plan.

![Plan selection screen showing Bkper Free on Google Cloud](http://bkper.com/docs/_astro/cancel-google-cloud-1.Bw_1Guqw.png)

Scroll to the end of the page, accept the additional terms, and press **CHANGE PLAN**.

![Google Cloud change plan confirmation with additional terms](http://bkper.com/docs/_astro/upgrade-google-cloud-4.C4zpk62P.png)

Confirm the change.

![Final confirmation dialog for the plan change on Google Cloud](http://bkper.com/docs/_astro/upgrade-google-cloud-5.B4L-Qxiz.png)

You are now on the Bkper Free plan. Verify it in the books you own by checking the bottom-left corner.

## Free trial credits

New customers on Google Cloud Platform (GCP) can join a free trial period of one year with $300 in credits to spend on Cloud Platform services. You can use this credit to acquire a Bkper subscription on the GCP Marketplace. [Learn more about the GCP free trial](https://cloud.google.com/free).

### Activating your free trial

Go to your [Google Cloud Console](https://console.cloud.google.com/).

When you are new to Google Cloud, you are redirected to the welcome page. Click the **Activate** button on the credit banner in the top-right corner.

![Google Cloud Console welcome page with the Activate free trial button](http://bkper.com/docs/_astro/free-subscriptions-google-cloud-1.D2iX47QD.png)

Activate your full account.

![Google Cloud account activation screen](http://bkper.com/docs/_astro/free-subscriptions-google-cloud-2.8wlnjfLn.png)

Go to your Billing page.

![Google Cloud Console showing the Billing navigation](http://bkper.com/docs/_astro/free-subscriptions-google-cloud-3.yyZp6rQX.png)

Scroll down. In the right-hand menu, you can find the credits that apply to you or your organization.

![Google Cloud Billing page showing available free trial credits](http://bkper.com/docs/_astro/free-subscriptions-google-cloud-4.lK49vf-9.png)

These credits are consumed by everything you use on Google Cloud. When you [subscribe to Bkper on Google Cloud](#subscribe), the subscription cost is covered by the credits — effectively giving you a **Bkper Business subscription for free** during the first year.

---
source: /docs/guides/account-and-billing/manage-subscription.md

# Manage Bkper Subscription

This guide covers the full lifecycle of a Bkper subscription billed through Stripe — subscribing, upgrading, downgrading, cancelling, updating your payment method, and accessing invoices. If you subscribe through the Google Cloud Marketplace, see [Bkper on Google Cloud](http://bkper.com/docs/guides/account-and-billing/google-cloud.md) instead.

All subscription changes are managed from the **Billing** page. Sign in to [Bkper](https://app.bkper.com/) and click on your avatar in the top-right corner, then select **Billing**.

## Subscribing to a paid plan

Sign in to [Bkper](https://app.bkper.com/) and click on your avatar in the top-right corner of the web app.

![Bkper web app showing the avatar menu in the top-right corner](http://bkper.com/docs/_astro/subscribe-1._YJXv-Iz.png)

Select **Pricing**, then click **Choose** on the subscription plan you want. The checkout page opens with the subscription details and price on the left side.

![Bkper checkout page showing subscription details and price](http://bkper.com/docs/_astro/subscribe-2.Bn5bayjD.png)

Make sure you are signed in with the correct **book owner email account**. Fill out your card details on the right side and press the **Subscribe** button.

![Bkper checkout page with card details form and Subscribe button](http://bkper.com/docs/_astro/subscribe-3.B_QoGCQl.png)

Your subscription is now active. The subscription details appear in the bottom-left corner of the books you own, and the [Bkper Pricing page](https://app.bkper.com/b/#pricing:) reflects your current plan.

![Bkper book showing subscription details in the bottom-left corner](http://bkper.com/docs/_astro/subscribe-4.CGhyBMh2.png)

Bkper charges monthly or annually on the same day of the month or year. Each successful charge triggers an email with an invoice and receipt for your records. Contact details are included in the email and on the invoice for any billing questions.

Bkper sends email reminders when a payment is overdue and when a card is about to expire. After three failed charge attempts, the subscription is automatically cancelled — but you can return and resubscribe at any time.

> **Note**
> - Annual Bkper Standard subscriptions include a **25% discount**.
> - Bkper Business subscriptions are monthly only.
## Upgrading your plan

When you reach the transaction threshold of your current plan and need to continue posting during the current month, you can upgrade your Bkper subscription to the next tier.

On the Billing page, press the **Update plan** button.

![Bkper Billing page with the Update plan button](http://bkper.com/docs/_astro/upgrade-1.DFolSRQY.png)

Select the plan you want to upgrade to and press **Continue**.

![Plan selection screen showing available Bkper tiers](http://bkper.com/docs/_astro/upgrade-2.DMqQtsyf.png)

Confirm the update and press **Confirm**.

![Confirmation screen for the subscription upgrade](http://bkper.com/docs/_astro/upgrade-3.STS2b_7A.png)

Your subscription plan is now updated.

If you're upgrading from Bkper Free to a paid plan, follow the steps in [Subscribing to a paid plan](#subscribing-to-a-paid-plan) above.

Please [contact the Bkper team](mailto:contact@bkper.com) to upgrade to the Bkper Professional tier.

## Downgrading your plan

If you need fewer transactions than your current plan offers, you can downgrade to a lower tier.

Click on your avatar in the top-right corner.

![Bkper web app showing the avatar menu](http://bkper.com/docs/_astro/downgrade-1.DL5_KneV.png)

Select **Billing**. The Billing page opens. Press the **Update plan** button.

![Bkper Billing page with the Update plan button](http://bkper.com/docs/_astro/downgrade-2.f4QSCPVO.png)

Select the plan you want to downgrade to and press **Continue**.

![Plan selection screen showing available Bkper tiers](http://bkper.com/docs/_astro/downgrade-3.Q-7HgAQM.png)

Confirm the update and press **Confirm**.

![Confirmation screen for the subscription downgrade](http://bkper.com/docs/_astro/downgrade-4.DD4kR7a8.png)

Your subscription plan is now downgraded.

To downgrade to the Bkper Free tier, see [Cancelling your subscription](#cancelling-your-subscription) below.

## Cancelling your subscription

If you no longer need a paid plan, you can cancel your Bkper subscription at any time.

Open the Billing page by clicking on your avatar in the top-right corner and selecting **Billing**.

![Bkper avatar menu showing the Billing option](http://bkper.com/docs/_astro/cancel-1.C_8_3rAE.png)

On the Billing page, press the **Cancel plan** button.

![Bkper Billing page with the Cancel plan button](http://bkper.com/docs/_astro/cancel-2.pDTQ7Nel.png)

Press the **Cancel plan** button again to confirm the cancellation.

![Confirmation dialog for cancelling the Bkper subscription](http://bkper.com/docs/_astro/cancel-3.lE6C3dnn.png)

Your plan is now cancelled. Bkper will no longer charge you, and you can continue using the paid features of your tier until the end of the current billing period. After that, your account returns to the Bkper Free tier.

## Changing billing period

The Bkper Standard subscription offers a **25% discount** on annual billing. Once you've confirmed the value of the paid features, you can switch your billing period from monthly to annually — or back to monthly.

On the Billing page, press the **Update plan** button.

![Bkper Billing page with the Update plan button](http://bkper.com/docs/_astro/upgrade-1.DFolSRQY.png)

Click the **Yearly** toggle, then press **Continue**.

![Plan update screen with the Yearly billing option selected](http://bkper.com/docs/_astro/change-billing-period-1.BdT0lipe.png)

Confirm the update and press **Confirm**.

![Confirmation screen for the billing period change](http://bkper.com/docs/_astro/change-billing-period-2.BoW4OYDK.png)

Your billing period has now changed.

## Update payment method

You can update your payment details at any time from the Billing page.

Open the Billing page by clicking on your avatar in the top-right corner and selecting **Billing**.

![Bkper avatar menu showing the Billing option](http://bkper.com/docs/_astro/cancel-1.C_8_3rAE.png)

Press **+ Add payment method**.

![Bkper Billing page showing the Add payment method option](http://bkper.com/docs/_astro/update-payment-2.BvA2YPkN.png)

Fill out the form with the new card details and check **Use as default payment method**.

![Payment method form with card details and default payment checkbox](http://bkper.com/docs/_astro/update-payment-3.YZ5yax-c.png)

Press the **Add** button. Your payment method is now updated.

### Declined and failed payments

Payments can fail for a variety of reasons. Together with Stripe, Bkper does its best to avoid payment issues and collect charges normally. When a payment does not go through, Bkper tries to indicate the reason and provide steps to resolve the failure.

Unfortunately, for privacy and security reasons, card issuers only discuss the specific reasons for declined payments with the cardholder — they cannot share those details with Bkper. In these cases, the best course of action is to **contact your card issuer directly** and ask them for more information about the decline.

> **Tip**
> If repeated payment failures occur, consider updating your payment method with a different card using the steps above to avoid subscription interruption.
## Invoices and receipts

Sign in to [Bkper](https://app.bkper.com/) and click on your avatar in the top-right corner.

![Bkper avatar menu showing the Billing option](http://bkper.com/docs/_astro/billing-receipts-1.ByqI7tj7.png)

Select **Billing** from the dropdown menu. Your billing page opens.

On the billing page you can find information about your:

- **Subscription Plan**
- **Payment Methods**
- **Billing information**
- **Invoice History**

![Bkper billing page showing subscription, payment, and invoice sections](http://bkper.com/docs/_astro/billing-receipts-2.8WMgZJB9.png)

Scroll down to the **Invoice history** section and click on the date of the invoice or receipt you need.

![Bkper invoice history with download options for invoices and receipts](http://bkper.com/docs/_astro/billing-receipts-3.CDS1-_y5.png)

From the window that opens, select:

- **Download invoice**
- **Download receipt**

If you have any questions about your billing or subscription plans, reach out through [Bkper support](mailto:support@bkper.com).

---
source: /docs/guides/account-and-billing/subscriptions.md

# Bkper Subscriptions

Bkper is a consumption-based service where subscription plans are defined by the number of posted transactions per month, per owner. Higher-tier plans unlock additional features.

There are currently four subscription plans: **Bkper Free**, **Bkper Standard**, **Bkper Business**, and [Bkper Professional](https://bkper.com/professional/).

## Bkper Free

You start on Bkper for free with no credit card required. The Free plan is a fully functional version of Bkper with minor limitations that don't affect evaluation or personal and household use.

The Free plan includes:

- **100 posted transactions per month per owner**
- Unlimited Books and Accounts
- Unlimited Collaborators
- Comments and Activities
- Google Sheets add-on
- Bots and automations
- Chart reports

Bkper Free gives you plenty of room to explore every feature and understand how Bkper works for you.

Additionally, you can **test Bank Connections for 45 days** on the Free plan.

Bkper Free is always available — you can downgrade from a paid plan at any time and keep all your data accessible. Stay on Free for as long as you need until you're ready to [subscribe to a paid plan](http://bkper.com/docs/guides/account-and-billing/manage-subscription.md#subscribing-to-a-paid-plan).

## Bkper Standard

The Standard plan includes everything in Free, plus:

- **1,000 posted transactions per month per owner**
- **Saved Queries** for fast analysis
- **Bkper Bank Connections**

## Bkper Business

The Business plan includes everything in Standard, plus:

- **5,000 posted transactions per month per domain**
- **Book closing and lock dates**
- **White-label books**
- **Domain-wide activation**

All users with an email under your domain (e.g., mydomain.com) access Bkper as Business subscribers. Transactions posted in books created by those users count towards the domain's monthly transaction limit.

With Bkper Business, your domain's custom logo is automatically added to all books, boosting brand awareness among users. If you're on Google Workspace, Bkper uses your Workspace logo. Otherwise, the Bkper team can set the logo for you.

## Bkper Professional

If you need more than 5,000 transactions per month, please [contact the Bkper team](mailto:support@bkper.com) to discuss the Professional plan.

## Transaction counter

The monthly transaction counter tracks consumption against your subscription plan.

Posted transactions in a book increase the monthly counter for the **book owner**. Draft entries do not affect the counter. Deleted (posted) transactions do not decrease the counter — they remain part of the account's activity log and can be restored at any time.

You can find the total number of posted transactions for the current month in the summary at the bottom-left corner of each book you own. A per-book breakdown is available on the [Book list](https://app.bkper.com/#books:redirect=false).

> **Note**
> If you have a paid subscription and post a transaction on a book owned by someone else, those transactions count towards the **book owner's** plan — not yours.
> **Note**
> The counter reflects the current calendar month in which you post, regardless of the transaction's date. For example, posting a transaction in February with a date of 01/01/2025 increases February's count.
## Billing cycle

The monthly billing cycle follows the calendar month, running from the 1st to the last day. Transaction counters reset to zero on the first day of each month, regardless of your payment date.

If you reach your plan's transaction limit before the end of the month, you can continue recording drafts and post them in the next period. To resume posting immediately, [upgrade to a higher tier](http://bkper.com/docs/guides/account-and-billing/manage-subscription.md#upgrading-your-plan).

Find your [Billing, Invoices & Receipts](http://bkper.com/docs/guides/account-and-billing/manage-subscription.md#invoices-and-receipts).

## Limitations

You can create as many books and add as many shared users as you need, regardless of your plan.

While there are maximum monthly transaction thresholds, there is no limit to the total number of transactions you can store.

Transactions can include attachments of up to 20 MB each, with no limit on the total number of attachments or total storage space.

Activities remain available and accessible for four years.

## Refund policy

You can [cancel your Bkper subscription](http://bkper.com/docs/guides/account-and-billing/manage-subscription.md#cancelling-your-subscription) at any time and continue using the paid features of your tier through the end of the current billing period. After that, your account downgrades to the Bkper Free tier.

If you subscribed to a paid plan directly through Bkper (not through Google Cloud), Bkper offers a money-back guarantee for the **current subscription period** — whether monthly or annual. Send a simple request to [support@bkper.com](mailto:support@bkper.com), and the Bkper team will issue the refund right away for the current billing period to your registered card.

> **Caution**
> Refunds are not issued for past billing periods (previous months or years), regardless of whether the service was used or not.
Depending on your bank's processing time, it may take 5–10 business days for the refund to appear on your statement.

[Visit the Bkper Pricing Page](https://bkper.com/pricing/)

---
source: /docs/guides/accounting-principles/accounting-methods/accrual-basis.md

# Accrual Basis

The **accrual basis** records revenues and expenses at the moment they occur, regardless of when cash actually changes hands. This generates [payable](http://bkper.com/docs/guides/accounting-principles/payables/accounts-payable.md) or [receivable](http://bkper.com/docs/guides/accounting-principles/receivables/accounts-receivable.md) balances that represent outstanding obligations until the money moves.

When the cash does move — whether as a full settlement or a partial installment — a separate transaction records that payment.

## Example — a printing company

A printing company buys paper from a supplier and sells folders to a client, both on credit.

### The accounts

The book needs accounts that track the cash position, the counterparties, and the goods involved.

![Bkper accounts list showing Bank Account, Client, Supplier, Folders, and Paper](http://bkper.com/docs/_astro/accrual-basis-1.DreGYVwS.png)

### Recording the purchase

The company buys printing paper on credit, then pays the supplier later. Two [transactions](http://bkper.com/docs/core-concepts.md#transactions) capture this:

| Date | Amount | From Account | | To Account | Description |
| --- | --- | --- | --- | --- | --- |
| 05/07 | 3,000.00 | Supplier | >> | Paper | Printing Paper A4 300 |
| 31/07 | 3,000.00 | Bank Account | >> | Supplier | Payment |

![Bkper transactions showing a paper purchase on credit from Supplier followed by bank payment to Supplier](http://bkper.com/docs/_astro/accrual-basis-2.BoEZsbNx.png)

### Recording the sale

The company sells folders on credit, then receives the payment from the client:

| Date | Amount | From Account | | To Account | Description |
| --- | --- | --- | --- | --- | --- |
| 12/07 | 300.00 | Folders | >> | Client | 100 Color foldable Folders |
| 31/07 | 300.00 | Client | >> | Bank Account | Payment of the 100 Folders |

![Bkper transactions showing a folder sale on credit to Client followed by client payment to Bank Account](http://bkper.com/docs/_astro/accrual-basis-3.T4xtq814.png)

> **Note**
> With the accrual method you can track receivables and payables — obligations that remain visible in your balances until settled. This is not possible with the [cash basis](http://bkper.com/docs/guides/accounting-principles/accounting-methods/cash-basis.md) method, which only records transactions when money moves.

---
source: /docs/guides/accounting-principles/accounting-methods/cash-basis.md

# Cash Basis

The **cash basis** records revenue when a payment is received and expenses when a payment is made. Unlike the [accrual basis](http://bkper.com/docs/guides/accounting-principles/accounting-methods/accrual-basis.md), you do not track receivables or payables — every transaction reflects actual cash movement.

## Example — a printing company

A printing company buys paper and sells folders, recording each event only when money changes hands.

### The accounts

Because this cash-basis example does not track outstanding receivables or payables, the book only requires accounts for the cash position, income, and expenses.

![Bkper accounts list showing Bank Account, Client (incoming), and Papers (outgoing)](http://bkper.com/docs/_astro/cash-basis-1.DYmH7e05.png)

> **Note**
> In this simplified cash-basis example, there are no supplier or payable timing accounts — expenses are recorded directly when paid. Other liability accounts, such as loans, credit cards, or taxes payable, can still exist in a cash-basis book when they reflect real obligations.
### Recording the transactions

Each transaction corresponds to an actual cash movement:

| Date | Amount | From Account | | To Account | Description |
| --- | --- | --- | --- | --- | --- |
| 22/07 | 300.00 | Bank Account | >> | Papers | Expenses with papers |
| 26/07 | 30.00 | Client | >> | Bank Account | Client's payment |

![Bkper transactions showing a cash expense for papers and a cash receipt from a client](http://bkper.com/docs/_astro/cash-basis-2.BH5tEOKc.png)

The purchase is recorded on the date the bank pays, and the sale is recorded on the date the client's payment arrives — not when the order is placed or the invoice issued.

---
source: /docs/guides/accounting-principles/billing-invoicing.md

# Billing and Invoicing

Invoicing is handled by your preferred invoicing solution, and the generated invoices are recorded as receivables in Bkper through automations. This way, your receivable balances always reflect the actual amount to collect.

There are many online invoicing solutions available — such as [ZipBooks](https://zipbooks.com/), [Invoice Ninja](https://www.invoiceninja.com/), [Zoho](https://www.zoho.com/invoice/), and [Yamm](https://yet-another-mail-merge.com/) — that connect to Bkper without programming through automations like the [Google Sheets Add-on for Bkper](https://bkper.com/blog/turn-google-sheets-into-a-powerful-accounting-tool/).

The [Bkper API](https://bkper.com/api) also lets you customize and extend Bkper into Google Workspace, so you can build your own solutions and automate workflows — including invoicing — with simple Google Apps Scripts that fully integrate with Google Workspace.

---
source: /docs/guides/accounting-principles/bkper-for-accountants.md

# Bkper for Accountants

Bkper's core implements the same fundamentals as any double-entry bookkeeping or accounting system, with a key differentiating factor.

## A paradigm shift in transaction representation

Instead of working with traditional journal entries:

![Traditional double-entry bookkeeping with journal entries](http://bkper.com/docs/_astro/bkper-for-accountants-1.DEIHl0CU.png)

Bkper is driven by a **transaction flow** — resources move from one Account to another:

![Bkper's transaction flow representation showing resources moving between Accounts](http://bkper.com/docs/_astro/bkper-for-accountants-2.BGVuzEGe.png)

Both representations are fundamentally the same, but the shift in paradigm introduces a higher level of abstraction that changes how teams work with financial data:

- The flow representation is closer to reality.
- It is easier to understand for non-accountants.
- It sets a common language among clients, accountants, and developers.
- It enables much more effective financial modeling.
- It enhances control and audit.
- It presents accounting as a **strategic tool**, rather than a tax and compliance burden.

## An event-driven architecture

Instead of relying on databases and batch processes:

![Traditional batch processing with databases](http://bkper.com/docs/_astro/bkper-for-accountants-3.C9i6xoix.png)

Bkper is built as an **event-driven API**, converting a complex, rigid, compliance-driven environment into a consistent and organized ledger.

### What this architecture enables

- Effective [robot process automation](http://bkper.com/docs/guides/automations/apps-and-bots.md)
- Flexible and simple customizations
- Reusable components and services — Bots, Apps, and Templates
- Streamlined and safe [collaboration](http://bkper.com/docs/guides/using-bkper/book-sharing.md)

## Built on Google Cloud Platform

Bkper applies the highest security standards:

- **User management** outsourced to Google Workspace
- **API access** through OAuth2 and SSL
- **Distributed datastore**, [encrypted at rest](https://cloud.google.com/docs/security/encryption/default-encryption)
- **[Point-in-time disaster recovery](https://cloud.google.com/datastore/docs/pitr)** up to 7 days
- **Security infrastructure** outsourced to Google Cloud Platform

---
source: /docs/guides/accounting-principles/fundamentals/account-reconciliation.md

# Account Reconciliation

Reconciling your Bkper accounts against real-world bank statements ensures that your records match reality. Bkper's daily balance values — sometimes called a running or rolling balance — make it straightforward to spot and correct discrepancies.

## Selecting the account and period

Open your Book and select the Account that corresponds to the bank statement you want to reconcile. When you select an Account, the **daily balance value** appears on the **last Transaction of each day**.

![Bkper account view showing daily balance values on the last transaction of each day](http://bkper.com/docs/_astro/account-reconciliation-1.COjvYwPG.png)

This is the corresponding bank statement for the same Account and period.

![Bank statement showing daily balances for the same period](http://bkper.com/docs/_astro/account-reconciliation-2.DrvmXD94.png)

## Detecting differences

From the **final balance value** on the Book you can quickly detect the difference between the Book and the statement. In this example, the Book shows −72.47 while the statement shows −92.22.

## Comparing daily balances

Compare the daily balance values on the Transactions from the beginning of the period until you detect what causes the difference.

**The Book:**

![Bkper daily balance values on transactions for comparison with the bank statement](http://bkper.com/docs/_astro/account-reconciliation-3.LvmAu5p-.png)

**The statement:**

![Bank statement daily balances for comparison with the Bkper book](http://bkper.com/docs/_astro/account-reconciliation-4.wJlBZbd-.png)

Walk through the daily balances chronologically. When a day's balance in Bkper diverges from the statement, the Transaction causing the difference is on that day — it may be a wrong amount, a missing Transaction, or a duplicate.

## Correcting discrepancies

Correct any difference you find by editing the Transaction. After correcting all errors during the period, the daily balance values on all Transactions match the daily balance values on the statement.

![Bkper account view showing corrected daily balance values matching the bank statement](http://bkper.com/docs/_astro/account-reconciliation-5.DdjD17Lx.png)

## Marking reconciled Transactions

The **check mark** on Transactions serves as a powerful reconciliation aid. Beyond confirming the balance value, it can also signal that attachments, comments, and other details have been reviewed. Check each Transaction as you reconcile it to maintain a clear reference of what has been verified.

![Bkper transactions with check marks indicating they have been reconciled](http://bkper.com/docs/_astro/account-reconciliation-6.C1c5HATq.png)

> **Tip**
> Use the [check and uncheck](http://bkper.com/docs/guides/using-bkper/transactions.md#checking-and-unchecking) feature systematically during reconciliation. Unchecked Transactions give you a clear view of what still needs review — making it easy to pick up where you left off.

---
source: /docs/guides/accounting-principles/fundamentals/amortization.md

# Amortization

Amortization gradually writes down the balance of an intangible asset over its useful life, spreading the cost across the periods that benefit from it.

## The accounts

Two accounts handle the process: an **accumulated amortization** account (liability type) that tracks the total amount written down, and an **amortization expense** account (outgoing type) that records the periodic cost.

![Bkper accounts showing Accumulated amortization (Intangible Asset) and Amortization expense (Intangible asset)](http://bkper.com/docs/_astro/amortization-1.Cuux-Jdg.png)

## Recording amortization transactions

Each period, record a transaction that moves an amount from the accumulated amortization account to the expense account. In this example, an intangible asset worth 5,000.00 is amortized over five months at 1,000.00 per month:

| Date | Amount | From Account | | To Account | Description |
| --- | --- | --- | --- | --- | --- |
| 05/05 | 1,000.00 | Accumulated amortization | >> | Amortization expense | 5 x 1000 corresponding to Intangible asset XYZ |
| 04/06 | 1,000.00 | Accumulated amortization | >> | Amortization expense | - |
| 05/07 | 1,000.00 | Accumulated amortization | >> | Amortization expense | - |
| 05/08 | 1,000.00 | Accumulated amortization | >> | Amortization expense | - |
| 06/09 | 1,000.00 | Accumulated amortization | >> | Amortization expense | - |

![Bkper transaction list showing five monthly amortization entries of 1,000.00 each from Accumulated amortization to Amortization expense](http://bkper.com/docs/_astro/amortization-2.DnBByZ6f.png)

> **Tip: Recording in bulk**
> For linear amortization with equal amounts, use the [record multiplier](http://bkper.com/docs/guides/using-bkper/record-guide.md) on the single-entry input to record all transactions at once. Alternatively, prepare entries in a Google Sheet and record them with the [Add-on for Google Sheets](http://bkper.com/docs/guides/google-sheets.md).
## Sample book

Explore a working example: [Amortization](https://app.bkper.com/b/#transactions:bookId=agtzfmJrcGVyLWhyZHITCxIGTGVkZ2VyGICAoPCv0b0LDA).

---
source: /docs/guides/accounting-principles/fundamentals/balance-sheet-equity.md

# Balance Sheet and Equity

Equity is what remains when you subtract liabilities from assets on the balance sheet. Bkper can show this value in real-time, updating automatically after every posted transaction.

## Setting up an equity group

To view your equity, group all your asset and liability accounts into a single **Equity** group.

![Bkper group setup showing all asset and liability accounts grouped under an Equity group](http://bkper.com/docs/_astro/balance-sheet-equity-1.BD2yJs2s.png)

The Equity group in the balance sidebar combines all the movements from these accounts, providing an up-to-date equity balance after each posted transaction.

![Bkper balance sidebar showing the Equity group with a real-time balance](http://bkper.com/docs/_astro/balance-sheet-equity-2.DpbSHKJB.png)

## Viewing the balance sheet

Find your balance sheet on the left side of the dashboard. It shows all asset and liability accounts with their current balances, and the Equity group displays the net result.

![Bkper dashboard showing the balance sheet on the left sidebar](http://bkper.com/docs/_astro/balance-sheet-equity-3.DhL-aKYH.png)

---
source: /docs/guides/accounting-principles/fundamentals/bank-accounts.md

# Bank Accounts

When you operate with several bank accounts, consolidating the total balance across all of them can become difficult. In Bkper, you can group your bank accounts into a single [Group](http://bkper.com/docs/core-concepts.md#groups) and get the consolidated balance value effortlessly.

## Viewing individual balances

On the Balance Sheet in the left menu of your Book, you can find the balance values of each bank Account.

![Bkper sidebar showing individual balance values for each bank account](http://bkper.com/docs/_astro/bank-accounts-1.DXm_9w5R.png)

## Grouping for a consolidated balance

To get the **consolidated balance value of all bank accounts**, group them into a single Group. The Group total updates automatically as Transactions are recorded.

![Bkper sidebar showing bank accounts grouped together with a consolidated balance total](http://bkper.com/docs/_astro/bank-accounts-2.EgHVpxAn.png)

## Recording Transactions

Record incoming and outgoing Transactions to and from your bank accounts. Each Transaction moves an amount from one Account to another.

![Bkper transactions showing movements to and from bank accounts](http://bkper.com/docs/_astro/bank-accounts-3.CdaCSlv5.png)

## Tracking each account separately

Each bank Account maintains its own running balance based on all recorded Transactions. When you filter a single permanent Account, Bkper shows that running balance on each transaction row. See the [Accounts guide](http://bkper.com/docs/guides/using-bkper/accounts.md#running-balance) for where it appears in the interface.

![Bkper showing the Brex Cash account balance calculated from individual transactions](http://bkper.com/docs/_astro/bank-accounts-4.CbaajkHR.png)

**Brex Cash** 7,000 = +20,000 − 8,000 − 5,000

![Bkper showing the Citi Bank account balance calculated from individual transactions](http://bkper.com/docs/_astro/bank-accounts-5.DuASZjrp.png)

**Citi Bank** 500 = +8,000 − 5,000 − 2,000 − 500

The **Bank Accounts** Group updates together with the Transactions, always showing the consolidated balance value of all the bank accounts.

![Bkper sidebar showing the consolidated Bank Accounts group balance as the sum of individual accounts](http://bkper.com/docs/_astro/bank-accounts-6.CBKubQSe.png)

**Bank Accounts 7,500 = Brex Cash 7,000 + Citi Bank 500**

---
source: /docs/guides/accounting-principles/fundamentals/closing-a-period.md

# Closing a Period

**Closing a book** is a concept rooted in the early days of bookkeeping and accounting. Physical books were used to write down each transaction, and at some point those books reached their last page. To solve this, closing entries were recorded in that book and opening entries in a new one, so balances could carry forward correctly.

![Historical ledger showing closing entries in a physical book](http://bkper.com/docs/_astro/closing-a-period-1.By-VLQna.png)

From closing books came the concept of **closing a period**. If a book was closed after a fixed period, performance could be measured on a time basis. This became a standard practice — an important moment to assess how an entity performed, understand its new position, and share the results through standard reports.

These concepts became so deeply rooted in bookkeeping that many systems inherited them. But what if a book has no physical limitations, and entries can be endless?

## Continuous balance values

The most significant difference with a traditional book or system is Bkper's concept of **continuous balance values**. Balance values in Bkper are updated and [audited](http://bkper.com/docs/guides/using-bkper/balances-audit.md) on every posted transaction. Each posted transaction updates both the position and the performance up to that moment.

For the conceptual overview of how balances work in Bkper, see [Core Concepts — Balances](http://bkper.com/docs/core-concepts.md#balances).

Permanent accounts carry their balances forward continuously, while non-permanent accounts are read within the selected period. Period boundaries follow the timezone set on the book.

This means permanent account balances carry over to a new financial year, while Incoming and Outgoing accounts are reported by period — without closing entries or stored midnight resets.

![Running balance on a bank account showing continuous balance values](http://bkper.com/docs/_astro/closing-a-period-2.C-ydpiQJ.png)

A bank account's running balance illustrates this concept — the closing value of one day becomes the starting value for the next. To see where the running balance appears in the current interface, see the [Accounts guide](http://bkper.com/docs/guides/using-bkper/accounts.md#running-balance).

Since there is no limitation on the number of transactions in a Bkper book, **there is no need to close a book**. You simply continue recording transactions on the same book for as long as needed.

## Closing a period

Different from closing a book is the concept of **closing a period**. Since balances in Bkper are updated and [audited](http://bkper.com/docs/guides/using-bkper/balances-audit.md) on each posted transaction, there is no specific action required to close one period and open another. You can simply continue recording transactions.

## Reporting a period

With an endless book of transactions, continuous balance values, and no closing date — how do you report a period in Bkper?

Since balances are updated on each posted transaction and date boundaries naturally separate one reporting window from the next, a dynamically selected **[date range](http://bkper.com/docs/guides/using-bkper/date-range-slider.md)** reports both the performance and the closing position of that period.

Learn how to use dates and periods for reports in the [Query Guide](http://bkper.com/docs/guides/using-bkper/search-and-queries.md).

To illustrate, consider a book that holds transactions from **January 2018** through **February 2020**. To report the **position** (balance sheet) for 2018, query:

```
on:12/31/2018
```

And for 2019:

```
on:12/31/2019
```

To report the **performance** (profit & loss) for 2018, query:

```
after:01/01/2018 before:01/01/2019
```

And for 2019:

```
after:01/01/2019 before:01/01/2020
```

## Locking a period

To prevent spontaneous, malicious, or erroneous modifications to a reported or audited period, a [lock date](http://bkper.com/docs/guides/using-bkper/books.md#closing--lock-dates) can be set on each book. Once a lock date is set, no modifications or transactions can be recorded before that date. Only book owners and editors can change the lock date to an earlier date.

This is the option that most closely resembles closing a period in Bkper.

![Setting a lock date on a Bkper book to protect a closed period](http://bkper.com/docs/_astro/closing-a-period-3.P91m8zQ6.png)

---
source: /docs/guides/accounting-principles/fundamentals/credit-cards.md

# Credit Cards

A credit card represents money you owe — making it a **liability type** account (yellow in Bkper). Setting it up this way lets you track the outstanding balance, payments, and interest charges accurately.

## Setting up the account

Create a **Credit Card** account as a liability alongside your other accounts.

![Bkper chart of accounts showing a Credit Card as a liability type account](http://bkper.com/docs/_astro/credit-cards-1.6-3unno8.png)

## Recording expenses

When you charge expenses to the credit card, the **amount owed on the card increases**. Record each expense as a movement from the credit card account to the appropriate expense account.

![Bkper transactions showing expenses recorded to the Credit Card, increasing the amount owed to 505](http://bkper.com/docs/_astro/credit-cards-2.Dnp5u29C.png)

## Recording a partial payment

When you make a partial payment, the **amount owed on the credit card decreases** by the amount paid.

| Date | Amount | From Account | | To Account | Description |
| --- | --- | --- | --- | --- | --- |
| 04/03/2017 | 255.00 | Bank Account | >> | Credit Card | Partial credit card payment |

For simplicity, the examples shown here use the same date in the screenshot, but they represent a sequence: expenses increase the amount owed, payments reduce it, interest adds to the unpaid balance, and the final payment clears the liability.

![Bkper transaction showing a partial payment reducing the amount owed to 250](http://bkper.com/docs/_astro/credit-cards-3.DnqxVd9x.png)

## Recording interest charges

The credit card company charges interest on the remaining unpaid balance. Record this as a movement from the credit card account to an interest expense account, which increases the amount owed.

| Date | Amount | From Account | | To Account | Description |
| --- | --- | --- | --- | --- | --- |
| 04/03/2017 | 30.00 | Credit Card | >> | Credit Card Interests | Interest on outstanding balance |

![Bkper transaction showing interest charges added to the amount owed on the Credit Card](http://bkper.com/docs/_astro/credit-cards-4.Bs6sWI3s.png)

## Paying off the full balance

When you pay the remaining outstanding balance, the outstanding balance returns to zero.

| Date | Amount | From Account | | To Account | Description |
| --- | --- | --- | --- | --- | --- |
| 04/03/2017 | 280.00 | Bank Account | >> | Credit Card | Full credit card payoff |

![Bkper transaction showing the full payoff clearing the outstanding Credit Card balance](http://bkper.com/docs/_astro/credit-cards-5.DEE5jPAm.png)

---
source: /docs/guides/accounting-principles/fundamentals/double-entry-bookkeeping.md

# Double-Entry Bookkeeping

Bkper is a double-entry bookkeeping system. This guide takes you from the basics of double-entry — and how Bkper interprets it — through choosing accounts and [account types](http://bkper.com/docs/core-concepts.md#account-types), to [grouping accounts](http://bkper.com/docs/core-concepts.md#groups) so you can centralize control of your finances in one snapshot on the balance sidebar.

This is the level of control you can work toward:

> **Note**
> This level of detail is not mandatory — you can start with just a few accounts. The colors in the image correspond to the account type colors in Bkper.
## Double-entry bookkeeping

**How does double-entry bookkeeping work?** Each time you make a transaction — like paying someone — you make at least two entries in two different accounts, as the resource goes from one account to another.

**What is an account?** In Bkper, an account is a place where resources reside or flow through. For those familiar with traditional accounting, this can also be translated into a T-account with debit (left) and credit (right) sides.

Key principles of double-entry bookkeeping:

- A transaction always consists of a Debit and Credit entry in a book
- Debit and Credit entries are always in two different accounts
- Debit and Credit are always in balance in a book
- To start a book you make balance adjustments to your accounts
- On Debit-balance accounts, debit entries increase the balance
- On Debit-balance accounts, credit entries decrease the balance
- On Credit-balance accounts, debit entries decrease the balance
- On Credit-balance accounts, credit entries increase the balance

## A single transaction

The payment by bank transfer of a bus ticket becomes a **credit** entry on your Bank account and a **debit** entry on your Expenses account. The bank account decreased and the expenses account increased.

## Combining transactions

On a work trip, some expenses are made and at the end of the month the company reimburses them.

First, a pizza for lunch costs $50.00. The **credit** entry records the amount to be reimbursed (increasing) at $50.00, and the **debit** entry records the expense increasing by $50.00.

Next, a hotel stay costs $250.00. The **credit** entry records the reimbursable amount increasing by $250.00, and the **debit** entry records the expense increasing by $250.00.

The reimbursement of all expenses at the end of the month is done by bank transfer. The **credit** entry records the Bank account decreasing by $300.00, and the **debit** entry records the reimbursement on the Collaborator account decreasing by $300.00.

## How Bkper represents this

Bkper transactions follow the same bookkeeping principles. When you take the combination of transactions described above and put the account balances together, the Bkper representation matches exactly.

The simplified view of these transactions:

And how they appear in Bkper:

**Transactions**

![The three transactions as they appear in Bkper's transaction list](http://bkper.com/docs/_astro/advanced-transactions-view.BmFUBMzv.png)

**Accounts**

![Account balances in Bkper reflecting all three transactions](http://bkper.com/docs/_astro/advanced-accounts-view.BxNVIGmv.png)

## Starting with accounts

Transactions represent the exchange of resources between two accounts. If you are not familiar with bookkeeping or accounting concepts, start with just a few accounts that represent all your activities. With a few accounts, transaction identification can be done with searchable [#hashtags](http://bkper.com/docs/guides/using-bkper/hashtags.md) in the description.

As the need for more granularity grows naturally, you can add accounts that make sense for your activities. Add an online payment receivable alongside your bank account, or detail expenses into separate accounts to track their balances during a running period.

## Account types

Account types determine if an account appears on the balance sheet or the income statement in the balance sidebar.

**Asset** (blue) and **Liability** (yellow) accounts are permanent accounts shown on the upper part of the sidebar — together they represent your balance sheet. **Incoming** (green) and **Outgoing** (red) accounts are non-permanent accounts shown on the lower part — together they represent your income statement for a given period.

See also: [Permanent accounts, debit and credit balances](http://bkper.com/docs/guides/accounting-principles/fundamentals/permanent-accounts.md)

With account types assigned, the transactions and accounts look like this:

**Transactions**

![Transactions with color-coded accounts showing their types](http://bkper.com/docs/_astro/advanced-typed-transactions.BOhaXwGs.png)

**Accounts**

![Accounts in the sidebar showing color-coded types and balance values](http://bkper.com/docs/_astro/advanced-typed-accounts.CxiKNW_B.png)

## Grouping by account type

With accounts that represent financial movements, you can **group accounts** of the same kind and see their total balance on the sidebar. Group all customer accounts into one group to show the combined customer balance. The same applies for revenue, assets, liabilities, or expenses.

Bkper does not allow grouping Permanent Accounts with Non-Permanent accounts, but you can group Assets with Liabilities to see your **Equity**, and group Incoming with Outgoing to see your **Net Profit** for a given period.

**Transactions**

![Transactions view with grouped accounts showing totals on the balance sidebar](http://bkper.com/docs/_astro/advanced-grouped-transactions.Dej1Vxi6.png)

> **Note**
> The group totals on the balance sidebar now show the combined balance of all bank accounts in one place.
**Accounts**

![Grouped accounts with per-type totals visible on the sidebar](http://bkper.com/docs/_astro/advanced-grouped-accounts2.cuMR1axC.png)

## Grouping permanent accounts

Grouping permanent accounts shows the result of your balance sheet on the sidebar.

## Grouping non-permanent accounts

Grouping non-permanent accounts shows the result (net profit) of the selected running period on the sidebar.

> **Note**
> - The asset and liability accounts are omitted from the image above for visualization purposes
> - Groups that hold accounts from two different types are colored gray in Bkper
With all groupings in place:

**Transactions**

![Complete transaction view with all groups showing Equity and Net Profit on the sidebar](http://bkper.com/docs/_astro/advanced-final-transactions.BLb-pPOJ.png)

> **Note**
> - The **Equity** and **Net Profit** balance totals appear on the balance sidebar
> - **Permanent accounts** are organized on top; **non-permanent** accounts are shown for the current month below
**Accounts**

![Complete account view showing all groups with Equity and Net Profit](http://bkper.com/docs/_astro/advanced-final-accounts.Du9HO5Xl.png)

> **Note**
> - Permanent account groups and Non-Permanent account groups are colored gray
> - An account can be grouped into multiple groups across different hierarchies
Explore this concept hands-on by making your own copy of the [advanced concept book](https://app.bkper.com/b/#transactions:bookId=agtzfmJrcGVyLWhyZHITCxIGTGVkZ2VyGICAwPnMyPIIDA).

---
source: /docs/guides/accounting-principles/fundamentals/inventory-depreciation.md

# Inventory Depreciation

This guide shows a periodic asset write-down flow in Bkper. Whether you apply it to inventory obsolescence or another depreciating asset, you record periodic transactions that move value from the asset into a depreciation expense account, with an accumulated depreciation account reflecting the total reduction.

## The accounts

Set up your chart of accounts with the relevant asset, liability, and expense accounts to capture the full depreciation cycle.

![Chart of accounts for inventory depreciation showing asset, accumulated depreciation, and expense accounts](http://bkper.com/docs/_astro/inventory-depreciation-1.Br9UcxU_.png)

### Receive inventory

When inventory arrives, record the transaction that increases your asset account.

![Transaction recording the receipt of new inventory in Bkper](http://bkper.com/docs/_astro/inventory-depreciation-2.YnyVQnpf.png)

### Pay for the inventory

Record the payment to reflect the cash outflow.

![Transaction recording the payment for the new inventory](http://bkper.com/docs/_astro/inventory-depreciation-3.2_ZLEzZk.png)

### Depreciate inventory over time

Periodically record depreciation to reflect the loss of value. Each transaction moves a portion of the asset value into the depreciation expense.

![Depreciation transactions reducing inventory value over time in Bkper](http://bkper.com/docs/_astro/inventory-depreciation-4.hDduSiVc.png)

> **Tip**
> To record all depreciation transactions at once, prepare your entries in a Google Sheet and use the [Bkper Add-on for Google Sheets](http://bkper.com/docs/guides/google-sheets.md) to post them to your book in bulk.
## Sample book

Explore a working example of inventory depreciation in the [Inventory Depreciation sample book](https://app.bkper.com/#transactions:bookId=agtzfmJrcGVyLWhyZHITCxIGTGVkZ2VyGICAgN6_kKUKDA).

---
source: /docs/guides/accounting-principles/fundamentals/permanent-accounts.md

# Permanent Accounts and Balance Types

Bkper account types define two things at once:

- whether the balance carries forward continuously or is read within a period
- whether the account increases on the **From** side or the **To** side of a transaction

This guide explains those two dimensions together so you can read balances correctly.

If you need the broader model first, see [Core Concepts — Account Types](http://bkper.com/docs/core-concepts.md#account-types) and [Balances](http://bkper.com/docs/core-concepts.md#balances).

## The Two Dimensions That Matter

Every account in Bkper has:

1. a **time behavior**
2. a **balance direction**

### Time behavior

Accounts are either:

- **Permanent** — balances carry forward continuously
- **Non-permanent** — balances are interpreted within a selected period

### Balance direction

Accounts either increase when they appear on:

- the **From** side of a transaction
- the **To** side of a transaction

These two dimensions combine into the four account types used in Bkper.

## The Four Account Types

| Account type | Time behavior | Increases on | Typical examples | Main question it answers |
| --- | --- | --- | --- | --- |
| **Asset** | Permanent | **To** | Bank, cash, inventory, receivables | What do I have right now? |
| **Liability** | Permanent | **From** | Loans, credit card debt, suppliers | What do I owe right now? |
| **Incoming** | Non-permanent | **From** | Sales, salary, interest | How much did I earn in this period? |
| **Outgoing** | Non-permanent | **To** | Rent, payroll, supplies, fuel | How much did I spend in this period? |

## Permanent Accounts

**Permanent accounts** are the balance-sheet accounts in Bkper:

- **Asset** accounts
- **Liability** accounts

Their balances do not reset when the month or year changes. They accumulate continuously and show your financial position at a point in time.

A **Bank** account is a typical permanent Asset account. Each incoming transfer increases its balance, and each outgoing payment decreases it. A **Loan** account is a typical permanent Liability account. Each new borrowing increases the liability balance, and each repayment reduces it.

Permanent accounts answer position questions such as:

- How much cash do I have now?
- How much inventory do I hold now?
- How much do I still owe?

## From Balances: Liability and Incoming Accounts

Accounts with a **From** balance increase when they appear on the **From** side of a transaction.

This includes:

- **Liability** accounts
- **Incoming** accounts

Use this pattern when the source side of the movement is what should grow.

Typical examples:

- a **Loan Payable** account increases when borrowed money comes from that liability account into the bank
- a **Sales** or **Salary** account increases when income flows from that account into a bank or cash account

These accounts often answer period or obligation questions such as:

- How much revenue did I generate this month?
- How much salary income did I receive this year?
- How much do I still owe on this liability?

## To Balances: Asset and Outgoing Accounts

Accounts with a **To** balance increase when they appear on the **To** side of a transaction.

This includes:

- **Asset** accounts
- **Outgoing** accounts

Use this pattern when the destination side of the movement is what should grow.

Typical examples:

- a **Bank** account increases when money arrives in it
- an **Expense** account increases when money is assigned to that spending category

These accounts often answer questions such as:

- How much cash is in this bank account now?
- How much is still receivable from customers?
- How much did I spend on fuel this month?

## How This Appears in Bkper

In Bkper, account type determines both the color and how the balance should be interpreted.

**The Accounts**

**The Transactions**

When reading a balance, ask two questions:

1. Is this account **permanent** or **non-permanent**?
2. Does it increase on the **From** side or the **To** side?

Those two answers tell you whether you are looking at:

- a position that carries forward
- or activity within a period

## Why This Matters

Understanding this model helps you:

- choose the right account type when creating accounts
- interpret balances without relying on debit/credit memorization
- understand why Assets and Outgoing accounts grow on the **To** side
- understand why Liabilities and Incoming accounts grow on the **From** side
- read reports and grouped balances correctly

## Next Steps

- Learn the underlying movement model in [Double-Entry Bookkeeping](http://bkper.com/docs/guides/accounting-principles/fundamentals/double-entry-bookkeeping.md)
- Review the big picture in [Core Concepts](http://bkper.com/docs/core-concepts.md)
- See how time-based balances work in [Closing a Period](http://bkper.com/docs/guides/accounting-principles/fundamentals/closing-a-period.md)

---
source: /docs/guides/accounting-principles/fundamentals/profit-loss-net-income.md

# Profit & Loss and Net Income

**Net income** is the result of all revenues and gains minus the cost of goods sold, expenses, and losses over a given period. In Bkper, you can track this figure in real time by grouping your incoming and outgoing accounts under a single cross group.

## Setting up the Net Income group

Place all incoming and outgoing accounts into a cross group called **Net Income**. This group spans both account types, so its balance always reflects the difference — your profit or loss for the selected period.

![Bkper accounts view showing incoming and outgoing accounts all assigned to a Net Income cross group](http://bkper.com/docs/_astro/profit-loss-net-income-1.Dp_vtITJ.png)

## Reading the result

Once the group is in place, the sidebar shows the **Net Income** balance alongside the individual incoming and outgoing totals. The value updates automatically every time a transaction is posted against any account in the group.

![Bkper sidebar displaying Income, Outgoing, and Net Income balances for December 2016](http://bkper.com/docs/_astro/profit-loss-net-income-2.S5vzirV_.png)

Use the date slider above the balances to navigate between periods and compare results month by month.

> **Tip**
> The [Profit and Loss Report on Google Sheets](http://bkper.com/docs/guides/templates/profit-and-loss.md) guide shows how to pull these balances into a spreadsheet and build a shareable P&L statement.

---
source: /docs/guides/accounting-principles/fundamentals/recording-refunds.md

# Recording Refunds

Refunds are a common part of bookkeeping, whether you are receiving a refund on a purchase or issuing a refund on a sale. In Bkper, refunds are recorded by **inverting the original transaction**, effectively reversing its financial impact.

> **Caution**
> Deleting the original transaction is not recommended — it removes valuable financial history and disrupts account balances. Always record refunds as reversal transactions instead.
## The principle

A refund is simply the opposite of the original transaction. Instead of recording new income or expense, you reverse the original entry to reflect the return of funds. This ensures that the original transaction remains in your records, the refund is accurately accounted for, and account balances stay consistent and reconcilable.

## Refunding a sale

When you sell something, you typically record:

| Date | Amount | From Account | | To Account | Description |
| --- | --- | --- | --- | --- | --- |
| 01/01/2026 | 100.00 | Service | >> | Receivable | Original sale |

If you later issue a refund, reverse the transaction by swapping the accounts:

| Date | Amount | From Account | | To Account | Description |
| --- | --- | --- | --- | --- | --- |
| 01/02/2026 | 100.00 | Receivable | >> | Service | Refund on sale |

This removes the revenue from your books, clears the receivable (if it was unpaid) or adjusts the balance accordingly, and keeps the transaction history intact for accurate reporting.

## Refunding a purchase

When you make a purchase, you record:

| Date | Amount | From Account | | To Account | Description |
| --- | --- | --- | --- | --- | --- |
| 02/01/2026 | 200.00 | Payable | >> | Expense | Original purchase |

If you later receive a refund, invert the transaction:

| Date | Amount | From Account | | To Account | Description |
| --- | --- | --- | --- | --- | --- |
| 02/02/2026 | 200.00 | Expense | >> | Payable | Refund on purchase |

This removes the expense from your books and restores the payable amount, ensuring the correct balance. For a partial refund, simply adjust the amount accordingly.

![Refund transactions in Bkper showing the reversal of original entries](http://bkper.com/docs/_astro/recording-refunds-1.DI19Y4IO.png)

## Why reverse instead of delete

- **Keeps records accurate** by maintaining a clear transaction history
- **Ensures proper reconciliation** with bank statements and financial reports
- **Maintains the integrity of account balances**, making it easier to track incoming and outstanding amounts
- **Allows for adjustments**, such as deducting any fees charged on the refund, ensuring the net amount is correctly reflected

> **Note**
> Refund transactions may not always happen on the same day as the original sale or purchase. This method ensures that both the initial transaction and its refund are properly accounted for, even when they occur in different accounting periods.

---
source: /docs/guides/accounting-principles/fundamentals/sales-taxes-vat.md

# Sales Taxes / VAT

Recording sales taxes in Bkper lets you see your tax receivable or payable balance at any moment. The approach depends on whether tax is included in the sales price or added separately.

In all cases, tax accounts track what you owe the government (**Output Tax** — a liability) and what the government owes you (**Input Tax** — an asset).

> **Tip**
> These examples use simplified cash basis for easy understanding. You can also set up more complex tax flows involving [accounts payable](http://bkper.com/docs/guides/accounting-principles/payables/accounts-payable.md) and [accounts receivable](http://bkper.com/docs/guides/accounting-principles/receivables/accounts-receivable.md) instead of a direct bank account.
## Taxes included in the price

When the tax is already embedded in the price, each purchase or sale is recorded at the **full amount** first. A second transaction then extracts the tax portion into a dedicated tax account.

### Purchase (tax included)

You buy supplies for **220** (includes 20 tax at 10%). You pay 220, but your real expense is 200 — the other 20 is a tax credit you reclaim.

```mermaid
flowchart LR
    B["Bank"]:::asset -- "220" --> E["Expense"]:::outgoing
    E -- "20" --> IT["Input Tax"]:::asset
```

| # | Amount | From | | To | Description |
|---|---|---|---|---|---|
| 1 | **220.00** | Bank `Asset` | >> | Expense `Outgoing` | Service or product purchased |
| 2 | **20.00** | Expense `Outgoing` | >> | Input Tax `Asset` | #vatin |

**Result:** Expense = 200, Input Tax = 20 (reclaimable), Bank = −220

The second transaction corrects the expense — 20 of the 220 was never your cost, it's a tax credit.

### Sale (tax included)

You sell a product for **440** (includes 40 tax at 10%). The customer pays 440, but your real revenue is 400 — the other 40 is the government's money passing through you.

```mermaid
flowchart LR
    P["Product"]:::incoming -- "440" --> B["Bank"]:::asset
    OT["Output Tax"]:::liability -- "40" --> P
```

| # | Amount | From | | To | Description |
|---|---|---|---|---|---|
| 1 | **440.00** | Product `Incoming` | >> | Bank `Asset` | Service or product sold |
| 2 | **40.00** | Output Tax `Liability` | >> | Product `Incoming` | #vatout |

**Result:** Revenue = 400, Output Tax = 40 (owed to government), Bank = +440

The second transaction corrects the revenue — 40 of the 440 was never yours, it belongs to the government.

## Taxes not included in the price

When the tax is added separately from the price, the purchase or sale is recorded at the **net amount**. A separate transaction records the tax portion, increasing what the customer owes (or what you owe the supplier).

### Purchase (tax not included)

You buy a product for **500** net, plus 50 tax (10%). You owe the supplier a total of 550.

```mermaid
flowchart LR
    S["Supplier"]:::liability -- "500" --> E["Expense"]:::outgoing
    S -- "50" --> IT["Input Tax"]:::asset
```

| # | Amount | From | | To | Description |
|---|---|---|---|---|---|
| 1 | **500.00** | Supplier `Liability` | >> | Expense `Outgoing` | Product purchased |
| 2 | **50.00** | Supplier `Liability` | >> | Input Tax `Asset` | #vatin |

**Result:** Expense = 500, Input Tax = 50 (reclaimable), Supplier liability = 550

The tax transaction increases what you owe the supplier (liability goes up by 50) and creates a tax credit (Input Tax asset goes up by 50). When you pay, you settle the full 550.

### Sale (tax not included)

You sell a service for **600** net, plus 60 tax (10%). The client owes you a total of 660.

```mermaid
flowchart LR
    P["Product"]:::incoming -- "600" --> C["Client"]:::asset
    OT["Output Tax"]:::liability -- "60" --> C
```

| # | Amount | From | | To | Description |
|---|---|---|---|---|---|
| 1 | **600.00** | Product `Incoming` | >> | Client `Asset` | Service sold |
| 2 | **60.00** | Output Tax `Liability` | >> | Client `Asset` | #vatout |

**Result:** Revenue = 600, Output Tax = 60 (owed to government), Client receivable = 660

The tax transaction increases what the client owes you (receivable goes up by 60) and creates a tax liability (Output Tax goes up by 60). Revenue stays at 600 — the tax is the government's money, not yours.

## Settlement

At the end of a tax period, close the outstanding Input Tax and Output Tax balances. Offset the credits against the liability, then pay (or reclaim) the difference.

**Example:** Input Tax = 50 (credits), Output Tax = 60 (liability). You owe 10.

```mermaid
flowchart LR
    IT["Input Tax"]:::asset -- "50" --> OT["Output Tax"]:::liability
    B["Bank"]:::asset -- "10" --> OT
```

| # | Amount | From | | To | Description |
|---|---|---|---|---|---|
| 1 | **50.00** | Input Tax `Asset` | >> | Output Tax `Liability` | #settlement — offset credits |
| 2 | **10.00** | Bank `Asset` | >> | Output Tax `Liability` | #settlement — pay remaining |

After settlement, both Input Tax and Output Tax have zero balance.

---

You can automate tax-included transactions with the [Tax Bot](http://bkper.com/docs/guides/automations/tax-bot.md). The bot listens for posted transactions and automatically records the tax entry based on rates configured on your accounts or groups.

> **Caution**
> These are general and simplified examples of recording sales taxes. Always consult your local tax specialist on how to record sales taxes correctly in your bookkeeping.

---
source: /docs/guides/accounting-principles/modeling/multiple-currencies.md

# Multiple Currencies

When you work with multiple currencies, **keep a separate book for each currency**. How you structure the flow between books depends on your business processes, regulations, and local requirements. Some operations use intermediary accounts to track fees, taxes, and spread; others simply record mirror transactions in both books and reconcile exchange gains or losses periodically.

Regardless of your process, the principle is the same: one book per currency, linked through intercompany or operation accounts.

## Simple transfer example

Here is a straightforward remittance from Brazil to the United States.

### Book 1 — BRL

In the Brazilian book, the transfer moves funds from the local bank to an asset account representing the US operation:

| Date | Amount | From Account | | To Account | Description |
| --- | --- | --- | --- | --- | --- |
| 14/11 | 240.00 | Banco | >> | US Operation | Transfer to USA |

![Bkper BRL book showing a transaction from Banco to US Operation for 240.00](http://bkper.com/docs/_astro/multiple-currencies-1.Lmh8JipH.png)

The **US Operation** account is an asset — it represents money held abroad from the Brazilian perspective.

### Book 2 — USD

In the US book, the same transfer is recorded as funds arriving from the Brazilian operation:

| Date | Amount | From Account | | To Account | Description |
| --- | --- | --- | --- | --- | --- |
| 14/11 | 60.00 | Brazilian Operation | >> | Bank account | Transfer from Brazil |

![Bkper USD book showing a transaction from Brazilian Operation to Bank account for 60.00](http://bkper.com/docs/_astro/multiple-currencies-2.CcjJM3ay.png)

The **Brazilian Operation** account is a liability — it represents an obligation to the Brazilian entity from the US perspective.

You can later settle the intercompany balance by paying the Brazilian operation back, or clear the remaining balance as an outgoing expense or incoming revenue depending on exchange rate variations.

> **Note**
> This is a simplified example that reflects one possible process. Your actual setup may differ depending on regulations, intermediary banks, and how you handle exchange fees.
## Aggregating reports across currencies

You can consolidate the Balance Sheet and Profit & Loss statements from multiple currency books into a single report using the [Google Sheets Add-on](http://bkper.com/docs/guides/google-sheets.md).

![Diagram showing a US Dollar book and a Euro book both feeding data into a single Google Sheets report](http://bkper.com/docs/_astro/multiple-currencies-3.DBwt72hX.png)

## Tracking gains and losses from exchange variation

When you hold balances in multiple currencies, exchange rate fluctuations cause gains or losses over time. To track these periodically:

1. Fetch the relevant account balances from each book using the Google Sheets Add-on
2. Calculate the balance in the other currency using a formula like `=GoogleFinance("CURRENCY:USDEUR")`
3. Record the difference back to the book as incoming revenue (gain) or outgoing expense (loss)

![Diagram showing exchange rate data flowing through Google Sheets and back into a Bkper book as gain or loss transactions](http://bkper.com/docs/_astro/multiple-currencies-4.CnwbqhAr.png)

> **Tip**
> If you deal with many transfers and accounts across currencies, this process can become laborious. Consider automating it with the [Exchange Bot](http://bkper.com/docs/guides/automations/exchange-bot.md).

---
source: /docs/guides/accounting-principles/modeling/structuring-books-collections.md

# Structuring Books and Collections

## One Book per entity

The simplest way to use Bkper is with **one Book per entity**. An entity can be a company, department, individual, or any unit that operates within its own financial scope.

If you do not have a clear need for multiple units or operational segmentation, keeping one Book per entity is always preferable — it simplifies reconciliation and reduces overhead.

Still, the question often arises: when should you use more than one Book, or a Collection of Books?

## When to use more than one Book

Multiple Books are needed when your entity operates with more than one unit of measurement, or when your internal structure requires segmentation.

### Multiple units

Use a separate Book when the same entity tracks different units — for example:

- **Currencies** (USD, EUR, JPY)
- **Quantities and values** (inventory quantities alongside their monetary value)

A company operating in USD, EUR, and JPY would use three Books — one per currency. An entity tracking both inventory quantities and their financial value would use one Book for quantities and another for monetary value.

This separation ensures transaction consistency within each unit and enables accurate calculations such as gains, losses, or value changes.

### Internal segmentation

You may also split Books for organizational or managerial purposes:

- **Functional separation** — payables, receivables, HR
- **Access control** — giving different teams access only to relevant data (e.g., Department A and Department B)

Each part can be represented as a separate Book with its own permissions and scope. As operations scale, separating Books by department with tailored access becomes essential to maintain control and clarity.

## When to use a Collection

A [Collection](http://bkper.com/docs/core-concepts.md#collections) is a container for multiple Books that are logically related, typically belonging to the same entity or operational structure.

Collections help:

- **Simplify navigation** across related Books
- **Enable orchestrated automations** using Bkper Agents (Bots)

Collections are used in a wide range of real-world scenarios — from small startups operating in just two currencies, to large investment funds managing portfolios across 27 currencies — all under the same entity, organized through Books and Collections.

## Orchestrating automations with Bkper Agents

Bkper Agents operate within a Collection of Books to automate and synchronize operations.

### Portfolio Agent

The [Portfolio Agent](http://bkper.com/docs/guides/automations/portfolio-bot.md) tracks financial instruments such as stocks or bonds. It tracks both quantities and values, and computes unrealized results (market price changes) and realized results (gains and losses from operations). It works across Books — typically one for quantities and others for values.

### Exchange Bot

The [Exchange Bot](http://bkper.com/docs/guides/automations/exchange-bot.md) synchronizes balances and transactions between Books in different currencies. It tracks unrealized forex gains and losses and computes realized results on currency conversions. It is ideal for entities managing finances in multiple currencies under a unified structure.

### Inventory Bot

The [Inventory Bot](http://bkper.com/docs/guides/automations/inventory-bot.md) coordinates Books that track inventory quantities and inventory values (e.g., COGS, adjustments). It supports real-time inventory valuation and accurate COGS tracking.

### Subledger Bot

The [Subledger Bot](http://bkper.com/docs/guides/automations/subledger-bot.md) consolidates separate Books (e.g., payables, receivables, departments) into a central general ledger Book. Each subledger operates independently while the general ledger provides a consolidated view — keeping operations modular while unifying reporting.

---
source: /docs/guides/accounting-principles/modeling/tracking-departments-projects.md

# Tracking Departments, Projects, and Cost Centers

Managing multiple segments within your entity — whether departments, properties, projects, or cost centers — is a common need. You want to track how each segment performs financially while maintaining an organized view of your overall finances.

In Bkper, each Transaction moves an amount from one Account to another. You cannot record a single Transaction that splits across multiple departments the way traditional systems might handle multi-line entries. Instead, Bkper offers a flexible approach to track segments, adaptable to different scales and needs.

This guide presents several approaches — from very simple to more complex — helping you choose the right method for your situation.

## Hashtags — the simplest starting point

Record Transactions with [hashtags](http://bkper.com/docs/guides/using-bkper/hashtags.md) to segment your income and expenses while maintaining a single, clean Chart of Accounts organized by traditional financial categories.

Imagine you manage two rental properties: Lider and Prime. Instead of duplicating your Chart of Accounts for each property, you record Transactions like this:

```
01/15  2,500  Rent >> Tenant A #Lider
01/20  1,800  Rent >> Tenant B #Prime
01/22    300  Bank >> Maintenance #Lider
01/24    150  Bank >> Maintenance #Prime
```

Your Rent Account shows total rental income across all properties (4,300), while clicking `#Lider` instantly filters all Transactions for that property — showing rent recognized to Tenant A and 300 in maintenance expense. You can generate balance reports filtered by hashtag to see the financial performance of each segment.

### When to use hashtags

This approach works best when you have small to medium transaction volumes per segment and want simple, fast implementation. It is ideal when you want to avoid Chart of Accounts complexity and when reporting by segment is occasional rather than continuous.

### Advantages

Hashtags are very simple to implement and maintain. The approach scales easily as you add new departments or projects without changing your Chart of Accounts. Your Chart of Accounts remains clean and unified, making it fast to record Transactions. You can view balance totals filtered by hashtag, providing clear segment reporting.

### Limitations

Balance reporting for hashtags is limited to queries with up to 30,000 Transactions. Balance values are not automatically tied to hashtags — you need to generate reports to see segment balances. You cannot create sub-hierarchies or nested structures within hashtags.

> **Tip**
> See the [General Ledger Template](http://bkper.com/docs/guides/templates/general-ledger-template.md) for a working example of hashtag-based segment reporting. Also explore the [Search Assistant](http://bkper.com/docs/guides/using-bkper/search-and-queries.md#search-assistant) and [Query Guide](http://bkper.com/docs/guides/using-bkper/search-and-queries.md) for powerful filtering options.
## Accounts and Groups per segment

Create separate Accounts for each segment and use [Groups](http://bkper.com/docs/core-concepts.md#groups) to organize them for both segment-level and category-level views. This approach provides instant balance values for each segment through the Account structure.

For two properties, you create Accounts for each segment:

**From Accounts (green):**
- Rent_Lider
- Rent_Prime

**To Accounts (red):**
- Maintenance_Lider
- Maintenance_Prime

You can also create Groups organized by category. Since an Account can belong to different Groups in different hierarchies, the same Accounts can be grouped differently:

- **Income** (gray Group)
  - **Rent** (green Group) — Rent_Lider, Rent_Prime
- **Maintenance** (red Group) — Maintenance_Lider, Maintenance_Prime

> **Caution**
> In Bkper, Account and Group names are unique within a Book. You cannot create multiple "Rent" Accounts that exist independently under different parent Groups. Each Account name must be unique across the entire Book — this is why the example uses names like **Rent_Lider** and **Rent_Prime** rather than simply "Rent" in each property context.
A Group can only have one parent Group, meaning it exists in one hierarchy. However, Accounts can belong to multiple Groups in different hierarchies, giving you flexibility in how you view your data.

### When to use Accounts and Groups

This approach works well with moderate transaction volumes when you have a few segments that are relatively stable and do not change frequently. It is ideal when you need instant balance values per category (Expenses, Income) without generating separate reports, and when segment reporting is less critical to your operations.

### Advantages

Balance values are instantly available for each segment through Accounts, and consolidated balance values are instantly available through Groups. There is no transaction limit for balance reporting. The structure works well for stable organizational structures where segments remain consistent over time.

### Limitations

This approach creates a more complex [Chart of Accounts](http://bkper.com/docs/guides/using-bkper/chart-of-accounts.md) that requires careful maintenance. Adding new expense or income categories requires creating Accounts for all segments. The [Bkper Agent](http://bkper.com/docs/guides/automations/bkper-agent.md) autocomplete may struggle when you have similar Account names like Rent_Lider and Rent_Prime — it may need more context in your Transaction description to correctly allocate to the right Account.

## Separate hierarchies with dual organization

Build several Group hierarchies: ones organized by segment and another organized by traditional financial categories. This hybrid approach balances granular segment tracking with consolidated financial reporting.

Using the property example, you create the same segment-specific Accounts as above, but organize them into separate hierarchies:

**Hierarchy 1 — Property Lider:**
- **Lider Income** (gray Group) — Rent_Lider, Maintenance_Lider

**Hierarchy 2 — Property Prime:**
- **Prime Income** (gray Group) — Rent_Prime, Maintenance_Prime

**Hierarchy 3 — Financial Categories:**
- **Income** (gray Group)
  - **Revenue** (green Group)
    - **Rent** (green Group) — Rent_Lider, Rent_Prime
  - **Expenses** (red Group)
    - **Maintenance** (red Group) — Maintenance_Lider, Maintenance_Prime

This structure enables you to view financial performance both by individual property (Lider Income shows all income and expenses for that property) and by category (Rent Group shows total rental income across all properties).

While Accounts can belong to multiple Groups in different hierarchies, each Group can only have one parent. The Lider Income Group and the Income Group are separate hierarchies, both containing the Rent_Lider Account.

### When to use separate hierarchies

This approach works when you need both segment-level and category-level reporting perspectives. It suits operations with a moderate number of segments (typically 3–10) that have a stable structure. Use it when higher transaction volumes make the 30,000 Transaction hashtag limit restrictive.

### Advantages

You gain dual reporting perspectives, viewing your finances both by segment and by category. All balance values are instantly available without generating reports. There are no transaction limits. The structure provides flexible reporting across different dimensions of your operation.

### Limitations

This approach creates a complex Chart of Accounts. Creating new categories requires updates across all segments. You need careful planning of your hierarchy structure. The Group hierarchy limitations still apply — one parent per Group. The [Bkper Agent](http://bkper.com/docs/guides/automations/bkper-agent.md) autocomplete may also struggle with similar Account names.

## Separate Books with the Subledger Bot — most complex

Create a separate Book for each segment with its own complete Chart of Accounts, then use the [Subledger Bot](http://bkper.com/docs/guides/automations/subledger-bot.md) to consolidate all segment Books into one General Ledger Book. Each segment Book can have its own permissions, access controls, bank connections, language, and automations.

For the property example, create three Books:

- **Lider Book** — complete Chart of Accounts for this property
- **Prime Book** — complete Chart of Accounts for this property
- **General Ledger Book** — consolidated view of all properties

Record Transactions in each property Book using simple Account names:

**Lider Book:**
```
01/15  2,500  Rent >> Tenant A
01/17  2,500  Tenant A >> Bank
01/22    300  Bank >> Maintenance
```

**Prime Book:**
```
01/20  1,800  Rent >> Tenant B
01/23  1,800  Tenant B >> Bank
01/24    150  Bank >> Maintenance
```

The Subledger Bot automatically records these Transactions in the General Ledger Book. It consolidates segment-level Accounts into aggregated Accounts, so your General Ledger shows Rent as the consolidated total of the Rent_Lider and Rent_Prime Accounts — giving you individual property performance per property Book and total consolidated results in the General Ledger.

Each segment Book operates independently with its own Transaction history and Chart of Accounts. You can [share](http://bkper.com/docs/guides/using-bkper/book-sharing.md) the Lider Book with the property manager for Lider without giving them access to Prime data or the entire operation data. The General Ledger provides the consolidated financial view across all operations.

### When to use separate Books

This approach is designed for operations with a large number of segments and high transaction volumes. Use it when you need data separation between segments for different teams, confidentiality requirements, different bank connections, and slightly different operations per segment. It works well when different people manage different segments and should not see each other's data. The approach also shines when you want to use a template Book to quickly spin up new segments, and when you require advanced access control.

### Advantages

Separate Books provide clean data separation between segments. Each segment operates independently with its own scope. You gain granular access control, sharing each Book with different teams. Adding new segments is easy — copy your template Book and configure it. Balance values are available instantly in all Books with no transaction limits. The approach scales well for larger organizations where segments are more complex.

### Limitations

This approach has the **highest maintenance overhead**. Changes to your Chart of Accounts structure must be replicated to the General Ledger and other Books. The initial setup is more complex, requiring understanding of custom properties for the Subledger Bot. Reporting requires accessing multiple Books. You face additional overhead in consolidation management. The approach requires [Subledger Bot](http://bkper.com/docs/guides/automations/subledger-bot.md) installation and configuration.

## Which approach should you choose?

Start by asking yourself these questions:

**What is your transaction volume per segment?** If you have under 30,000 total Transactions to report per hashtag at once, hashtags work perfectly. Beyond that limit, use Accounts with Groups, Separate Hierarchies, or Separate Books.

**How often do your segments change?** For frequently changing segments, hashtags offer the most flexibility. With stable segments that rarely change, any approach works. For segments that never change, Separate Books provide the best scalability.

**Do you need instant balance values per segment?** If occasional reports are sufficient, hashtags work fine. If you need continuous monitoring with instant balance values, use Accounts with Groups, Separate Hierarchies, or Separate Books.

**Do different teams need different access?** If everyone sees everything, use hashtags, Accounts with Groups, or Separate Hierarchies. If you need confidential separation with different access levels, use Separate Books.

**How do segments differ operationally?** If segments operate differently, Separate Hierarchies or Separate Books best reflect those differences.

**How important is ease of recording?** If speed matters greatly, hashtags are fastest. If you are willing to be more careful with Account selection, Accounts with Groups work well. If accuracy matters more than speed, Separate Books provide the clearest structure.

> **Tip**
> Start as simple as you can — most likely with hashtags. As your operation grows and you reach the 30,000 Transaction limit or need more sophisticated reporting, migrate to Accounts with Groups or Separate Hierarchies. As you scale further or need access control, move to Separate Books. Bkper's flexibility allows you to evolve your approach as your needs change.
## Summary

Tracking multiple segments within your entity requires choosing the right organizational approach. **Hashtags** offer simplicity and speed. **Accounts and Groups** provide instant balance values with moderate complexity. **Separate Hierarchies** add dual reporting perspectives for growing reporting needs. **Separate Books** with the Subledger Bot deliver full separation and access control for operations with different teams and workflows.

Start simple, measure your needs, and evolve your approach as your understanding and operation grows. Bkper's flexibility ensures you can restructure your organization without losing historical data or disrupting ongoing operations.

---
source: /docs/guides/accounting-principles/owners-equity/capital-contributions.md

# Capital Contributions

A capital contribution is an act of giving money or assets to a company or organization.

There are two main types of contribution agreements. The first requires the business to take on a debt — essentially a [loan payable](http://bkper.com/docs/guides/accounting-principles/payables/loan-payable.md). The second lacks the characteristics of debt: there is no execution date, no interest, and the capital does not necessarily have to be paid back.

Capital contribution agreements are usually made with investors, but they can also come from someone interested in partnering with your company.

![Capital contribution accounts in Bkper showing investor contributions](http://bkper.com/docs/_astro/capital-contributions-1.D4Z-esaa.png)

Both types of contributions are represented by the **Liability** Account type, which holds a permanent "From Account" balance.

The key difference in how you record them in Bkper is that **non-debt agreements** are included in the [Equity](http://bkper.com/docs/guides/accounting-principles/fundamentals/balance-sheet-equity.md) Group, while **debt agreements** are not. Non-debt contributions increase the Equity of the business and should not appear as an account payable on the balance sheet. Debt-like contributions remain liabilities and are better grouped with other obligations, such as loans payable.

---
source: /docs/guides/accounting-principles/owners-equity/owners-withdrawal.md

# Owner's Withdrawal

The owner's withdrawal (or draw) account is essential for managing finances as a sole proprietor. Setting it up correctly in Bkper lets you track money taken out of the business for personal use while maintaining accurate financial records.

## Setting up the account

The owner's withdrawal account is a **liability type** account (yellow in Bkper) grouped under **Owner's Equity**.

> **Note**
> An owner's withdrawal account can alternatively be created as an asset type account (blue) representing a "receivable" to the company. However, since withdrawals directly reduce owner's equity on the Balance Sheet, it is more logical to include it in the Owner's Equity group as a liability type account.
## How it works

Owner's withdrawal accounts are **contra equity accounts** — they reduce the owner's equity, which from the company's perspective is a liability.

When you make a **capital contribution**, the movement flows from the owner's equity account to the bank account, increasing the owner's stake in the business.

When you make a **withdrawal**, the movement is reversed — from the bank account to the owner's withdrawal account, decreasing the owner's equity.

![Bkper chart of accounts showing Owner's Equity group with Owner's Draw and Owner's Contribution accounts](http://bkper.com/docs/_astro/owners-withdrawal-accounts.BPDaZ3Mh.png)

## Recording transactions

**Capital contribution** — adding funds to the business:

| Date | Amount | From Account | | To Account | Description |
| --- | --- | --- | --- | --- | --- |
| 01/09/2023 | 5,000.00 | Owner's Equity | >> | Bank Account | Capital contribution |

![Bkper transaction showing a capital contribution recorded from Owner's Equity to Bank Account](http://bkper.com/docs/_astro/owners-withdrawal-contribution.DaYfm6u8.png)

**Owner's draw** — withdrawing money for personal use:

| Date | Amount | From Account | | To Account | Description |
| --- | --- | --- | --- | --- | --- |
| 01/09/2023 | 2,000.00 | Bank Account | >> | Owner's Draw | Personal withdrawal |

![Bkper transaction showing an owner's withdrawal recorded from Bank Account to Owner's Draw](http://bkper.com/docs/_astro/owners-withdrawal-draw.Dx7UCerO.png)

---
source: /docs/guides/accounting-principles/owners-equity/retained-earnings.md

# Retained Earnings

Retained earnings is a component of owner's equity that represents net income reinvested in the business. By recording periodic results correctly, you can track how profits and losses accumulate on the balance sheet over time.

## Setting up the account

The retained earnings account is a **liability type** account (yellow in Bkper), grouped within **Owner's Equity**.

![Bkper account setup showing Retained Earnings as a liability type account within the Owner's Equity group](http://bkper.com/docs/_astro/retained-earnings-1.Di1qUXlR.png)

## Understanding the accounting

After an operating period, the financial result is either positive (profit) or negative (loss). That result can then be presented on the balance sheet through retained earnings as part of owner's equity.

![Balance sheet showing the difference between assets and liabilities plus owner's equity representing net income](http://bkper.com/docs/_astro/retained-earnings-2.5cHOMi-5.png)

### Transitioning the result to the balance sheet

Moving the periodic result from the income statement to the balance sheet via the retained earnings account presents accumulated results within owner's equity. The book itself remains balanced throughout.

![Diagram showing how the periodic result transitions from the income statement to the balance sheet through retained earnings](http://bkper.com/docs/_astro/retained-earnings-3.5XAfg4Or.png)

**Profits increase owner's equity** — A profit is recorded to the retained earnings account, growing the owner's stake in the business.

**Losses decrease owner's equity** — A loss is recorded from the retained earnings account, reducing the owner's stake.

## Sample transactions

An operating period that ends with a **profit** increases owner's equity:

| Date | Amount | From Account | | To Account | Description |
| --- | --- | --- | --- | --- | --- |
| 31/12/2023 | 10,000.00 | Income Summary | >> | Retained Earnings | Net income for the period |

![Bkper transaction recording a profit from Income Summary to Retained Earnings](http://bkper.com/docs/_astro/retained-earnings-4.RACg8iY3.png)

An operating period that ends with a **loss** decreases owner's equity:

| Date | Amount | From Account | | To Account | Description |
| --- | --- | --- | --- | --- | --- |
| 31/12/2023 | 5,000.00 | Retained Earnings | >> | Income Summary | Net loss for the period |

![Bkper transaction recording a loss from Retained Earnings to Income Summary](http://bkper.com/docs/_astro/retained-earnings-5.2DB77Y0Z.png)

> **Tip: Practical tips**
> - **Account type for the income summary** — You can use either an incoming or outgoing type account. For clarity, consider using an incoming type account (green) for profits and an outgoing type account (red) for losses.
> - **Exclude from the income hierarchy** — The income summary account should be omitted from the income hierarchy, since it would zero out the actual result.
> - **Keep things tidy** — Place the income summary account in the lower section of incoming and outgoing type accounts. Consider grouping summary accounts into one hidden group to keep the sidebar organized.

---
source: /docs/guides/accounting-principles/payables/accounts-payable.md

# Accounts Payable

Sometimes you incur expenses — ordering goods or services from suppliers — that you will not pay immediately. The payment may come later or even in installments. Accounts payable tracking in Bkper makes it easy to see exactly how much you owe each supplier at any time.

## Setting up supplier accounts

Create an intermediate **liability type** account (yellow in Bkper) for each supplier. All expenses you incur with that supplier are recorded from this account to the appropriate expense account, which increases the amount owed to that supplier.

## Recording expenses

When you receive goods or services from a supplier, record the expense from the supplier's payable account to the relevant expense account.

| Date | Amount | From Account | | To Account | Description |
| --- | --- | --- | --- | --- | --- |
| 01/01/2024 | 180.00 | Supplier A | >> | Office Supplies | Invoice #1001 |
| 05/01/2024 | 150.00 | Supplier A | >> | Raw Materials | Invoice #1002 |

![Bkper transactions showing expenses recorded to a supplier payable account, building a balance of 330](http://bkper.com/docs/_astro/accounts-payable-1.ClYjwKdj.png)

This generates a payable balance of 330.00 for the supplier — meaning you owe this amount. Attaching the invoice to each transaction is good practice for your records.

## Recording payments

When you pay the supplier, record a transaction from your asset account (bank or cash) to the supplier's payable account.

| Date | Amount | From Account | | To Account | Description |
| --- | --- | --- | --- | --- | --- |
| 15/01/2024 | 330.00 | Bank Account | >> | Supplier A | Payment invoices #1001 #1002 |

![Bkper transaction showing a payment that clears the supplier's payable balance](http://bkper.com/docs/_astro/accounts-payable-2.DILpkj5C.png)

This clears the payable balance with that supplier — you no longer owe them.

> **Tip: Practical tips**
> - **One account per supplier** — Create as many supplier accounts as you need. Each one independently tracks how much you owe that supplier.
> - **Partial payments** — You can record partial payments and reference the invoice numbers to track exactly which invoices have been settled.
> - **At a glance** — The balance on each supplier account always shows the current amount owed, giving you a real-time view of your total payables.

---
source: /docs/guides/accounting-principles/payables/loan-payable.md

# Loan Payable

A loan payable is a **liability account** (yellow in Bkper) used to track the amount you owe to a lender, including the interest that accrues over time.

**Example:** Your business takes out a **$100,000** loan from a bank at 7% annual interest.

Before recording, it helps to understand two key components:

- **Principal** — The original sum borrowed. If you repay a $10,000 loan in 10 installments, $1,000 of each installment corresponds to principal.
- **Interest** — The cost of borrowing, expressed as a percentage of the principal over a period. At 5% annual interest on $10,000, the yearly interest is $500.

## Setting up accounts

You need four accounts to track a loan properly:

- **Asset account** (Bank or Cash) — Where the loan proceeds become available.
- **Liability account** (Loan Payable) — Tracks the outstanding loan balance.
- **Expense account** (Interest Expense) — Tracks the cost of borrowing.
- **Asset account** (Loan Payment) — Splits each payment into principal and interest portions, making it easier to reconcile with bank and loan statements.

![Bkper chart of accounts showing the four accounts needed for tracking a loan: Bank, Loan Payable, Interest Expense, and Loan Payment](http://bkper.com/docs/_astro/bkper-loan-payable-accounts.Bm0PWDFp.png)

## Recording the loan

Record the initial loan amount as a movement from the Loan Payable account to the Bank account:

| Date | Amount | From Account | | To Account | Description |
| --- | --- | --- | --- | --- | --- |
| 01/01/2024 | 100,000.00 | Loan Payable | >> | Bank Account | Loan received |

![Bkper transaction showing the initial loan recorded from Loan Payable to Bank Account](http://bkper.com/docs/_astro/bkper-loan-payable-loan.D1SkJFwT.png)

## Recording payments

Each periodic payment involves separating the principal repayment from the interest expense:

**Record the total monthly payment** from the Bank to the Loan Payment account. Then split the Loan Payment into its two components:

| Date | Amount | From Account | | To Account | Description |
| --- | --- | --- | --- | --- | --- |
| 01/02/2024 | 1,500.00 | Bank Account | >> | Loan Payment | Monthly payment #loan |
| 01/02/2024 | 917.00 | Loan Payment | >> | Loan Payable | Principal repayment #loan |
| 01/02/2024 | 583.00 | Loan Payment | >> | Interest Expense | Interest portion #loan |

![Bkper transactions showing a loan payment split into principal and interest portions](http://bkper.com/docs/_astro/bkper-loan-payable-installments.BjakOYEe.png)

> **Tip: Practical tips**
> - **Hashtags** — Use a hashtag like `#loan` to easily filter loan transactions from other entries.
> - **Cash flow** — Record future loan payments to identify potential cash-flow issues ahead of time.
> - **Tax implications** — In many regions, interest expenses on business loans are tax-deductible, making it important to separate principal from interest. Consult your tax advisor for specific guidance.

---
source: /docs/guides/accounting-principles/receivables/accounts-receivable.md

# Accounts Receivable

Sometimes you generate revenue — by invoicing a customer, for example — but the customer does not pay right away. Payment may come later, even in installments. Accounts receivable tracking in Bkper lets you see exactly how much each customer owes you at any time.

## Setting up customer accounts

Create an intermediate **asset type** account (blue in Bkper) for each customer. Revenue you earn from that customer is recorded from the income account to this receivable account, which increases the amount the customer owes you.

## Recording revenue

When you invoice a customer, record the revenue from the appropriate income account to the customer's receivable account.

| Date | Amount | From Account | | To Account | Description |
| --- | --- | --- | --- | --- | --- |
| 01/01/2024 | 1,000.00 | Sales Revenue | >> | Customer A | Invoice #2001 |
| 15/01/2024 | 2,000.00 | Sales Revenue | >> | Customer A | Invoice #2002 |

![Bkper transactions showing invoiced revenue recorded to a customer receivable account, building a balance of 3,000](http://bkper.com/docs/_astro/accounts-receivable-1.D-uIrlc5.png)

This generates a total receivable balance of 3,000.00 — the amount the customer owes you. Attaching the invoice to each transaction is good practice for your records.

## Recording payments received

When the customer pays you, record a transaction from the customer's receivable account to your asset account (bank or cash).

| Date | Amount | From Account | | To Account | Description |
| --- | --- | --- | --- | --- | --- |
| 01/02/2024 | 3,000.00 | Customer A | >> | Bank Account | Payment invoices #2001 #2002 |

![Bkper transaction showing a customer payment that clears the receivable balance](http://bkper.com/docs/_astro/accounts-receivable-2.Dyph13FC.png)

This clears the receivable balance for that customer — they no longer owe you.

> **Tip: Practical tips**
> - **One account per customer** — Create as many customer accounts as you need. Each one independently tracks how much that customer owes.
> - **Partial payments** — Record partial payments and reference the invoice numbers to track exactly which invoices have been settled.
> - **At a glance** — The balance on each customer account always shows the current amount owed, giving you a real-time view of your total receivables.

---
source: /docs/guides/accounting-principles/receivables/aging-accounts-receivable.md

# Aging Accounts Receivable

Aging is the process of categorizing accounts receivable by time periods. It shows how long you have held an asset or how long a bill has gone unpaid — giving you a clear picture of which customers are current and which are overdue.

## Setting up receivable accounts

The first step is to create a [receivable account](http://bkper.com/docs/guides/accounting-principles/receivables/accounts-receivable.md) for each customer you want to track.

![Creating a receivable account for a customer in Bkper](http://bkper.com/docs/_astro/aging-accounts-receivable-1.BD3_Y9UE.png)

Imagine you sold a product to two customers — John will pay in two installments and Kate will pay at once.

## Recording the sales

Record the products or services you sold, which builds up the receivable balance for each customer.

![Recording sales transactions to customer receivable accounts](http://bkper.com/docs/_astro/aging-accounts-receivable-2.BqOl5Wt4.png)

## Scheduling expected payments

If you want planned collections to appear on the timeline, you can record future-dated payment transactions at the dates you anticipate receiving them. Treat these as expected settlements, not proof that cash has already been collected, and update or remove them if the customer pays a different amount or on a different date.

![Expected payment transactions scheduled at future dates](http://bkper.com/docs/_astro/aging-accounts-receivable-3.B8OZjkt4.png)

## Monitoring collection status

Check whether you received all payments by reviewing the receivable balance. A zero balance means the customer has paid in full, while an outstanding balance tells you exactly how much is still owed and for how long.

![Checking the receivable balance to track payment status](http://bkper.com/docs/_astro/aging-accounts-receivable-4.BLxxWaeB.png)

> **Tip**
> By keeping one receivable account per customer, you can see at a glance who has paid, who is overdue, and by how much — making follow-up straightforward.

---
source: /docs/guides/accounting-principles/receivables/loan-receivable.md

# Loan Receivable

A Loan Receivable is a type of [account receivable](http://bkper.com/docs/guides/accounting-principles/receivables/accounts-receivable.md) where you track all the money owed to you by someone you lent money to, plus the interest revenue generated periodically by the outstanding balance.

In this example, imagine you loan $100 to John at a 10% interest rate.

## Setting Up the Accounts

Start by creating an **Asset** Account to track the outstanding loan balance, and an **Incoming** Account to track the interest revenue:

![Asset account for the loan balance and Incoming account for interest revenue](http://bkper.com/docs/_astro/loan-receivable-1.-XsKdGyD.png)

## Recording the Loan

Record the initial loan amount as a transaction moving resources from your bank to the loan receivable Account:

![Recording the loan of 100 from Bank to John Loan Receivable](http://bkper.com/docs/_astro/loan-receivable-2.2NgHyENR.png)

## Recording Interest

Record interest periodically (usually monthly) as it accrues on the outstanding balance:

![Recording periodic interest on the loan receivable](http://bkper.com/docs/_astro/loan-receivable-3.DijFdAt7.png)

> **Tip**
> To calculate and record interest periodically, you can use the [Bkper Add-on for Google Sheets](http://bkper.com/docs/guides/google-sheets.md).

---
source: /docs/guides/automations/apps-and-bots.md

# Apps & Bots

![Bkper Apps and Bots for automating bookkeeping tasks](http://bkper.com/docs/_astro/automate-tasks-1.Banj0GTL.png)

Bkper Apps and Bots take care of repetitive bookkeeping so you can focus on decisions instead of data entry. Once installed on a book, they listen for events — a transaction posted, checked, or edited — and react automatically, without manual intervention.

## Apps vs Bots

**Bots** are event-driven automations. They run silently in the background and react to activity in your books — recording tax entries, mirroring transactions, or updating inventory every time a relevant transaction is checked.

**Apps** provide a user interface alongside their automation. They add menu items to your book and may also handle events, but they're designed to be interacted with directly — not just to run in the background.

In practice, the distinction rarely matters when choosing what to use. Browse what's available and pick what solves your problem.

> **Note**
> Bots run on behalf of the user who installed them. Their actions are logged in your book's activity history, and any errors are flagged for your review.

### Bkper Agent

The [Bkper Agent](http://bkper.com/docs/guides/automations/bkper-agent.md) automates bookkeeping using AI. It handles two things: parsing documents (invoices, receipts, bank statements) into draft transactions, and intelligently categorizing transactions by learning from your bookkeeping history. The more you use it, the more accurate it becomes.

### Exchange Bot

The [Exchange Bot](http://bkper.com/docs/guides/automations/exchange-bot.md) handles multi-currency accounting. It automatically mirrors transactions across currency books and calculates unrealized foreign exchange gains and losses — essential if you operate in more than one currency.

### Tax Bot

The [Tax Bot](http://bkper.com/docs/guides/automations/tax-bot.md) calculates and records tax entries automatically. When you post a purchase or sale transaction, it applies the configured tax rates and creates the corresponding tax account entries — no manual calculation required.

### Subledger Bot

The [Subledger Bot](http://bkper.com/docs/guides/automations/subledger-bot.md) keeps subsidiary books and a general ledger in sync. Transactions recorded in subledger books are automatically consolidated into the parent book, giving you both detailed records and a consolidated view.

### Portfolio Bot

The [Portfolio Bot](http://bkper.com/docs/guides/automations/portfolio-bot.md) tracks financial instruments — stocks, bonds, funds, or any asset with a quantity. It calculates realized profits and losses using FIFO, and supports periodic revaluations to reflect current market prices.

### Inventory Bot

The [Inventory Bot](http://bkper.com/docs/guides/automations/inventory-bot.md) tracks physical inventory quantities and calculates cost of goods sold using FIFO. It bridges your Financial Books (which track money) with a dedicated Inventory Book (which tracks units), keeping both in sync automatically.

## Working with bots

Each bot is configured through [properties](http://bkper.com/docs/guides/using-bkper/properties.md) on your accounts, groups, or book. The specific properties required are documented in each bot's guide.

Once installed, bots work silently. Their responses appear in your book's activity history — you can view what each bot did, and replay or investigate any errors directly from the activity panel.

> **Tip: Need something custom?**
> The available bots cover the most common automation needs. If your workflow requires something that doesn't exist yet, you can build your own event-driven app on the Bkper Platform. See the [Build](http://bkper.com/docs/build.md) section to get started.

---
source: /docs/guides/automations/automations-portal.md

# Automations Portal

The Automations Portal is where you find, install, and manage all available Apps, Bots, and Bank Connections for your Bkper books.

The portal is organized into sections for discovering new automations and managing existing ones:

- **Apps** — tools like the Google Sheets add-on and CSV Import/Export
- **Bots** — automated agents like the Exchange Bot, Tax Bot, and Subledger Bot
- **Bank Connections** — links to your banking institutions
- **User Connection** — your personal authorization status across all automations
- **Book Integration** — the automations configured on the current book

## Accessing the Automations Portal

The portal is accessed from within any book. Open your book, click the Settings menu (gear icon), and select **Automations**.

![Accessing the Automations Portal from the book settings menu](http://bkper.com/docs/_astro/automations-portal-1.BL6z1Ybq.png)

From the **Apps** or **Bots** tab, open the automation you want and click **Install** to add it to your book.

## User connections vs. book integrations

A **User Connection** represents the authorization link between your user account and an App, Bot, or Bank Connection. A single connection can be used across many books.

A **Book Integration** represents the configuration of an automation on a specific book. You can have different configurations per book while sharing the same user connection.

## User connections

The User Connection tab shows all automations connected to your user account, regardless of which book you are viewing.

![User connections list showing connected automations](http://bkper.com/docs/_astro/automations-portal-2.BJRUjhtG.png)

Clicking a **Connected** automation lets you revoke authorization by clicking **Disconnect**. Disconnecting immediately stops the automation on all books where it was configured.

![Disconnecting an automation to revoke authorization](http://bkper.com/docs/_astro/automations-portal-3.DdwL1LPH.png)

Clicking a **Disconnected** automation lets you reauthorize it by clicking **Reconnect**.

![Reconnecting a previously disconnected automation](http://bkper.com/docs/_astro/automations-portal-4.C2i8gOku.png)

> **Note**
> If you collaborate on a shared book that has a Bank Connection, you will not see that connection on your User Connections — it was authorized by the book owner. Bots that only access Bkper (without additional authorization scopes) are also not listed here, since they use the Bkper authorization itself.
## Book integrations

The Book Integrations tab shows all automations configured on the current book. Click any automation to view its configuration details.

![Book integrations showing configured automations and their details](http://bkper.com/docs/_astro/automations-portal-5.UYx8GO3Z.png)

- **Bank configurations** define which Bkper account receives the recorded transactions from the bank connection.
- **Bot and App configurations** show the configuration reference. Click **Remove** to detach an automation from the book — this does not revoke the user connection or affect other books.

---
source: /docs/guides/automations/bank-connections.md

# Bank Connections

Bkper Bank Connections let you connect directly to your financial institution — banks, credit card operators, credit unions, and more — and record transactions in your Book as they happen at the institution.

Bkper integrates with institutions in **North America and Europe** via [Plaid](https://plaid.com/) and in **Brazil** via [Pluggy](https://pluggy.ai/en).

## How Bank Connections work

A Bank Connection consists of three parts:

**User Connection** — the authentication and authorization step where a user connects to a financial institution. The user controls the credentials and can disconnect at any time.

**Book Integration** — the configuration that tells Bkper which Account in which Book should receive the transaction data from the financial institution.

**Post Transactions** — once the integration is active, transactions from the institution are recorded in your Book.

This separation is important for professional workflows. For example, a client can create the User Connection — keeping credentials private — while their bookkeeper or CPA integrates that connection with a specific Account in a shared Book.

## Create a Bank Connection

To create a new Bank Connection, open your Book and navigate to the **Settings menu** (⚙️). Select **Automations**, then click **Banks** in the left panel. Choose your country (highlighted in green) and select your bank from the list. Complete the authentication and authorization flow — this process varies by country and institution.

> **Note**
> A video tutorial is available: [Create a Bank Connection](https://youtu.be/wIVIZ_R9kj8?si=sTS52syFD_DvPhSQ&t=66).
Once authenticated, your User Connection is established. The next step is to integrate the connection with a Book so that transactions start flowing into your Accounts.

## Integrate with a Book

After creating a User Connection, integrate it with a Book so that transactions from your financial institution are recorded in the right Account.

Open your Book and go to **Settings** (⚙️) → **Automations**. Click **User Connections** in the left panel, then select the connection you want to integrate.

![Selecting a User Connection in the Automations portal](http://bkper.com/docs/_astro/integrate-with-book-1.D46yH6wj.png)

Click **Link Account** next to the specific account at your financial institution.

![Clicking Link Account to start the integration](http://bkper.com/docs/_astro/integrate-with-book-2.BK6G_Oy0.png)

Select or create the **Account** in your Book that should receive the transactions, choose the **period** of historical data to retrieve, and press **Save**.

![Configuring the Account and period for the bank integration](http://bkper.com/docs/_astro/integrate-with-book-3.vYDtrTK9.png)

> **Note**
> A video tutorial is available: [Integrate a Bank Connection with your Book](https://youtu.be/wIVIZ_R9kj8?si=kngwSYXq1RJrU2Xo&t=159).
> **Caution**
> It can take up to 48 hours for transactions to appear in your Book after creating an integration. The larger the historical period you select, the longer it may take for the data to arrive. Some financial institutions do not support historical data — in that case you need to [import the data manually](http://bkper.com/docs/guides/using-bkper/data-import-export/import-data.md).
## Reconnect

If a Bank Connection has been disconnected — whether intentionally or due to a session expiration — you can reconnect it from the [Automations portal](http://bkper.com/docs/guides/automations/automations-portal.md).

Open your Book and go to **Settings** (⚙️) → **Automations**. Click **User Connections**, select the disconnected bank, and click the **Reconnect** button.

![Clicking the Reconnect button on a disconnected bank connection](http://bkper.com/docs/_astro/reconnect-1.BZn4Y8U8.png)

> **Tip**
> To prevent duplicate transactions, always use the **Reconnect** button on the original connection rather than creating a new one.
## Remove an integration

Removing an integration stops transactions from a specific financial institution account from being recorded in your Book. The User Connection itself remains active, so you can re-integrate it later or use it with a different Book.

Open your Book and go to **Settings** (⚙️) → **Automations**. Click **Book Integrations**, select the bank or credit card you want to remove, and click **Remove**.

![Removing a bank integration from a Bkper Book](http://bkper.com/docs/_astro/remove-integration-1.DeJp-HQR.png)

> **Note**
> Removing an integration does not delete any transactions that have already been recorded in your Book. It only stops new transactions from being synced.
## Disconnect

When you no longer need a connection to a financial institution, you can disconnect it entirely from the [Automations portal](http://bkper.com/docs/guides/automations/automations-portal.md).

Open your Book and go to **Settings** (⚙️) → **Automations**. Click **User Connections** in the left panel and select the Bank Connection you want to remove.

![Selecting the Bank Connection to disconnect](http://bkper.com/docs/_astro/disconnect-1.xoPZg2Kv.png)

Click **Disconnect**.

![Clicking the Disconnect button](http://bkper.com/docs/_astro/disconnect-2.DoBq5t81.png)

Confirm by clicking **Yes**.

![Confirming the disconnection](http://bkper.com/docs/_astro/disconnect-3.UGq336Sa.png)

> **Caution**
> All Book Integrations linked to this User Connection will be removed as well. If you only want to stop syncing transactions to a specific Book, [remove the integration](#remove-an-integration) instead.
## Troubleshooting

If you are experiencing issues connecting or reconnecting your bank to Bkper, try the suggestions below.

### Transactions are not arriving

**Wait a little.** After creating your first Book integration, it typically takes some time for transactions to appear.

**Resave the historical period.** Go to **Settings** (⚙️) → **Automations** → **Book Integrations**, select the integration, choose a new historical period, and click **Save Configuration**.

[Image: Animated walkthrough of resaving the historical period in Book Integrations]

### Could not connect to your institution

**Invalid credentials** — double-check the username and password you entered. Extra spaces, incorrect capitalization, and punctuation errors are the most common causes.

**Temporary technical problems** — the financial institution may be experiencing downtime. Try again later.

### Transactions stopped syncing

After a period of working smoothly, your Bank Connection may stop recording transactions. This can happen due to technical issues, periodic disconnections, or security measures enforced by your bank.

To re-establish the connection:

1. **Remove the integration** — go to **Settings** (⚙️) → **Automations** → **Book Integrations**, select the bank account that stopped syncing, and click **Remove**.
2. **Disconnect the User Connection** — still in Automations, go to **User Connections**, select the connection, and click **Disconnect**.
3. **Create a new connection** — follow the steps in [Create a Bank Connection](#create-a-bank-connection).
4. **Integrate with your Book** — follow the steps in [Integrate with a Book](#integrate-with-a-book).

This process refreshes the integration and ensures that the connection is correctly established.

> **Tip**
> If the issue persists after trying these steps, contact Bkper support with the name of your financial institution so the team can investigate. You can also check directly with your bank whether they have any known issues with third-party connections.

---
source: /docs/guides/automations/bkper-agent.md

# Bkper Agent

![Bkper Agent](http://bkper.com/docs/_astro/bkper-agent-1.CKNuCz-0.png)

The Bkper Agent automates the tedious parts of bookkeeping by combining two powerful capabilities: intelligent data parsing and smart categorization.

## Installation

Open your [Bkper account](https://app.bkper.com/) and the book where you want to use the Agent. Click the Settings button (gear icon), select **Automations**, find the Bkper Agent, and click **Install**.

## Document parsing

The Agent interprets data and correctly categorizes it into transactions, whether it comes from Google Sheets, Bank Connections, or file uploads.

This power is especially evident when uploading documents. Drag and drop an invoice, receipt, or bank statement (as an image or PDF) directly into your book, and the Agent performs parsing and categorization in one seamless action. It extracts dates, amounts, and descriptions while referencing your book history and learning from your patterns to apply the correct accounts.

The result is a list of fully populated and categorized draft transactions ready for your review — whether from a single receipt or a multi-page bank statement.

### Supported document types

**Bank Statements and Credit Card Statements** — extracts multiple transactions from a single statement, supports CSV files and scanned/photographed statements, and automatically organizes transactions by date.

**Invoices** — extracts a single transaction with vendor or customer details, identifies invoice numbers, dates, and amounts, and captures custom fields like tax amounts.

**Receipts** — extracts purchase details and amounts, identifies merchant names and transaction dates. Ideal for expense tracking.

> **Note**
> The Agent reads PDF, CSV, and image files.
### Uploading files to your book

Select the Account related to the file you are uploading — for example, select the *Brex Cash* account when uploading a Brex statement. Then drag and drop the file (PDF, image, or CSV) into the transaction area.

The Agent processes the file, records draft transactions, and completes the other account based on transaction history in the book. Review and post the transactions.

> **Note**
> For bank statements and CSV files, the Agent creates multiple draft transactions (one per line item). For invoices, it creates a single draft transaction.
### Attaching files to existing transactions

Drag and drop a file directly onto an existing transaction. The Agent extracts data and updates the transaction with the extracted details — perfect for adding invoices to expense entries or attaching receipts for documentation.

### How the Agent learns and improves

The Agent gets smarter over time through a process called Agentic Context Engineering (ACE).

**What the Agent learns from:**
- Your existing transactions — analyzing patterns in your transaction history
- Your corrections — when you edit AI-extracted data, the Agent learns what's correct
- Your account structure — understanding how you organize your chart of accounts

**How corrections work:**
1. Edit the transaction as needed (change amount, date, description, or accounts)
2. Post the corrected transaction
3. The Agent flags the extraction for improvement
4. Behind the scenes, it analyzes what went wrong and updates its extraction instructions
5. Future documents are processed with improved accuracy

This learning happens automatically — no configuration required.

### Smart account discovery

When extracting transactions, the Agent automatically suggests From and To accounts by:

- Analyzing transaction descriptions and extracting key terms
- Searching transaction history for similar patterns
- Matching based on past behavior (e.g. "Uber" always goes to *Transport Expense*)
- Learning from the creator (your patterns vs. team members' patterns)

The more you use Bkper, the better the Agent becomes at finding the right accounts.

### Advanced configuration

While the Agent works well out of the box, you can customize its behavior for specific use cases.

**Custom extraction instructions** — add an `agent_prompt` property to accounts or groups to control how the Agent extracts data. For example, on a *Bank Statement - Chase* account:

- **Key:** `agent_prompt`
- **Value:** `Extract transactions from the statement table. Include the reference number as a custom property called "ref". Extract merchant category if available.`

**Centralized prompt configuration** — for teams managing multiple books, store extraction instructions in a central "prompt book":

1. Create a dedicated book for storing prompts (e.g. *Company Extraction Rules*)
2. In your operational book, add a book property: `agent_prompt_book_id` with the ID of your prompt book

This maintains consistent extraction rules across all your books.

**Account-specific prompts** — match prompts from the remote book using `agent_prompt_id`:

- **Key:** `agent_prompt_id`
- **Value:** Name or ID to match in the remote prompt book

Useful when different statement types (bank, credit card) need different extraction rules.

### Best practices

**For bank statements:**
- Upload regularly (monthly or weekly)
- Select the bank account before uploading for better account discovery
- Review and post draft transactions in batch
- Correct any errors — the Agent learns from them

**For invoices and receipts:**
- Select the related account before uploading
- Upload immediately after receiving
- Clear, readable scans produce the best results
- Add custom properties if you need specific fields extracted

**For maximum accuracy:**
- Post transactions regularly so the Agent has more data to learn from
- Be consistent with account names and transaction descriptions
- Correct mistakes immediately to trigger learning
- Use groups to organize accounts by document type

### Workflow example

**First upload:** Select the Bank Account, drag in a statement. Most accounts are likely missing (the Agent is learning). Assign accounts manually and post.

**Second upload:** The Agent auto-assigns accounts for roughly 60% of transactions. Review and correct the rest.

**Third upload:** The Agent handles roughly 85% of transactions. Only minor corrections needed.

**Ongoing:** The Agent correctly extracts 95%+ of transactions. Quick review and post — bookkeeping in minutes.

### Monitoring Agent performance

The Agent stores metadata on each transaction:

- `agent_extracted_` — original AI extraction (before corrections)
- `agent_credit_account_id_` / `agent_debit_account_id_` — discovered accounts
- `agent_description_part_` — key terms used for discovery
- `agent_file_id_` — links transaction to source document

View these properties in transaction details to understand how the Agent processed each entry.

### Troubleshooting

**Agent didn't extract anything** — verify the Agent is installed (Settings > Automations), check file format (PDF, image, or CSV), and ensure the file is readable.

**Extracted data is incorrect** — correct the transaction and post it. The Agent learns from your correction and improves future extractions.

**Accounts not auto-assigned** — normal for new books with limited history. Keep posting transactions so the Agent has data to learn from. Try selecting an account before uploading.

**Same mistakes keep happening** — make sure you're posting corrected transactions (not just viewing). The Agent learns incrementally — give it a few correction cycles.

### Privacy and security

- File processing uses Google Gemini AI with enterprise-grade security
- Files are processed through Cloudflare's AI Gateway for additional protection
- Your data never trains public AI models — it only improves your private Agent
- Files are stored securely in your Bkper book and can be deleted at any time
- The Agent learns per book, so each learning path is unique

## Categorization: finding the right accounts

Once transaction information is available — from a document or any other source — the Agent completes the transaction by assigning From and To accounts. This happens automatically based on patterns from your bookkeeping history.

The Agent follows a logical sequence, checking each method in order and stopping as soon as it finds a match:

**Explicit account names in the description.** If you write `Bank Household rent 1900` and both *Bank* and *Household* accounts exist in your book, the Agent assigns them as the From and To accounts respectively. The first account becomes the From Account (where money comes from), and the second becomes the To Account (where money goes to).

**Matching descriptions.** When you've previously recorded `Bank Household rent 1900` and later enter just `rent 2000`, the Agent recognizes the description and applies the same accounts.

**Matching hashtags.** If you've used a hashtag like `#rent` in a previous transaction, you can enter `#rent 2000` and the Agent applies the same accounts associated with that hashtag.

**Location (mobile).** When you record a transaction at a physical location and later return to that same place, you only need to enter the amount — the Agent remembers the accounts you used there before.

Every action the Agent takes appears in your activity history, creating a transparent record of the automation at work.

## Ignoring unwanted text

Sometimes descriptions include information you want to keep but don't want the Agent to process — like timestamps or reference numbers. Wrap text in quotes to tell the Agent to ignore it for matching purposes.

For example, `10 Gas "at 10:56"` causes the Agent to use only "10 Gas" for finding accounts, while the complete description including "at 10:56" is saved with the transaction. This is especially useful when integrations automatically append metadata.

---
source: /docs/guides/automations/csv-export-app.md

# CSV Export App

> **Caution**
> The CSV Export App has been deprecated.
To export data in CSV format, use the [Bkper Add-on for Google Sheets](http://bkper.com/docs/guides/google-sheets.md) to fetch your data into a spreadsheet, then download it as a CSV file from Google Sheets.

To import CSV data, simply [drag and drop](http://bkper.com/docs/guides/using-bkper/drag-and-drop.md) the CSV file into the Transactions area of your Book. Each row in the file is recorded as an individual draft, and the **Bkper Agent** completes the transactions based on your Book's history and Account structure.

---
source: /docs/guides/automations/exchange-bot.md

# Exchange Bot

The Exchange Bot keeps balance values of accounts across multiple currencies in sync with every transaction — no manual replication or batch processes required.

It can also calculate unrealized FX gains and losses at any moment from the perspective of any operating currency, giving you tighter control over foreign exchange risk.

## Multiple currency accounting

To track finances in multiple currencies, create a separate Bkper book for each currency with a name and currency suffix (e.g. *MyBusiness USD*, *MyBusiness EUR*, *MyBusiness JPY*) and place them all in one [collection](http://bkper.com/docs/core-concepts.md#collections) named without the suffix (e.g. *MyBusiness*).

![Multiple currency books organized in a Bkper collection](http://bkper.com/docs/_astro/exchange-bot-1.Ci2jodgx.png)

Install the Exchange Bot on every book in the collection and set the required properties on each book.

## Transaction mirroring

![Diagram showing how transactions are mirrored across currency books](http://bkper.com/docs/_astro/exchange-bot-2.DI5WUi4N.png)

Once the Exchange Bot is installed and book properties are set, transactions posted in one currency are automatically mirrored in the other currency books at the exchange rate at the time of posting.

![A transaction mirrored from USD to EUR and JPY](http://bkper.com/docs/_astro/exchange-bot-3.q1Rcso6F.png)

Transaction properties can override the fetched exchange rate when the actual rate differs — common with international wire transfers.

## FX gains and losses

The Exchange Bot menu (accessible from **More** on any book in the collection) runs an exchange update process. This calculates and records foreign exchange gains or losses on your assets according to real-time rates.

![Exchange Bot calculating FX gains and losses](http://bkper.com/docs/_astro/exchange-bot-4.DBH7YQfc.png)

The bot records exchange differences in liability accounts with the same name as the permanent account plus an **EXC** suffix. These accounts are created automatically.

> **Note**
> When the Exchange Bot works alongside the [Portfolio Bot](http://bkper.com/docs/guides/automations/portfolio-bot.md), unrealized and realized FX gains and losses for traded assets are recorded in incoming-type accounts (due to their trading nature) rather than liability accounts.
## Exchange Bot status

- **Gray icon** — working properly
- **Red icon** — error
- **No icon** — not installed

## How the Exchange Bot works

The flow for a single transaction:

1. You post a transaction in one currency book (e.g. USD): `100 Bank Account >> Accounts Payable`
2. The post event triggers the Exchange Bot, which determines which other currencies need this transaction.
3. The bot fetches current exchange rates.
4. The bot posts the same transaction in the other book(s) converted to each currency (e.g. EUR): `98.50 Bank Account >> Accounts Payable`

### Books and collection

Create at least two currency books, add them all to one Bkper [collection](http://bkper.com/docs/core-concepts.md#collections), and [install](http://bkper.com/docs/guides/automations/apps-installation.md) the Exchange Bot on every book.

> **Note**
> If your books are already in a collection for the Portfolio Bot or any other bot, you do not need a separate collection — the same one works.
### Accounts

Create a chart of accounts in each book representing all your assets and liabilities across currencies. For example, if you have a Citi Bank account in the USA and a Deutsche Bank account in Europe, create both accounts in both the USD and EUR books. The European bank balance in the USD book is represented in USD value, and vice versa.

> **Note**
> Exchange gain and loss accounts (realized and unrealized) are created automatically by the bot when you run Exchange Gain/Loss from the context menu.
### Groups

Optionally, create groups for each currency and place all accounts that should be mirrored into that group. This simplifies managing which accounts participate in multi-currency replication. See group configuration below.

### Book properties

Set the `exc_code` property on every currency book in the collection:

```
exc_code: USD
```

```
exc_code: EUR
```

```
exc_code: JPY
```

### Group properties

Group properties are optional. The Exchange Bot generally matches accounts by name across books. Adding an `exc_code` to a group ensures its accounts are replicated in the correct currencies:

```
exc_code: USD
```

### Transaction properties

Transaction properties are optional but allow you to override fetched exchange rates — useful when the actual rate differs from the market rate:

```
exc_code: USD
exc_amount: 1200
```

The `exc_code` specifies which currency to override, and `exc_amount` indicates the correct amount. For example, when wiring money from a European bank to a USD account, you specify that the exact amount in the target currency was 1200.

Find all configuration settings at [bkper.com/apps/exchange-bot](https://bkper.com/apps/exchange-bot).

### Regular transactions

Regular transactions in any currency are mirrored in other currencies with the exchange rate applied.

**You** post in the USD book:

```
05/06/2025 100 Citi Bank >> Expense
```

The Exchange Bot detects the `exc_code: USD` on the accounts or their group, and posts the transaction in the other currency books:

In the EUR book:
```
05/06/2025 101.12 Citi Bank >> Expense
```

In the JPY book:
```
05/06/2025 14,615.60 Citi Bank >> Expense
```

### International wire transfers

**You** post an international wire from EUR to USD in the EUR book:

```
05/06/2025 5,000.00 Bank of Europe >> Citi Bank
exc_amount: 5408.75
exc_code: USD
```

The Exchange Bot detects the transaction properties and posts with the specified `exc_amount`:

In the USD book:
```
05/06/2025 5,408.75 Bank of Europe >> Citi Bank
exc_amount: 5,000.00
exc_code: EUR
exc_rate: 1.08175
```

In the JPY book:
```
05/06/2025 808,696.57 Bank of Europe >> Citi Bank
exc_amount: 5,000.00
exc_code: EUR
exc_rate: 161.739313539692
```

## Calculating unrealized results

The Exchange Bot calculates currency gains and losses across all books in your collection and posts the results.

Open any book in the collection and select **Exchange Bot** from the **More** menu. Set the calculation date and click **Gain/Loss** to start the process.

> **Note**
> First-time users need to authenticate the Exchange Bot before running calculations.
The bot will:
- Create unrealized results accounts (with "EXC" suffix) if they don't exist
- Post gain/loss transactions to each currency book based on exchange rate differences on the calculation date

> **Note**
> When used together with the [Portfolio Bot](http://bkper.com/docs/guides/automations/portfolio-bot.md), the Exchange Bot also calculates and posts realized gains and losses from portfolio operations.
## Multi-currency accounting template

Explore the template books to see the Exchange Bot in action:

- [EUR Book](https://app.bkper.com/b/#transactions:bookId=agtzfmJrcGVyLWhyZHITCxIGTGVkZ2VyGICA4Niy--sKDA)
- [JPY Book](https://app.bkper.com/b/#transactions:bookId=agtzfmJrcGVyLWhyZHITCxIGTGVkZ2VyGICA4PjE268JDA)
- [USD Book](https://app.bkper.com/b/#transactions:bookId=agtzfmJrcGVyLWhyZHITCxIGTGVkZ2VyGICA4JiIxbcJDA)
- [Google Sheets MCA Report](https://docs.google.com/spreadsheets/d/1_ORBH2fBV_JjdcAI8f_3sxOIpDC3BVx-ovXT9lCSHFY/edit?gid=111248651#gid=111248651)

> **Note**
> You must place the books into a collection for the Exchange Bot to work.

---
source: /docs/guides/automations/install-apps-and-bots.md

# Install Apps & Bots

Bots are a secure and effective way to automate everyday tasks on your books. Installing a bot connects it to your book so it can react to events and perform actions on your behalf.

## Installing a bot

Open the book where you want to add the bot. In the book settings (gear icon), select **Automations**, then open the **Bots** tab. Choose the bot you want to use and click **Install**.

![Installing a bot from the Automations portal](http://bkper.com/docs/_astro/apps-installation-1.DFkrQfQX.png)

The first time you install a bot, you need to authenticate and authorize its access to your book.

**Authenticate** using your Google account. This confirms your identity.

**Authorize** the required permission scopes. This grants the bot the specific access it needs to operate on your books.

Once authenticated and authorized, you can check the bot's status in the **User Connections** section of the [Automations Portal](http://bkper.com/docs/guides/automations/automations-portal.md). These connections are per user, not per book — a single connection works across all your books. Deleting a connection stops all configurations that depend on it.

After the connection is established, the bot is ready. Follow any configuration instructions specific to the bot you installed.

## Removing a bot

Open the book settings (gear icon) and select **Automations**. Go to the **Book Integrations** tab, select the bot you want to remove, and click **Remove**.

Removing a bot from a book does not revoke your user connection — it only detaches the bot from that specific book. The bot continues to operate on any other books where it is configured.

> **Note**
> Explore the full list of available bots and apps at [bkper.com/apps](https://bkper.com/apps).
> **Tip: Building your own app?**
> If you want to build a custom app or automation for Bkper, see the [Build](http://bkper.com/docs/build.md) section for guides on platform apps, scripts, and integrations.

---
source: /docs/guides/automations/inventory-bot.md

# Inventory Bot

The Inventory Bot automatically tracks how many units of each item you have in stock and calculates the true cost of goods sold (COGS) when you make a sale. It bridges your Financial Books (which track money) with a dedicated Inventory Book (which tracks quantities), ensuring your profit calculations account for what items actually cost.

## Why this matters

When running a business with inventory, two questions matter most:

- **How many units do I have right now?**
- **When I sold those units, what did they cost me?**

Without the Inventory Bot, you would manually track quantities in spreadsheets and struggle to calculate accurate profit. With it, the bot maintains both automatically and ensures your profit calculations reflect the real cost of goods sold.

## How it works

The bot operates in three phases: you record purchases and sales in your Financial Book, the bot mirrors them in the Inventory Book with quantities, and finally you run a calculation that matches purchases to sales using FIFO.

### Recording a purchase

You buy 100 units of T-shirts for $1,000. In your Financial Book, record:

| Date | Amount | From Account | To Account | Description | Properties |
|------|--------|-------------|------------|-------------|------------|
| 01/15/2025 | $1,000 | Bank | T-shirts | Purchase order | `purchase_invoice: INV-001` `purchase_code: TSHIRT-001` `quantity: 100` |

When you check this transaction, the bot detects it as a purchase and creates a matching entry in your Inventory Book: "100 units acquired at $10 per unit cost."

### Recording a sale

You sell 30 T-shirts for $900. In your Financial Book:

| Date | Amount | From Account | To Account | Description | Properties |
|------|--------|-------------|------------|-------------|------------|
| 02/01/2025 | $900 | Sales Revenue | Bank | Sale | `sale_invoice: SALE-001` `good: T-shirts` `quantity: 30` |

When you check this transaction, the bot records it in the Inventory Book: "30 units sold." The cost hasn't been calculated yet — that happens in the next step.

### Calculating cost of goods sold

Open the Inventory Bot menu (**More** > **Cost of Sales**) and click **Calculate**. The bot matches recorded sales to purchase history using FIFO (First-In, First-Out):

- The 30 units sold came from the original purchase at $10 each
- Cost of goods sold = 30 x $10 = $300
- Profit = $900 (revenue) - $300 (cost) = $600

The bot maintains a liquidation log showing exactly which purchases were matched to which sales — a complete audit trail.

## FIFO: First-In, First-Out

FIFO determines which purchase costs apply to which sales. The oldest stock moves first:

```
Oldest purchase → [100 units @ $10 each]
                  [50 units @ $12 each]
Newest purchase → [20 units @ $15 each]
```

When you sell 120 units, the bot takes from the oldest first:
- 100 units @ $10 = $1,000
- 20 units @ $12 = $240
- **Total COGS = $1,240**

FIFO reflects how real warehouses work and is accepted by tax authorities worldwide.

### Collection structure

Your Financial Books and Inventory Book must belong to the same [collection](http://bkper.com/docs/core-concepts.md#collections):

**Financial Book** — records money flowing in and out (one per currency):
```
exc_code: USD
```

**Inventory Book** — tracks quantities (one per collection):
```
inventory_book: true
```

### Account groups

Any group containing inventory items must have:
```
exc_code: USD
```

The bot uses this to match items to the correct currency's financial data.

### Purchase

Records items coming in. Required properties:
- `purchase_invoice` — reference number
- `purchase_code` — links to related additional costs or credit notes
- `quantity` — how many units

Optional: `order` (sequence when multiple purchases happen on the same day)

### Sale

Records items going out. Required properties:
- `good` — the account name of the item being sold (must match exactly, case-sensitive)
- `quantity` — how many units

Optional: `sale_invoice`, `order`

### Additional costs

Records extra costs added to a purchase (shipping, import duties). Required:
- `purchase_code` — must match the original purchase
- `purchase_invoice` — reference for the cost invoice

The bot adds this to the original purchase cost, raising the per-unit cost for COGS calculations.

### Credit note

Records a refund or discount on a purchase. Required:
- `purchase_code` — must match the original purchase
- `credit_note` — invoice number of the credit

Optional: `quantity` (for partial returns)

## Key rules

> **Caution**
> Always **check** transactions after recording them. This is how the bot knows to process them and sync to the Inventory Book — it gives you a chance to verify purchases and sales before they enter your inventory.
> **Caution**
> Only edit the Financial Book. The Inventory Book is managed entirely by the bot and maintains the audit trail. Manually editing Inventory Book transactions or properties will break calculations.
- The `good` property on sales must match your account name exactly (case-sensitive).
- Include all required properties on every transaction.
- The bot automatically protects FIFO accuracy across periods — backdated transactions trigger a rebuild flag.

## Real example: Coffee Roastery

**January:**
- Buy 100 bags @ $5 each = $500 (`purchase_code: COFFEE-001`)
- Sell 60 bags for $900
- COGS: 60 bags x $5 = $300 | Profit: $600
- Remaining inventory: 40 bags @ $5

**February:**
- Buy 80 bags @ $6 each = $480 (`purchase_code: COFFEE-002`)
- Sell 100 bags for $1,500
- COGS (FIFO): 40 bags from January @ $5 = $200, then 60 bags from February @ $6 = $360
- Total COGS: $560 | Profit: $940
- Remaining inventory: 20 bags @ $6

## Calculating and resetting

**To calculate COGS:** Open the Inventory Bot menu and select **Calculate Cost of Sales**. You can calculate for a single account, all accounts in a group, or all inventory accounts.

**To reset:** If you need to recalculate (perhaps you added a backdated transaction), click **Reset** to clear previous calculations, then **Calculate** again.

## Forward date and period closure

The Inventory Bot uses an automatic **forward date mechanism** that activates when you calculate COGS. The calculation date is stored on each inventory account and acts as a period boundary.

- **Transactions after this date** — processed normally in the next calculation
- **Transactions before this date** — trigger a rebuild flag to protect FIFO accuracy

This prevents accidentally inserting past-period transactions without the bot detecting the inconsistency.

> **Tip**
> The automatic forward mechanism prevents a common mistake: manually forwarding while leaving uncalculated transactions. By tying it to the calculation, the bot ensures period boundaries always align with actual COGS calculations.
## Common issues

- **"Inventory Book has pending tasks"** — wait or refresh; the Inventory Book has uncompleted transactions.
- **"Sale quantity exceeds available inventory"** — you recorded a sale with more units than purchased. Check your purchase quantities.
- **"Account flagged for rebuild"** — you recorded a transaction dated before your last COGS calculation. See [Rebuilding inventory](#rebuilding-inventory) below for how to fix it.
- **"Financial Book not found"** — the item's group `exc_code` doesn't match any Financial Book in the collection.

## What you get

- **Automatic inventory tracking** — just record and check transactions
- **Accurate COGS** — based on actual purchase costs matched to sales via FIFO
- **Audit trail** — every COGS calculation shows which purchases matched which sales
- **True profit** — revenue minus actual cost of goods sold
- **Real-time inventory visibility** — unit counts and cost-basis values always current
- **Tax compliance** — FIFO is accepted worldwide and produces the documentation needed for audits
- **One source of truth** — Financial Book and Inventory Book stay in sync automatically

## Rebuilding inventory

When an inventory account is marked for rebuild, it means you recorded a transaction with a date **earlier than your last COGS calculation**. The bot flags it to prevent incorrect profit calculations.

### The problem this solves

FIFO cost matching depends on perfect chronological order. Adding a transaction out of sequence breaks the FIFO logic:

- **January 31:** You calculate COGS (the bot locks in this date)
- **February 15:** You discover a sale from January 15 that you missed
- **Problem:** The January 15 sale should have been matched to January purchases, but COGS was already calculated with February purchases in the mix
- **Result:** Your profit calculation is wrong — the wrong purchases were matched to the wrong sales

The rebuild flag catches this so you can fix it.

### Key causes for the rebuild flag

**Backdated transactions** — you recorded a transaction with a date before the last COGS calculation date.

| When it happens | Example |
|---|---|
| After calculating COGS | You calculate on Feb 28 |
| Then add an earlier transaction | You record a Jan 15 sale you forgot |
| The bot flags the account | Marked for rebuild |

**Manual edits to the Inventory Book** — someone manually edited a transaction in the Inventory Book after the bot created it.

| What you did | Why it's dangerous |
|---|---|
| Changed a quantity in the Inventory Book | Breaks the link to your Financial Book |
| Modified a property or date | Invalidates the FIFO matching |
| Deleted a transaction | Audit trail is incomplete |

> **Caution**
> Only edit the Financial Book. The Inventory Book is managed by the bot and maintains your audit trail.
### What to do

1. **Understand why it was flagged** — check if you added a backdated transaction or manually edited the Inventory Book.
2. **Verify the transaction is correct** — confirm the transaction date is accurate and all properties (`quantity`, `good`, `purchase_code`, etc.) are correct. If not, fix it in the Financial Book and re-check it.
3. **Recalculate** — click **Reset** (clears previous COGS calculations), then click **Calculate Cost of Sales** (recalculates with the correct order). The rebuild flag clears automatically.

> **Caution**
> Never ignore this warning. FIFO accuracy is essential for correct profit reporting and tax compliance.

---
source: /docs/guides/automations/portfolio-bot.md

# Portfolio Bot

The Portfolio Bot (formerly the Stock Bot) tracks quantities, profits and losses, and revaluations related to financial instrument operations. Profit or Loss is calculated on a FIFO (First-In, First-Out) basis.

![Portfolio Bot overview showing financial and portfolio books](http://bkper.com/docs/_astro/portfolio-bot-1.-8doSEox.png)

## How it works

Bkper uses separate books to track different entities: a **Financial Book** tracks money and a **Portfolio Book** tracks quantities of securities or other assets.

All books must belong to one [Bkper Collection](http://bkper.com/docs/core-concepts.md#collections) so the Portfolio Bot knows its boundaries of operation.

![Financial and Portfolio books organized in a collection](http://bkper.com/docs/_astro/portfolio-bot-2.B3c2dXIb.png)

> **Note**
> You can have as many currencies in one collection as you need.
The Portfolio Bot is triggered in financial books on each **Post** and **Check** transaction event. When it identifies a stock operation through specific properties, it sends the transaction data to the Portfolio Book, which records the corresponding quantity entry.

> **Caution**
> Always work (record, post, trash) on the Financial Book — never directly on the Portfolio Book.
### Portfolio Bot status

- **Gray icon** — working properly
- **Red icon** — error
- **No icon** — not installed

### Portfolio Bot flow

1. Post a transaction representing a stock purchase order on the Financial Book: `100 Bank Account >> Exchange buy 10 GOOG`
2. The **Post Event** triggers the Portfolio Bot, which finds the required stock properties.
3. The bot posts a **Fee** transaction and a **Stock purchase** transaction on the Financial Book: `10 Exchange >> Fees` and `90 Exchange >> GOOG`
4. **Check** the stock purchase transaction: `90 Exchange >> GOOG`
5. The **Check Event** triggers the Portfolio Bot to post the quantity on the Portfolio Book: `10 Buy >> GOOG`

### Books and collection

1. Create the Financial Book(s) — one per currency
2. Create one Portfolio Book
3. Add all books to one [collection](http://bkper.com/docs/core-concepts.md#collections)
4. [Install the Portfolio Bot](http://bkper.com/docs/guides/automations/apps-installation.md) on all books in the collection

### Accounts

**On the Financial Book:**
- **Asset type** — a bank account (*JP Morgan*), an exchange/broker account (*JP Morgan Broker*), and a stock account (*GOOG*)
- **Outgoing type** — a fees account (*Broker Fees*)

**On the Portfolio Book:**
- **Asset type** — the same stock account (*GOOG*)

### Groups

**On the Financial Book:** Create a group (e.g. *NASDAQ* or *Portfolio US*) and add the securities to it.

**On the Portfolio Book:** Create a matching group with the same securities.

> **Note**
> Once installed, the Portfolio Bot keeps the group in sync between your Financial and Portfolio books.
## Configuration

The Portfolio Bot requires **Book**, **Group**, **Account**, and **Transaction** [properties](http://bkper.com/docs/guides/using-bkper/properties.md).

### Book properties

**On Financial Books** — the exchange code is required:

```
exc_code: USD
```

**On the Portfolio Book** — indicate this is the quantity-tracking book:

```
stock_book: true
stock_historical: true   (optional)
stock_fair: true          (optional)
```

> **Note**
> Setting either `stock_historical` or `stock_fair` to `true` tells the Portfolio Bot to skip calculating realized results with the other method.
### Group properties

Add `stock_exc_code` to all stock groups in both Financial and Portfolio Books:

**Financial Book USD** — on the *NASDAQ* or *Portfolio US* group:
```
stock_exc_code: USD
```

**Financial Book EUR** — on the *DAX* or *Portfolio EUR* group:
```
stock_exc_code: EUR
```

**Portfolio Book** — matching groups get the same values:
```
stock_exc_code: USD
```

The bot uses this code to keep accounts in sync and to find the way back to the transaction origin.

> **Note**
> The `stock_exc_code` value on a portfolio group should match the `exc_code` value on the corresponding financial book.
### Account properties

The exchange/broker account requires a fee account property:

```
stock_fees_account: Broker Fees
```

> **Note**
> This property is required even if you do not record fees.
### Transaction properties

Transactions representing purchase or sale orders need these properties:

```
instrument: GOOG
quantity: 10
trade_date: 05/07/2025
fees: 10         (optional)
interest: 0      (optional)
order: 1         (optional)
```

### Purchase of portfolio assets

**You** post a purchase with required properties in the Financial Book:

```
05/06/2025 165 JP Morgan >> JP Morgan Exchange buy
instrument: GOOG
quantity: 1
trade_date: 05/07/2025
```

**Portfolio Bot** (on Post Event) posts the actual purchase:

```
05/06/2025 165 JP Morgan Exchange >> GOOG buy
fees: 0
interests: 0
price: 165
quantity: 1
settlement_date: 2025-05-07
```

**You** check the purchase transaction.

**Portfolio Bot** (on Check Event) posts the quantity in the Portfolio Book:

```
05/06/2025 1 Buy >> GOOG buy
original_amount: 165
original_quantity: 1
purchase_price: 165
stock_exc_code: USD
```

### Sale of portfolio assets

**You** post a sale in the Financial Book:

```
05/06/2025 166 JP Morgan Exchange >> JP Morgan sell
instrument: GOOG
quantity: 1
trade_date: 05/07/2025
```

**Portfolio Bot** posts the actual sale and, after you check it, records the quantity reduction in the Portfolio Book.

### Calculate realized results

Open the Portfolio Book, select the asset(s) to calculate, and choose **Portfolio Bot** from the **More** menu. Check the mark-to-market checkbox, set the date, and press **Calculate**.

The bot updates transaction properties, checks transactions in the Portfolio Book, and posts two transactions in the Financial Book representing the gain or loss.

### Setting a forward date

Forwarding preserves remaining inventory lots, mark-to-market valuations, and realized results across periods — ensuring the next period starts with the correct FIFO baseline.

Open the Portfolio Book, select the asset(s), choose **Portfolio Bot** from the **More** menu, set the forward date, and press **Set Forward Date**. Calculate any remaining realized results first with **Calculate RR**, then press **Forward Date**.

### Reset portfolio operations

If you need to correct operations, use **Reset** to revert all realized result and exchange result transactions back to the last forward date (or the start of the book if no forward date exists).

> **Note**
> If the [Exchange Bot](http://bkper.com/docs/guides/automations/exchange-bot.md) is also installed on the collection, reset does not undo Exchange Bot entries — those must be handled separately.
## Template

Explore the template books to see the Portfolio Bot in action:

- [Financial Book (USD)](https://app.bkper.com/b/#transactions:bookId=agtzfmJrcGVyLWhyZHITCxIGTGVkZ2VyGICA4MjCmacJDA)
- [Portfolio Book](https://app.bkper.com/b/#transactions:bookId=agtzfmJrcGVyLWhyZHITCxIGTGVkZ2VyGICA4Jja2KcJDA)

> **Note**
> To use the template, make a copy, place the books in a collection, and install the Portfolio Bot on all books.
## Developer reference

Find the documentation and source code for the [Portfolio Agent on GitHub](https://github.com/bkper/bkper-portfolio-bot?tab=readme-ov-file#bkper-portfolio-bot).

---
source: /docs/guides/automations/subledger-bot.md

# Subledger Bot

The Subledger Bot records transactions from subledger books into a general ledger, automating the consolidation of partial administrations. This is useful for dividing work between teams (e.g. one team tracking receivables, another tracking payables) or consolidating subsidiary books into a single parent book.

![Subledger Bot overview — child books consolidating into a parent book](http://bkper.com/docs/_astro/subledger-bot-1.DhugjFBb.png)

### Create your books

Create a **General Ledger** book (the parent) and one or more **Subledger** books (the children). The parent book can itself be a child to another parent, forming a tree structure.

### Install the Subledger Bot

Open each book that participates in the consolidation, go to the [Automations Portal](http://bkper.com/docs/guides/automations/automations-portal.md), select the **Subledger Bot**, and click **Install**.

[Image: Installing the Subledger Bot from the Automations Portal]

> **Note**
> Installing the Subledger Bot on the parent book is not required unless you use the `child_book_id` property to sync accounts from incoming or outgoing groups (see below).
### Associate child with parent

In your child book, open the book properties (gear icon) and add the `parent_book_id` property with the [bookId](http://bkper.com/docs/guides/using-bkper/books.md#bookid) of the parent book as the value.

[Image: Setting the parent_book_id property on a child book]

From this point, transactions posted in the child book are automatically recorded on the parent book.

### Map child accounts to a single parent account

To consolidate multiple child accounts (e.g. individual customer accounts) into one parent account (e.g. *Accounts Receivable*), add a `parent_account` property to the group or account on the child book.

![Editing a group on the child book to add the parent_account property](http://bkper.com/docs/_astro/subledger-bot-4.Dfr6tNIE.png)

![The parent_account property set on the Accounts Receivable group](http://bkper.com/docs/_astro/subledger-bot-5.DxTjVrYC.png)

All transactions involving accounts in that group are recorded on the parent book using the single parent account instead of the individual child accounts.

### Sync accounts from parent to child books

To keep incoming (revenue) and outgoing (expense) accounts synchronized across parent and child books, add a `child_book_id` property to a group on the parent book with the child book's [bookId](http://bkper.com/docs/guides/using-bkper/books.md#bookid) as the value.

![Editing a group on the parent book to set child_book_id](http://bkper.com/docs/_astro/subledger-bot-6.BeyU4qQ-.png)

![The child_book_id property configured on a parent group](http://bkper.com/docs/_astro/subledger-bot-7.lteuKlTX.png)

Whenever you add an account to that group on the parent book, the Subledger Bot automatically creates the same account on the child book.

> **Note**
> This requires the Subledger Bot to be installed on the parent book as well.
### Change transaction amounts

Use the `parent_amount` transaction property to record a different amount on the parent book — useful when the parent should reflect an amount after taxes, for example.

![Recording a transaction with a parent_amount property on the child book](http://bkper.com/docs/_astro/subledger-bot-16.BEWqINdx.png)

![The transaction as it appears on the child book](http://bkper.com/docs/_astro/subledger-bot-18.D8Fg6sWv.png)

![The transaction recorded on the parent book with the parent_amount value](http://bkper.com/docs/_astro/subledger-bot-17.BRgSKl3p.png)

> **Note**
> When `parent_amount` is set to **0**, the Subledger Bot skips recording the transaction on the parent book entirely.
## Example with permanent accounts

On the child book, customer accounts (Customer A, Customer B) are grouped under *Accounts Receivable*. On the parent book, only the consolidated *Accounts Receivable A* account is needed.

Set the `parent_account` property on the child book's *Accounts Receivable* group with the value *Accounts Receivable A* — the suffix distinguishes entries from different child books.

![Parent account property set on the child book's Accounts Receivable group](http://bkper.com/docs/_astro/subledger-bot-8.DDqMwdL4.png)

Post a transaction involving Customer A on the child book:

![Posting a transaction on the child book with a customer account](http://bkper.com/docs/_astro/subledger-bot-9.BhpL_ciN.png)

The Subledger Bot records it on the parent book using the consolidated account:

![The transaction on the parent book using Accounts Receivable A](http://bkper.com/docs/_astro/subledger-bot-10.DvjCNkpR.png)

## Example with non-permanent accounts

For incoming and outgoing accounts (revenue, expenses), both the parent and child books share the same account names. To keep them in sync automatically, set `child_book_id` on the parent book's group.

![Revenue group with the same accounts on parent and child books](http://bkper.com/docs/_astro/subledger-bot-11.B2rdhy7p.png)

![Setting child_book_id on the parent group for account sync](http://bkper.com/docs/_astro/subledger-bot-12.BTRX36kf.png)

Adding a new account to the group on the parent book:

![Adding a new account to the revenue group on the parent book](http://bkper.com/docs/_astro/subledger-bot-13.BEoZr68z.png)

![Creating the new revenue account](http://bkper.com/docs/_astro/subledger-bot-14.uwmed5rQ.png)

The Subledger Bot automatically creates it on the child book:

![The account automatically created on the child book by the Subledger Bot](http://bkper.com/docs/_astro/subledger-bot-15.BjcbOgki.png)

---
source: /docs/guides/automations/tax-bot.md

# Tax Bot

The Tax Bot automatically records tax entries on purchase or sales transactions posted in your book. Taxes are calculated based on the transaction amount and properties set on accounts or groups that specify the rates to apply.

Tax can be **included** in the overall transaction amount (such as VAT) or **excluded** and added on top (such as income taxes). Once calculated, the Tax Bot records one or more additional transactions representing the tax entries.

## Installation

Open your book, go to the [Automations Portal](http://bkper.com/docs/guides/automations/automations-portal.md), click **Apps**, select **Tax Bot**, and click **Install**.

## Tax Bot status

![Tax Bot status icons — blue means working, red means error, absent means not installed](http://bkper.com/docs/_astro/tax-bot-1.BCoN-5Be.png)

- **Blue icon** — working properly
- **Red icon** — error
- **No icon** — not installed

## Sales scenario

To configure the Tax Bot for sales transactions:

### Set up the tax output account

Create a liability account for the tax output (e.g. *Output Tax*). Tax properties are not set on liability accounts — they are only set on the incoming accounts that trigger the tax calculation.

![Liability account created for tax output](http://bkper.com/docs/_astro/tax-bot-2.DVuOc2ek.png)

### Configure the incoming account

Create an incoming account for the service or product you sell, then add [custom properties](http://bkper.com/docs/guides/using-bkper/properties.md) to it:

- **`tax_description`** — the description for the generated tax transaction. It can include the tax output account name and the expression `${account.name}` to dynamically complete the accounts (see Expressions below).
- **`tax_excluded_rate`** — the tax rate to apply on top of the transaction amount.

**OR**

- **`tax_included_rate`** — the tax rate to extract from within the transaction amount (for taxes already included in the price).

![Incoming account with tax properties configured](http://bkper.com/docs/_astro/tax-bot-3.BQLUJXQ7.png)

When you post a sales transaction, the Tax Bot automatically records the corresponding tax entry:

[Image: Tax Bot automatically recording a tax entry after posting a sales transaction]

![The resulting tax transaction recorded by the Tax Bot](http://bkper.com/docs/_astro/tax-bot-5.C8P771-N.png)

> **Note**
> Tax Bot properties can be set on individual accounts or on groups to apply to multiple accounts at once.
### Other examples

Generating an additional 7% income tax:

```
tax_description: #incometax
tax_excluded_rate: 7
```

Extracting 12.85% VAT already included in the transaction:

```
tax_description: #vatin
tax_included_rate: 12.85
```

## Purchase scenario

For purchase transactions, create an asset account for the Tax Input (representing taxes you can reclaim) and an outgoing account or group for the products or services you acquire. Set the tax properties on the outgoing account or group.

## Expressions

Expressions are dynamic variables that reference values from the posting event that triggered the Tax Bot. Use them in the `tax_description` property to dynamically generate accounts and descriptions on the new tax transaction.

- `${account.name}` — the account that triggered the Tax Bot
- `${account.name.origin}` — the account when it participates as the From Account (empty otherwise)
- `${account.name.destinaton}` — the account when it participates as the To Account (empty otherwise)
- `${account.contra.name}` — the contra account that triggered the Tax Bot
- `${account.contra.name.origin}` — the contra account as the From Account (empty otherwise)
- `${account.contra.name.destinaton}` — the contra account as the To Account (empty otherwise)
- `${transaction.description}` — the description from the posted transaction

## How the Tax Bot works

**Trigger** — The Tax Bot is triggered by the post transaction event. It checks both accounts for tax properties and takes action when either account has `tax_description` with `tax_included_rate` or `tax_excluded_rate`.

**Action** — The bot collects all data from the transaction including tax properties and records another transaction resembling the tax operation.

![Diagram showing the Tax Bot trigger and action flow](http://bkper.com/docs/_astro/tax-bot-6.2radhopC.png)

> **Note**
> The tax transaction may take a moment to appear. As long as the Tax Bot icon is blue, the transaction is being processed.
## Closing an outstanding tax balance

At the end of a tax period, close the outstanding Input and Output tax balances by deducting one from the other and paying the amount due or claiming the amount receivable.

![Closing the tax period by balancing Input and Output tax accounts](http://bkper.com/docs/_astro/tax-bot-7.t4mJNRyw.png)

## Multiple taxes on one transaction

You cannot add two `tax_included_rate` or `tax_excluded_rate` properties to one account. To record multiple taxes (e.g. state and federal) on a single transaction, use groups.

Create two groups — one for the state tax and another for the federal tax — each with its own tax rate properties. Then add the relevant accounts to both groups.

![Two groups configured with different tax rates](http://bkper.com/docs/_astro/tax-bot-8.BUz-zExI.png)

For each posted transaction involving accounts in both groups, the Tax Bot records two separate tax entries.

![Two tax transactions recorded from a single posted transaction](http://bkper.com/docs/_astro/tax-bot-9.Dt1YguxU.png)

## Removing the Tax Bot

Open your book, go to the [Automations Portal](http://bkper.com/docs/guides/automations/automations-portal.md), click **Book integrations**, select **Tax Bot**, and click **Remove**.

---
source: /docs/guides/getting-started.md

# Your First Steps

Bkper tracks the movement of resources — money, inventory, instruments — between accounts using double-entry bookkeeping. To see it in action, you need three things: a **Book**, some **Accounts**, and a **Transaction**.

## See Bkper in action

Start here. These three guides take you from zero to a working Book with real balance values:

1. **[Books](http://bkper.com/docs/guides/using-bkper/books.md)** — Create a Book for the entity you want to track (a business, a project, a portfolio).
2. **[Accounts](http://bkper.com/docs/guides/using-bkper/accounts.md)** — Add Accounts that represent where resources sit or flow (bank accounts, revenue, expenses).
3. **[Transactions](http://bkper.com/docs/guides/using-bkper/transactions.md)** — Record a transaction between two accounts and post it. Balance values update instantly.

That's the aha moment — every transaction moves a precise amount from one account to another, and the books always balance. Everything else in Bkper builds on this foundation.

## Organize and grow

Once you have transactions flowing, structure your Book for clarity and reporting:

- **[Groups](http://bkper.com/docs/guides/using-bkper/groups.md)** — Group related accounts (all expense accounts under "Operating Expenses") for subtotals and cleaner reports.
- **[Chart of Accounts](http://bkper.com/docs/guides/using-bkper/chart-of-accounts.md)** — Design your account structure to match your business or use case.
- **[Collections](http://bkper.com/docs/guides/using-bkper/collections.md)** — Link multiple Books together when you track separate entities that need consolidated views.

## Report and analyze

Find answers in your data without leaving Bkper:

- **[Search & Queries](http://bkper.com/docs/guides/using-bkper/search-and-queries.md)** — Filter transactions by account, date, status, amount, or any combination. Save queries for periodic reports.
- **[Google Sheets](http://bkper.com/docs/guides/google-sheets.md)** — Pull live Bkper data into spreadsheets for custom dashboards, financial statements, and analysis.
- **[Chart Reports](http://bkper.com/docs/guides/using-bkper/chart-reports.md)** — Visualize balances and trends directly in the Bkper web app.

## Work with your team

Bkper is collaborative by design — everyone sees the same real-time data:

- **[Book Sharing](http://bkper.com/docs/guides/using-bkper/book-sharing.md)** — Invite collaborators with the right permission level (Owner, Editor, View Only, and more).
- **[Comments](http://bkper.com/docs/guides/using-bkper/comments.md)** — Discuss transactions, flag issues, and leave audit notes in context. Mentions send email notifications.
- **[Events](http://bkper.com/docs/guides/using-bkper/events.md)** — Every action generates an event — a complete audit trail of who did what and when.

## Automate

Let Bkper handle repetitive work so you can focus on decisions:

- **[Bkper Agent](http://bkper.com/docs/guides/automations/bkper-agent.md)** — An AI assistant that drafts transactions from natural language, learns your patterns, and processes document attachments.
- **[Automations](http://bkper.com/docs/guides/automations/apps-and-bots.md)** — Bots react to events automatically — calculating taxes, converting currencies, syncing sub-ledgers.
- **[Bank Connections](http://bkper.com/docs/guides/automations/bank-connections.md)** — Import bank transactions automatically and keep your Book in sync with your financial institutions.

---
source: /docs/guides/getting-started/best-practices.md

# Best Practices

## Less is better

This principle applies to Collections, Books, Groups, and Accounts, and is grounded in three key benefits:

**Fewer choices to make** for [agents](http://bkper.com/docs/guides/automations/bkper-agent.md) and users, which speeds up operations.

**Less maintenance**, especially for reports and integrations.

**Leverage Bkper's flexibility** when more detail, granularity, or units are needed.

For example, you can start tracking your results with just two accounts: **Revenues** (Incoming type) and **Expenses** (Outgoing type). As your business grows, add more detail to your [Chart of Accounts](http://bkper.com/docs/guides/using-bkper/chart-of-accounts.md) — a **Revenue** group with accounts like Services and Subscriptions, and an **Expenses** group with accounts like Rent, Salary, and Insurance.

Create Bkper components (Collections, Books, Groups, Accounts) referring to one unique entity — a business, an asset, a project.

## Avoid periods or dates in names

Don't create Bkper elements that refer to periods or dates (e.g., "Books for My Business 2024" or "My Business 2025"). This might seem practical at first, but over time your list of books will grow, and if applied to accounts will turn your Chart of Accounts into a mess, making reporting complicated.

Instead, create one Book for a specific entity — such as **My Business** — or one Account for a specific expense — such as **Transport**.

To retrieve balance values for a specific date or period, use the search conditions outlined in the [Query Guide](http://bkper.com/docs/guides/using-bkper/search-and-queries.md).

For example, instead of creating a separate receivable account for each customer per month (e.g., "Customer_A_0125", "Customer_A_0225"), create one receivable account **Customer_A**. To search for its outstanding balance for a specific date or period:

- `Customer_A on:01/31/2025`
- `Customer_A after:12/31/2024`

## Avoid units in names

If you track different units — such as currencies, or quantities and values — do not create separate accounts for quantity and value of the same asset in one Book (e.g., "Material_A_qt", "Material_A_value"). Instead, keep one Book for the asset's value and another Book for its quantities.

For a stock portfolio, for example, track the quantity of instruments in one Book and the value of each instrument in another.

> **Tip**
> You might think that having many years of transaction history in one Book could affect performance. This is not the case with Bkper — no matter how many transactions are in your Book, search speed remains unaffected.
## Unusual transactions

Some direct flows between account types can be misleading because they skip the Asset or Liability account that represents the real position being created or settled. Prefer the flow that best reflects business reality.

For example, instead of recording:

`Sales >> Transport`

it is often clearer to record:
- `Sales >> Bank Account`
- `Bank Account >> Transport`

Likewise, instead of:

`Sales >> Supplier`

it is often clearer to record:
- `Sales >> Bank Account`
- `Bank Account >> Supplier`

Direct flows can still be valid when they reflect the real event — such as settlements, refunds, taxes, or accrual positions.

---
source: /docs/guides/getting-started/get-help.md

# Get Help

Bkper offers several channels for learning the platform, getting assistance, and connecting with other users. Here are the best ways to find help and make the most of your experience.

## Bkper Learning Center

The **[Bkper Learning Center](https://bkper.com/learn/)** is your essential starting point for mastering the platform. It covers key concepts like accounting principles, how Bkper works, and how to properly set up your system. These foundational lessons lay the groundwork for unlocking the full potential of Bkper's features.

## Documentation

Beyond the Learning Center, this help center provides detailed [guides](http://bkper.com/docs/guides.md) for everyday use, [developer resources](http://bkper.com/docs/build.md) for building custom solutions, and complete API references. The content is structured for both humans and AI agents.

## Email Support

For detailed inquiries, send your questions to [support@bkper.com](mailto:support@bkper.com). The Bkper team reviews all messages and replies as available.

## YouTube Channel

The [Bkper YouTube channel](https://www.youtube.com/channel/UCN5aeBRFWOG70X8eYk8qZFQ) offers videos ranging from getting-started tutorials to conceptual explanations of bookkeeping and accounting principles on Bkper. These visual demonstrations complement the Learning Center and documentation.

## Community

Join the [Bkper Community on Discord](https://discord.com/invite/kJMNcV8hE5) to get updates about new features, participate in discussions, ask questions, and connect with other users.

---
source: /docs/guides/google-sheets.md

# Google Sheets Add-on

> **Note: New to Bkper in Google Sheets?**
> Start with [Build Your First Report](http://bkper.com/docs/guides/google-sheets/first-report.md) — a hands-on tutorial that walks you from zero to a working balance report.
Google Sheets is a powerful spreadsheet tool where teams collaborate and analyze numbers, build reports, and create dashboards. Bkper connects to it through the **Bkper Add-on**, separating your transaction data from manual spreadsheet manipulation — guaranteeing data consistency while keeping everything accessible in Google Sheets.

The Add-on works **both ways**: you can record data from a Sheet into Bkper, and fetch data from your Books into a Sheet.

## Record Data from Google Sheets

[Image: Recording transactions from Google Sheets into Bkper]

Export financial data from any software or institution to your Google Sheet, then record it into your Bkper Books with the Add-on. Without additional integrations or complex preparation, you can quickly store financial data as double-entry transactions, consistent over time.

## Fetch Data from Bkper

[Image: Fetching data from Bkper into Google Sheets for reporting]

Build dynamic reports on Google Sheets by fetching data from your Bkper Books. These reports stay **connected** to your Book — each posted Transaction updates the reports automatically. When you change a parameter (such as a date range), the report refreshes with the corresponding data.

## Reporting

Bkper does not embed predefined reports in the web app. Instead, you use the features you already know in Google Sheets to create your own reports.

Rather than working with lookup formulas to extract information from raw transactions on a Sheet, you fetch only the relevant data from Bkper — such as total balance values for a specific report or analysis. This reduces the risk of formula inconsistencies, simplifies your workflow, and gives you the flexibility to create new insights quickly while still producing standard financial statements.

## Report Templates

Working examples of complete reports built with Bkper Functions:

- [Financial Statements](http://bkper.com/docs/guides/templates/financial-statements.md) — Balance Sheet, Income Statement, and Retained Earnings on Google Sheets
- [Profit and Loss](http://bkper.com/docs/guides/templates/profit-and-loss.md) — Dynamic P&L report using balance period functions

## Printing

Bkper does not include a built-in print button. Instead, fetch the data you need into a Google Sheet using the Add-on, format it however you like — as a Balance Sheet, Income Statement, transaction list, or any custom layout — and use Google Sheets' built-in printing capabilities.

## Google Workspace Marketplace

The Bkper Add-on is free to use and published as an open-source project on GitHub that meets Google's security standards. Install it from the [Google Workspace Marketplace](https://workspace.google.com/marketplace/app/bkper/360398463400).

[Image: Bkper Add-on listing on the Google Workspace Marketplace]

## What You Can Do

The Add-on supports recording and fetching for all core data types:

| Record to Bkper | Fetch to Google Sheets |
|:---|:---|
| [Transactions](http://bkper.com/docs/guides/google-sheets/recording-data.md#transactions) | [Transactions](http://bkper.com/docs/guides/google-sheets/fetching-data.md#transactions) |
| [Accounts](http://bkper.com/docs/guides/google-sheets/recording-data.md#accounts) | [Accounts](http://bkper.com/docs/guides/google-sheets/fetching-data.md#accounts) |
| [Groups](http://bkper.com/docs/guides/google-sheets/recording-data.md#groups) | [Groups](http://bkper.com/docs/guides/google-sheets/fetching-data.md#groups) |
| | [Balance Values](http://bkper.com/docs/guides/google-sheets/fetching-data.md#balances) |

Learn more: [Install the Add-on](http://bkper.com/docs/guides/google-sheets/install.md) | [Bkper Functions](http://bkper.com/docs/guides/google-sheets/functions-reference.md) | [Add-on Sidebar](http://bkper.com/docs/guides/google-sheets/install.md#using-the-add-on-sidebar)

For common issues, see [Known Issues - Google Sheets](http://bkper.com/docs/guides/troubleshooting/known-issues-google-sheets.md).

> **Tip: Building custom Sheets integrations?**
> The Add-on covers recording and fetching for most use cases. If you need custom menus, automated pipelines, or scheduled reports built with code, see [Building Sheets Integrations](http://bkper.com/docs/build/google-workspace/google-sheets.md) in the Build section.

---
source: /docs/guides/google-sheets/fetching-data.md

# Fetching Data

Fetching pulls live data from your Bkper Books into Google Sheets. Open the [Add-on Sidebar](http://bkper.com/docs/guides/google-sheets/install.md#using-the-add-on-sidebar), select a Book, navigate to the **Fetch** tab, and choose a data type. Each fetch either inserts a live [Bkper Function](http://bkper.com/docs/guides/google-sheets/functions-reference.md) or pastes static values.

**Function** — Inserts a formula that stays connected to your Book. The data updates when you run [Update](http://bkper.com/docs/guides/google-sheets/functions-reference.md#update-reports) from the Add-on menu.

**Values** — Pastes data as static values. Use this when you plan to modify the data or don't need automatic updates.

## Balances

Pull aggregated balance values from your Book for financial statements and reports. Because the formulas stay connected to your Book, every posted Transaction updates the report automatically.

![Fetching balance data from Bkper into Google Sheets for reporting](http://bkper.com/docs/_astro/intro-fetch-from-bkper.DQ7virNP.png)

### How to Fetch Balances

Open the [Add-on Sidebar](http://bkper.com/docs/guides/google-sheets/install.md#using-the-add-on-sidebar), select your Book, click the **Fetch** tab, and select **Balances**.

- Write your **[query](http://bkper.com/docs/guides/using-bkper/search-and-queries.md)** in the input field
- Choose your output format (Function or Values)
- Press the **Fetch** button

![Bkper Add-on sidebar showing the Fetch Balances options with query input](http://bkper.com/docs/_astro/fetch-balances-sidebar.i-rQLN_U.png)

The Fetch tab offers several options for balance data:

| Option | Description |
|:---|:---|
| **Total** | Fetches total balance values according to the query |
| **Period** | Fetches balance value totals for the period defined in the query |
| **Cumulative** | Fetches cumulative values for the period defined in the query |
| **Transposed** | Shows results in columns instead of rows |
| **Collapsed** | When querying a Group, expands or collapses the levels under a parent Group |

### Balance Totals Filtered by Hashtag

Queries with a **Group** or an **Account** combined with **one hashtag** fetch the balance value for that specific combination, enabling managerial accounting. For example, you can track costs against `#products` or travel expenses against `#departments`.

<a href="https://docs.google.com/spreadsheets/d/1gCQKatrQ9G_DuPKvU1rbROgRFaS0p_T1vbsbhpBGnSQ/edit?gid=0#gid=0">![Balance totals filtered by hashtag showing costs per project](http://bkper.com/docs/_astro/fetch-balances-hashtag.Bex506Z4.png)</a>

```
=BKPER_BALANCES_TOTAL(bookId, 1, "group:'COGS' #projectB on:2025", FALSE, FALSE, TRUE)
```

> **Caution**
> Balances filtered by hashtag are calculated for up to **3,000** Transactions.
See also: [BKPER_BALANCES_TOTAL](http://bkper.com/docs/guides/google-sheets/functions-reference.md#bkper_balances_total) | [BKPER_BALANCES_PERIOD](http://bkper.com/docs/guides/google-sheets/functions-reference.md#bkper_balances_period) | [BKPER_BALANCES_CUMULATIVE](http://bkper.com/docs/guides/google-sheets/functions-reference.md#bkper_balances_cumulative)

## Transactions

Pull Transactions from your Book into Google Sheets for custom reporting, data analysis, or preparing batch edits that you can [save back to Bkper](http://bkper.com/docs/guides/google-sheets/recording-data.md).

### How to Fetch Transactions

Open the Add-on Sidebar, select your Book, click the **Fetch** tab, and select **Transactions**.

Enter a query to filter which Transactions to fetch. For example, `on:2024` retrieves all Transactions from the year 2024. You can use any [Bkper query syntax](http://bkper.com/docs/guides/using-bkper/search-and-queries.md) to filter by date, Account, amount, or Custom Properties.

![Fetch Transactions tab in the Bkper Add-on sidebar showing query input and output options](http://bkper.com/docs/_astro/fetch-transactions-sidebar.BZ6-8LWd.png)

### Output Columns

| Column | Description |
|:---|:---|
| **Transaction Id** | Unique identifier for each Transaction |
| **Status** | Current state: DRAFT, UNCHECKED, CHECKED, or TRASHED |
| **Date** | Transaction date |
| **Origin** | The Account where the amount comes from |
| **Destination** | The Account where the amount goes to |
| **Description** | Transaction description |
| **Amount** | Transaction amount |
| **Balance** | Running balance (only when filtering by a single permanent Account) |
| **Recorded at** | Date and time the Transaction was recorded |
| *Custom Properties* | Any Custom Properties on the Transaction |
| *Remote Ids* | External system identifiers, if any |
| *Attachments* | URLs or file attachments linked to the Transaction |

### What You Can Do Next

Once your Transactions are in Google Sheets, you can:

- Create custom reports and charts
- Filter and analyze your financial data
- Edit Transactions and [save them back to Bkper](http://bkper.com/docs/guides/google-sheets/recording-data.md)

See also: [Bkper Query Guide](http://bkper.com/docs/guides/using-bkper/search-and-queries.md) | [BKPER_TRANSACTIONS function](http://bkper.com/docs/guides/google-sheets/functions-reference.md#bkper_transactions)

## Accounts

Pull your Chart of Accounts from your Book into Google Sheets for reporting, batch editing, or creating templates for new Books.

### How to Fetch Accounts

Open the Add-on Sidebar, select your Book, click the **Fetch** tab, and select **Accounts**.

If you want Group information included in your output, enable the **Groups** checkbox. This adds one or more Group columns showing which Groups each Account belongs to.

![Fetch Accounts tab in the Bkper Add-on sidebar with Groups checkbox option](http://bkper.com/docs/_astro/fetch-accounts-sidebar.DyKkB_jA.png)

### Output Columns

| Column | Description |
|:---|:---|
| **Account Id** | Unique identifier for each Account |
| **Name** | Account name |
| **Type** | Account type: ASSET, LIABILITY, INCOMING, or OUTGOING |
| **Group** | One or more columns showing Group membership (when Groups checkbox is enabled) |
| *Custom Properties* | All Custom Properties defined on your Accounts |

Accounts are sorted by type (Assets, Liabilities, Incoming, Outgoing) then alphabetically by name within each type.

> **Note**
> Archived Accounts are not included in the output. Only active Accounts appear in the fetched data.
### What You Can Do Next

Once your Accounts are in Google Sheets, you can:

- Review and document your Chart of Accounts
- Modify Account names, types, Groups, or properties and [save them back to Bkper](http://bkper.com/docs/guides/google-sheets/recording-data.md)
- Use the structure as a template to create a new Book with the same Account setup

See also: [BKPER_ACCOUNTS function](http://bkper.com/docs/guides/google-sheets/functions-reference.md#bkper_accounts)

## Groups

Pull your Group structure from your Book into Google Sheets for documentation, templates, or batch editing.

### How to Fetch Groups

Open the Add-on Sidebar, select your Book, click the **Fetch** tab, and select **Groups**.

![Fetch Groups tab in the Bkper Add-on sidebar](http://bkper.com/docs/_astro/fetch-groups-sidebar.k04-Azl_.png)

### Output Columns

| Column | Description |
|:---|:---|
| **Group Id** | Unique identifier for each Group |
| **Name** | Group name |
| **Type** | Group type (see below) |
| **Parent** | Parent Group name (empty for root-level Groups) |
| **Children** | Number of child Groups within this Group |
| **Accounts** | Number of Accounts directly assigned to this Group |
| *Custom Properties* | All Custom Properties defined on your Groups |

> **Note**
> Hidden Groups are not included in the output.
### Group Types

| Type | Description |
|:---|:---|
| **ASSET** | Group for Asset Accounts only |
| **LIABILITY** | Group for Liability Accounts only |
| **INCOMING** | Group for Incoming Accounts only |
| **OUTGOING** | Group for Outgoing Accounts only |
| **ASSET_LIABILITY** | Mixed Group for both Asset and Liability Accounts |
| **INCOMING_OUTGOING** | Mixed Group for both Incoming and Outgoing Accounts |

Groups are fetched in hierarchical order — parent Groups appear first, followed by their children. Within each level, Groups are sorted by type (permanent first) then alphabetically by name.

### What You Can Do Next

Once your Groups are in Google Sheets, you can:

- Review and document your Group hierarchy
- Modify Group names, types, parents, or properties and create them in Bkper
- Use the structure as a template to create a new Book with the same Group setup

See also: [BKPER_GROUPS function](http://bkper.com/docs/guides/google-sheets/functions-reference.md#bkper_groups)

## Tips

**Combining fetches** — Use multiple fetch formulas across different tabs or sections of a Sheet to build comprehensive reports. For example, combine balance totals with a Transaction list for a detailed financial overview.

**Working examples** — The [Financial Statements template](http://bkper.com/docs/guides/templates/financial-statements.md) and [Profit and Loss template](http://bkper.com/docs/guides/templates/profit-and-loss.md) show complete reports built with Bkper Functions.

**Backup** — Fetch all your Transactions with a query like `after:1900` to create a spreadsheet backup of your Book's data.

---
source: /docs/guides/google-sheets/first-report.md

# Build Your First Report

This tutorial walks you through creating a live financial report on Google Sheets using data from your Bkper Book. By the end, you'll have a working balance report that updates automatically as Transactions are recorded in Bkper.

**Prerequisites**: [Install the Bkper Add-on](http://bkper.com/docs/guides/google-sheets/install.md) and have at least one Book with recorded Transactions.

## Step 1 — Open the Sidebar

Open a Google Sheet and go to **Extensions >> Bkper >> Open**. The Bkper sidebar appears on the right side of your Sheet.

![Bkper Add-on sidebar open in Google Sheets showing Book selection](http://bkper.com/docs/_astro/sidebar-overview.DFYK11zt.png)

The sidebar is your main interface for working with Bkper in Google Sheets. It lets you browse your Books and fetch or save data without writing formulas manually.

Select the **Book** you want to report on from the dropdown. This tells the Add-on which Book to pull data from.

## Step 2 — Fetch Balance Data

Click the **Fetch** tab in the sidebar. This tab lets you pull different types of data from your Book into your Sheet.

![Bkper Add-on sidebar showing the Fetch tab with data type options](http://bkper.com/docs/_astro/sidebar-fetch-tab.CKScWuyK.png)

Select **Balances** as the data type. The sidebar expands to show balance-specific options.

![Bkper Add-on sidebar showing the Fetch Balances options with query input](http://bkper.com/docs/_astro/fetch-balances-sidebar.i-rQLN_U.png)

Configure your fetch:

- **Query** — Enter a query to filter the data. For example, `group:'Revenue' after:01/2024 before:01/2025` fetches revenue balances for the year 2024.
- **Total** — Select this to get total balance values.
- **Function** — Select this so the formula stays connected to your Book (the data updates when you refresh).

Click in a cell where you want the report to start, then press **Fetch**.

## Step 3 — See the Live Connection

The sidebar inserts a formula into your selected cell and the balance data appears in your Sheet.

![Fetching balance data from Bkper into Google Sheets for reporting](http://bkper.com/docs/_astro/intro-fetch-from-bkper.DQ7virNP.png)

What just happened:

- The Add-on created a `BKPER_BALANCES_TOTAL` formula in your cell
- The formula contains your **Book ID** — a unique identifier that connects this Sheet to your specific Book
- The formula fetched live data from Bkper and displayed it in your Sheet

This is the key concept: **Bkper formulas are live connections to your Books**. Unlike static data, these values update whenever you refresh. Post a new Transaction in Bkper, click **Extensions >> Bkper >> Update**, and the report reflects the change.

## Step 4 — Understand the Formula

Click the cell with the formula to see it in the formula bar. It looks something like this:

```
=BKPER_BALANCES_TOTAL("agtzfmJrcGVyLWhyZH...", 1, "group:'Revenue' after:01/2024 before:01/2025", TRUE, FALSE, FALSE)
```

Breaking it down:

| Parameter | Value | Purpose |
|:---|:---|:---|
| **bookId** | `"agtzfmJrcGVyLWhyZH..."` | Identifies which Book to fetch from |
| **cache** | `1` | Controls caching — the Update menu increments this to force a refresh |
| **query** | `"group:'Revenue' after:..."` | Filters which balances to return |
| **expanded** | `TRUE` | Shows individual Accounts within the Group |
| **transposed** | `FALSE` | Results appear in rows (set `TRUE` for columns) |
| **hideNames** | `FALSE` | Shows Account/Group names alongside values |

You can edit any of these parameters directly in the formula bar. For example:

- Change the date range to see a different period
- Change `expanded` to `FALSE` to see only the Group total
- Change the query to `group:'Assets'` to report on a different Group

## Step 5 — Add More Data to Your Report

Now that you understand how the formulas work, build out your report by adding more balance fetches. You can either:

**Use the sidebar again** — Click a new cell, adjust the query in the sidebar, and press Fetch. Each fetch creates a new formula in the selected cell.

**Type formulas directly** — Type `=BKPER_` in any cell and Google Sheets suggests available Bkper functions.

![Google Sheets autocomplete showing available Bkper functions](http://bkper.com/docs/_astro/functions-reference-autocomplete.DeBhL98W.png)

A typical financial report might include:

- `BKPER_BALANCES_TOTAL` with `group:'Assets'` for the Balance Sheet
- `BKPER_BALANCES_TOTAL` with `group:'Revenue'` for Income
- `BKPER_BALANCES_PERIOD` with `group:'Expenses'` for monthly expense breakdown
- `BKPER_BALANCES_CUMULATIVE` with `group:'Assets'` for a running balance over time

## Step 6 — Format Your Report

Use standard Google Sheets formatting to make your report presentable:

- Add a title and date range header
- Apply number formatting to balance values
- Add borders and shading to separate sections
- Use Google Sheets' built-in **Print** to generate a PDF

The Bkper formulas are regular spreadsheet formulas — they work with all standard Google Sheets features like `SUM`, `IF`, conditional formatting, and charts.

## Next Steps

- [Bkper Functions](http://bkper.com/docs/guides/google-sheets/functions-reference.md) — Full reference for all available functions and their parameters
- [Fetching Data](http://bkper.com/docs/guides/google-sheets/fetching-data.md) — Fetch Transactions, Accounts, and Groups alongside balance data
- [Recording Data](http://bkper.com/docs/guides/google-sheets/recording-data.md) — Record Transactions, Accounts, and Groups from your Sheet into Bkper
- [Financial Statements template](http://bkper.com/docs/guides/templates/financial-statements.md) — A working example of a complete Balance Sheet and Income Statement
- [Profit and Loss template](http://bkper.com/docs/guides/templates/profit-and-loss.md) — A working example of a dynamic P&L report

---
source: /docs/guides/google-sheets/functions-reference.md

# Bkper Functions

Bkper Functions fetch data from your Bkper Books directly into Google Sheets. The functions stay connected to your Books, so any updates in Bkper are automatically reflected in your spreadsheet.

If you are new to Bkper or not very familiar with Google Sheet functions, the [Add-on Sidebar](http://bkper.com/docs/guides/google-sheets/install.md#using-the-add-on-sidebar) wizard can create the formulas for you.

## How to Use

[Install the Bkper Add-on](http://bkper.com/docs/guides/google-sheets/install.md), open a spreadsheet, and type an equal sign (`=`) followed by the function name. Google Sheets suggests available Bkper functions as you type.

![Google Sheets autocomplete showing available Bkper functions](http://bkper.com/docs/_astro/functions-reference-autocomplete.DeBhL98W.png)

## Function Categories

Bkper offers two types of functions:

**Balance Functions** — Fetch aggregated balance values for reporting:

- [`BKPER_BALANCES_TOTAL`](#bkper_balances_total)
- [`BKPER_BALANCES_PERIOD`](#bkper_balances_period)
- [`BKPER_BALANCES_CUMULATIVE`](#bkper_balances_cumulative)
- [`BKPER_BALANCES_TRIAL`](#bkper_balances_trial)

**Data Functions** — Fetch lists of records with full details:

- [`BKPER_ACCOUNTS`](#bkper_accounts)
- [`BKPER_GROUPS`](#bkper_groups)
- [`BKPER_TRANSACTIONS`](#bkper_transactions)

## Common Parameters

All Bkper Functions share two common parameters:

**bookId** — The unique identifier for your Bkper Book. You can find this in the Book URL or copy it from the [Add-on Sidebar](http://bkper.com/docs/guides/google-sheets/install.md#using-the-add-on-sidebar). Learn more about [finding your Book ID](http://bkper.com/docs/guides/using-bkper/books.md#bookid).

**cache** — A number used to control caching. Increase this value to force a fresh data fetch from Bkper.

### Update Reports

Press **Update** from the Bkper extension menu to fetch the latest values from your Bkper Book into all Bkper Functions on your Sheet.

![Bkper Update option in the Extensions menu of Google Sheets](http://bkper.com/docs/_astro/update-reports-menu.BPEHZ43O.png)

> **Note**
> All Bkper Functions on the Google Sheet are updated at once. Data that was fetched without Bkper Functions (as static values) is not updated.
The Update function works by incrementing the `cache` parameter on all Bkper functions in your Sheet, forcing them to fetch fresh data.

![Bkper function showing the cache parameter being incremented after update](http://bkper.com/docs/_astro/update-reports-cache.MPXUq_PY.png)

## Balance Functions

These functions return balance values and are ideal for building financial statements.

| Function | Purpose | Syntax |
|:---|:---|:---|
| [BKPER_BALANCES_TOTAL](#bkper_balances_total) | Total balance for a period | `=BKPER_BALANCES_TOTAL(bookId, cache, query, expanded, transposed, hideNames)` |
| [BKPER_BALANCES_PERIOD](#bkper_balances_period) | Balance per period (monthly, yearly) | `=BKPER_BALANCES_PERIOD(bookId, cache, query, expanded, transposed, hideDates)` |
| [BKPER_BALANCES_CUMULATIVE](#bkper_balances_cumulative) | Running balance over time | `=BKPER_BALANCES_CUMULATIVE(bookId, cache, query, expanded, transposed, hideDates)` |
| [BKPER_BALANCES_TRIAL](#bkper_balances_trial) | Debit and credit columns | `=BKPER_BALANCES_TRIAL(bookId, cache, query, expanded, transposed, hideNames)` |

In addition to `bookId` and `cache`, all balance functions share these parameters:

| Parameter | Type | Description |
|:---|:---|:---|
| **query** | string | The [query](http://bkper.com/docs/guides/using-bkper/search-and-queries.md) to filter results |
| **expanded** | TRUE, FALSE, or number | Expand Group tree. `TRUE` expands the Group itself, `-1` expands all subgroups, `-2` expands all Accounts, any other number expands up to that level |
| **transposed** | boolean | `TRUE` to transpose the result |

The sixth parameter varies by function — either `hideNames` or `hideDates` — and is documented under each function below.

### BKPER_BALANCES_TOTAL

Fetch the total balance values from Accounts and Groups.

```
=BKPER_BALANCES_TOTAL(bookId, cache, query, expanded, transposed, hideNames)
```

| Parameter | Type | Description |
|:---|:---|:---|
| **hideNames** | boolean | `TRUE` to hide Account/Group names |

**Example:**

```
=BKPER_BALANCES_TOTAL("agtzfmJrcGVyLWhyZHITCxIGTGVkZ2VyGICAgKD_4bMLDA", 1, "group:'Revenue' after:01/2016 before:01/2017", TRUE, FALSE, FALSE)
```

The result is ordered from the largest to the smallest amount.

### BKPER_BALANCES_PERIOD

Fetch periodic balance values from your Bkper Book. Returns Account balance values broken down by time period.

```
=BKPER_BALANCES_PERIOD(bookId, cache, query, expanded, transposed, hideDates)
```

| Parameter | Type | Description |
|:---|:---|:---|
| **hideDates** | boolean | `TRUE` to hide the dates row/column |

**Example:**

```
=BKPER_BALANCES_PERIOD("agtzfmJrcGVyLWhyZHITCxIGTGVkZ2VyGICAgKD_4bMLDA", 1, "group:'Revenue' after:01/2016 before:01/2017", TRUE, TRUE, FALSE)
```

- The result is ordered by Account names.
- If not referenced in the query, the default period is monthly.
- The periodic balance values are fetched for the debits/credits in the specified time range.
- Useful for Profit & Loss statements.

### BKPER_BALANCES_CUMULATIVE

Fetch cumulative Account balance values from your Bkper Book. Returns running balances over a time range.

```
=BKPER_BALANCES_CUMULATIVE(bookId, cache, query, expanded, transposed, hideDates)
```

| Parameter | Type | Description |
|:---|:---|:---|
| **hideDates** | boolean | `TRUE` to hide the dates row/column |

**Example:**

```
=BKPER_BALANCES_CUMULATIVE("agtzfmJrcGVyLWhyZHITCxIGTGVkZ2VyGICAgKD_4bMLDA", 1, "group:'Assets' after:01/2016 before:01/2017", TRUE, TRUE, FALSE)
```

- The result is ordered by Account names.
- With Asset and Liability Account types, the balance value of the previous period is considered.
- With Incoming and Outgoing Account types, the balance value starts at 0 and accumulates over the fetched period.
- Useful for Balance Sheets.

### BKPER_BALANCES_TRIAL

Fetch the trial balance values from Accounts and Groups, showing debit and credit columns.

```
=BKPER_BALANCES_TRIAL(bookId, cache, query, expanded, transposed, hideNames)
```

| Parameter | Type | Description |
|:---|:---|:---|
| **hideNames** | boolean | `TRUE` to hide Account/Group names |

**Example:**

```
=BKPER_BALANCES_TRIAL("agtzfmJrcGVyLWhyZHITCxIGTGVkZ2VyGICAgKD_4bMLDA", 1, "group:'Revenue' after:01/2016 before:01/2017", TRUE, FALSE, FALSE)
```

## Data Functions

These functions return complete record listings. All available data is included automatically — IDs, Groups, and Custom Properties are always fetched, making the functions simpler to use.

### BKPER_ACCOUNTS

Fetch the Chart of Accounts from your Bkper Book into Google Sheets. Returns a complete listing of Accounts with their types, Group memberships, and Custom Properties.

```
=BKPER_ACCOUNTS(bookId, cache, group)
```

| Parameter | Type | Description |
|:---|:---|:---|
| **group** | string (optional) | Filter Accounts by a specific Group name or Group ID |

**Examples:**

Fetch all Accounts:

```
=BKPER_ACCOUNTS("agtzfmJrcGVyLWhyZHITCxIGTGVkZ2VyGICAgKD_4bMLDA", 1)
```

Fetch only Accounts in the "Expenses" Group:

```
=BKPER_ACCOUNTS("agtzfmJrcGVyLWhyZHITCxIGTGVkZ2VyGICAgKD_4bMLDA", 1, "Expenses")
```

#### Output Columns

| Column | Description |
|:---|:---|
| **Account Id** | Unique identifier for each Account |
| **Name** | Account name |
| **Type** | Account type: ASSET, LIABILITY, INCOMING, or OUTGOING |
| *Group columns* | One column per Group in your Book, showing Group membership |
| *Custom Properties* | Any Custom Properties defined on the Accounts |

The optional `group` parameter fetches only Accounts belonging to a specific Group. You can pass either the Group name or the Group ID. If the Group has child Groups, Accounts from all child Groups are also included in the result.

Accounts are sorted first by type (Asset, Liability, Incoming, Outgoing), then alphabetically by name within each type.

### BKPER_GROUPS

Fetch all Groups from your Bkper Book into Google Sheets. Returns a complete listing of Groups with their hierarchy, Account counts, and Custom Properties.

```
=BKPER_GROUPS(bookId, cache)
```

**Example:**

```
=BKPER_GROUPS("agtzfmJrcGVyLWhyZHITCxIGTGVkZ2VyGICAgKD_4bMLDA", 1)
```

#### Output Columns

| Column | Description |
|:---|:---|
| **Group Id** | Unique identifier for each Group |
| **Name** | Group name |
| **Type** | Group type: ASSET, LIABILITY, INCOMING, OUTGOING, or mixed types |
| **Parent** | Name of the parent Group, if any |
| **Children** | Number of child Groups |
| **Accounts** | Number of Accounts in the Group |
| *Custom Properties* | Any Custom Properties defined on the Groups |

#### Group Types

Groups can have single or mixed types:

| Type | Description |
|:---|:---|
| **ASSET** | Groups containing only Asset Accounts |
| **LIABILITY** | Groups containing only Liability Accounts |
| **INCOMING** | Groups containing only Incoming Accounts |
| **OUTGOING** | Groups containing only Outgoing Accounts |
| **ASSET_LIABILITY** | Groups that can contain both Asset and Liability Accounts |
| **INCOMING_OUTGOING** | Groups that can contain both Incoming and Outgoing Accounts |

Groups are sorted hierarchically — parent Groups appear first, followed by their children. Within each level, Groups are sorted by type and then alphabetically by name.

### BKPER_TRANSACTIONS

Fetch Transactions from your Bkper Book into Google Sheets. Returns all Transactions matching your query, with full details including IDs, status, Custom Properties, and attachments.

```
=BKPER_TRANSACTIONS(bookId, cache, query)
```

| Parameter | Type | Description |
|:---|:---|:---|
| **query** | string | The [query](http://bkper.com/docs/guides/using-bkper/search-and-queries.md) to filter Transactions |

**Example:**

```
=BKPER_TRANSACTIONS("agtzfmJrcGVyLWhyZHITCxIGTGVkZ2VyGICAgKD_4bMLDA", 1, "acc:'Bank Account' after:01/2019")
```

#### Output Columns

| Column | Description |
|:---|:---|
| **Transaction Id** | Unique identifier for each Transaction |
| **Status** | Current state: DRAFT, UNCHECKED, CHECKED, or TRASHED |
| **Date** | Transaction date |
| **Origin** | The Account where the amount comes from |
| **Destination** | The Account where the amount goes to |
| **Description** | Transaction description |
| **Amount** | Transaction amount |
| **Balance** | Running balance (only when filtering by a permanent Account) |
| **Recorded at** | Date and time the Transaction was recorded |
| *Custom Properties* | Any Custom Properties on the Transaction |
| *Remote Ids* | External system identifiers, if any |
| *Attachments* | URLs or file attachments linked to the Transaction |

#### Transaction Status

Each Transaction has one of four status values:

| Status | Description |
|:---|:---|
| **DRAFT** | Transaction recorded but not yet posted |
| **UNCHECKED** | Transaction posted but not yet verified |
| **CHECKED** | Transaction posted and verified |
| **TRASHED** | Transaction moved to trash |

You can filter by status in your query using `is:draft`, `is:unchecked`, `is:checked`, or `is:trashed`.

#### Balance Column

The Balance column only appears when your query filters by a single permanent Account (Asset or Liability). It shows the running balance of that Account at each Transaction.

This query will include the Balance column:

```
=BKPER_TRANSACTIONS(bookId, 1, "acc:'Bank Account'")
```

This query will not include Balance (filtering by a non-permanent Account):

```
=BKPER_TRANSACTIONS(bookId, 1, "acc:'Office Supplies'")
```

## Reorder Results

Use the Google Sheets `QUERY` function to reorder Bkper function results. For example, given a Bkper function result in the range A2:B5:

```
=QUERY(A2:B5, "Select A, B order by A desc")
```

`asc` = A to Z (ascending) | `desc` = Z to A (descending)

## Working Examples

The [template gallery](https://bkper.com/templates) contains working examples of Bkper Books with corresponding Financial Statements in Google Sheets.

In the [Financial Statements](https://docs.google.com/spreadsheets/d/1ynzuvDElnz5zLYaMSmANy1t9c4Vv9eKeZ4vXjteGCsY/edit#gid=868176831) that accompany the [Simple General Ledger Template](https://app.bkper.com/b/#transactions:bookId=agtzfmJrcGVyLWhyZHITCxIGTGVkZ2VyGICAgKD_4bMLDA&viewer=true), cells with Bkper formulas are marked grey with a note indicating *Bkper Formula*.

## Video Instructions

[6 minute video explaining Bkper Functions](https://youtu.be/VlKGHLA3sMM)

## Limitations

Bkper Functions use Google Apps Script, which has a 30-second runtime limit per function call. This means you cannot fetch unlimited amounts of data in a single function.

If you hit this limit, consider:

- Using balance functions instead of fetching all Transactions
- Narrowing your time range (e.g., `after:$m-12 before:$m-6`)
- Using the [CSV Export App](https://bkper.com/apps/bkper-csv-export-app) for large data exports

See the full [Google Apps Script quotas](https://developers.google.com/apps-script/guides/services/quotas) for more details.

## Troubleshooting

For issues with Bkper Functions, see [Known Issues - Google Sheets](http://bkper.com/docs/guides/troubleshooting/known-issues-google-sheets.md).

> **Note**
> Make sure your Book and Google Sheet use the same timezone. Different timezones can cause date discrepancies (d-1 or d+1) between the Sheet and Book.

---
source: /docs/guides/google-sheets/install.md

# Install the Add-on

The Bkper Add-on for Google Sheets connects your Bkper Books to Google Sheets, enabling custom reports, data analysis, and automated Transaction recording.

## Installing the Add-on

Open a new or existing [Google Sheet](https://docs.google.com/spreadsheets/create) and navigate to **Extensions >> Add-ons >> Get Add-ons**. Search for "Bkper" and select it from the results. Click **Install**, then **Continue**, and choose your Google account. Review the permissions Bkper requires and click **Allow** to complete the installation.

## Authenticating for First Use

The first time you use the Add-on, you need to connect it to your Bkper account. Open the Add-on from **Extensions >> Bkper >> Open**.

![Opening the Bkper Add-on from the Extensions menu in Google Sheets](http://bkper.com/docs/_astro/install-extensions-menu.DjeiOldV.png)

In the sidebar, click **Sign in with Google** and select the account associated with your Bkper Books.

![Sign in with Google button in the Bkper Add-on sidebar](http://bkper.com/docs/_astro/install-sign-in.DGwtKkg3.png)

![Google account authorization dialog for the Bkper Add-on](http://bkper.com/docs/_astro/install-authorize.DML_jIMW.png)

Once authorized, close the confirmation window and you're ready to use the Add-on.

![Bkper Add-on successfully authorized and ready to use](http://bkper.com/docs/_astro/install-complete.yNbQ5Z-M.png)

## What's Included

![Bkper extension menu options in Google Sheets](http://bkper.com/docs/_astro/install-whats-included.DMbgn8x-.png)

The Add-on provides several features accessible from **Extensions >> Bkper**:

**[Sidebar](#using-the-add-on-sidebar)** — Browse and select Books directly within Sheets.

**[Auto Record](http://bkper.com/docs/guides/google-sheets/recording-data.md#auto-record)** — Automatically record Transactions from spreadsheet data as new rows are added.

**[Update](http://bkper.com/docs/guides/google-sheets/functions-reference.md#update-reports)** — Refresh all Bkper functions in your Sheet with current data.

**[Generate Transaction IDs](http://bkper.com/docs/guides/google-sheets/recording-data.md#generating-unique-ids)** — Create unique identifiers for Transactions to prevent duplicates.

**[Bkper Functions](http://bkper.com/docs/guides/google-sheets/functions-reference.md)** — Type `=BKPER_` in any cell to access custom functions for pulling Account balances, Transaction data, and more.

## Using the Add-on Sidebar

The **Add-on Sidebar** is a Bkper extension that turns Google Sheets into a powerful accounting tool. It helps you build financial statements, and batch **record** and batch **edit** Transactions in your Books in an easy and intuitive way.

![Bkper Add-on sidebar open in Google Sheets showing Book selection](http://bkper.com/docs/_astro/sidebar-overview.DFYK11zt.png)

### Fetch Tab

Build reports on Google Sheets by **fetching** balance values from Bkper. The sidebar is a wizard that helps you fetch relevant data for your reports intuitively.

![Bkper Add-on sidebar showing the Fetch tab with balance query options](http://bkper.com/docs/_astro/sidebar-fetch-tab.CKScWuyK.png)

Besides [Balance Values](http://bkper.com/docs/guides/google-sheets/fetching-data.md#balances), you can also fetch [Transactions](http://bkper.com/docs/guides/google-sheets/fetching-data.md#transactions), [Accounts](http://bkper.com/docs/guides/google-sheets/fetching-data.md#accounts), and [Groups](http://bkper.com/docs/guides/google-sheets/fetching-data.md#groups) from your Book.

When you fetch data with the sidebar wizard, it automatically generates the correct [Bkper Function](http://bkper.com/docs/guides/google-sheets/functions-reference.md) and inserts it in the selected cell.

> **Tip**
> Need a backup? Fetch all your Transactions with a query like `after:1900`.
### Save Tab

Save [Transactions](http://bkper.com/docs/guides/google-sheets/recording-data.md#transactions), [Accounts](http://bkper.com/docs/guides/google-sheets/recording-data.md#accounts), and [Groups](http://bkper.com/docs/guides/google-sheets/recording-data.md#groups) from the sidebar.

![Bkper Add-on sidebar showing the Save tab for recording data](http://bkper.com/docs/_astro/sidebar-save-tab.BZbgYvrb.png)

> **Note**
> Rows **with** an existing Transaction Id are **updated**. Rows **without** a Transaction Id are **recorded** as new entries in your Book.

---
source: /docs/guides/google-sheets/recording-data.md

# Recording Data

Recording pushes data from your Google Sheet into a Bkper Book. Open the [Add-on Sidebar](http://bkper.com/docs/guides/google-sheets/install.md#using-the-add-on-sidebar), select a Book, navigate to the **Save** tab, choose a data type (Transactions, Accounts, or Groups), select the cells containing your data, and press **Save**. Each row creates or updates one record in Bkper. Successfully saved rows are highlighted in green.

## Column Headers

The Add-on uses the first row of your data range as a header to understand each column's meaning. Headers are recognized in two ways:

**Frozen first row** — When you freeze the first row (**View >> Freeze >> 1 row**), the Add-on always treats it as a header, regardless of the column names.

**Recognized column names** — Even without freezing, the Add-on recognizes specific column names and maps your data correctly. This gives you flexibility when working with data exported from other systems.

### Recognized Column Names

The following column names are automatically recognized when saving Transactions:

| Column Name | Aliases | What it does |
|:---|:---|:---|
| **Date** | — | The post date of the Transaction |
| **Amount** | — | The amount on the Transaction |
| **From** | Origin, From Account, Credit Account | The From Account on the Transaction |
| **To** | Destination, To Account, Debit Account | The To Account on the Transaction |
| **Description** | — | The description, including external URLs |
| **ID** | — | Unique identifier for [generating IDs](#generating-unique-ids) |
| **Transaction ID** | — | Used to update existing Transactions |
| **BookId** | — | Target Book ID when saving to multiple Books |
| **Attachment** | — | File attachment URL |

When using recognized column names, you can place them in any order on your Sheet.

### When No Header Is Recognized

If the first row is not frozen and contains no recognized column names, the Add-on falls back to positional parsing. In this mode, the order of the data determines its meaning — for example, the first Account name found on a row becomes the From Account.

### Custom Properties

Any column with a header name that is not a recognized system column becomes a [Custom Property](http://bkper.com/docs/guides/using-bkper/properties.md). The column header becomes the property **key** and the cell value becomes the property **value**.

For example, a column named `project_code` with a cell value of `PRJ-2025` records the Custom Property `project_code: PRJ-2025` on the record.

To use Custom Properties, freeze the first row to ensure consistent header recognition.

> **Note**
> [Custom Properties for Books](http://bkper.com/docs/guides/using-bkper/properties.md) cannot be recorded via Google Sheets.
### Ignoring Columns

Columns with **blank headers are ignored** when saving data. This is useful when your Sheet contains additional information — such as checkboxes for internal approval workflows — that should not be recorded in Bkper.

### Header Summary

| Scenario | Header Recognition | Custom Properties |
|:---|:---|:---|
| First row frozen | Always recognized | Supported |
| Recognized column names (not frozen) | Recognized | Supported |
| No freeze, no recognized names | Falls back to positional parsing | Not supported |

> **Tip**
> For maximum flexibility and to ensure Custom Properties work correctly, freeze your first row.
## Transactions

Record new Transactions or update existing ones directly from your spreadsheet. Whether you're uploading bank data, syncing invoices, or bulk-editing Transactions you previously [fetched from Bkper](http://bkper.com/docs/guides/google-sheets/fetching-data.md), the Save tab handles it all.

### Transaction Columns

The Add-on recognizes these column headers for Transactions:

| Column Header | Description |
|:---|:---|
| **Date** | Transaction date |
| **Amount** | Transaction amount |
| **Origin** / **From** / **Credit Account** | The From Account |
| **Destination** / **To** / **Debit Account** | The To Account |
| **Description** | Transaction description |
| **Attachment** | URL to attachment |
| **Id** | Remote ID for deduplication |
| **BookId** | Target Book ID (overrides selected Book in the sidebar) |
| **Transaction Id** | Existing Transaction ID (for updates) |
| **Status** | Transaction state — read-only |
| **Recorded at** / **Created at** | Creation timestamp — read-only |
| **Balance** | Account balance — read-only |

When both **Origin/From** and **Destination/To** Accounts are provided along with an **Amount**, the Transaction is complete and is **posted** directly to your Book. Otherwise, it is saved as a draft.

**Remote ID** — A reference to the original identifier from another system or Bkper Book (such as a bank transaction number, invoice ID, or another Book's Transaction ID). Bkper uses Remote IDs to prevent duplicates — if a Transaction with the same Remote ID already exists, it won't be recorded again.

### Saving New vs. Updating Existing

The Add-on determines whether to record a new Transaction or update an existing one based on the **Transaction Id** column:

| Transaction Id Column | Action |
|:---|:---|
| Empty or missing | Records a new Transaction |
| Contains an existing ID | Updates the existing Transaction |

This enables a powerful workflow for bulk editing:

- **Fetch** Transactions from Bkper to your Sheet (using the [Fetch tab](http://bkper.com/docs/guides/google-sheets/fetching-data.md#transactions))
- **Edit** the data directly in your spreadsheet (amounts, descriptions, properties, etc.)
- **Save** the changes back to Bkper — the Add-on updates each Transaction by its Transaction Id

When updating Transactions, the following columns are read-only and will be ignored: **Transaction Id**, **Status**, **Recorded at**, **Created at**, and **Balance**.

### Transaction Notes

> **Note**
> **Timezone alignment** — Ensure your Book and Google Sheet use the same timezone. Mismatched timezones can cause date discrepancies (d-1 or d+1).
**Filtered rows** — When saving from a filtered Sheet, all rows in the selection are processed — **including hidden rows**, not just visible ones.

**Duplicate IDs** — If you include an **Id** column (Remote ID), the Add-on flags duplicate values in red to help you avoid recording duplicate Transactions.

## Generating Unique IDs

Assigning a **unique ID** to records on Google Sheets makes Transactions **idempotent** — a Transaction with a unique ID cannot be recorded twice in the same Book. Unique IDs prevent creating duplicate Transactions.

From Bkper's perspective, a unique ID from a Sheet (or elsewhere) is a **Remote ID**, accessible via the REST API or [BkperApp (Google Apps Script)](https://bkper.com/docs/bkper-app/#transaction_getremoteids). This makes tasks along a financial workflow beyond Bkper easy to automate.

### How to Generate IDs

Freeze the first row of your Sheet with the column headers, and add an **ID** column alongside the system properties.

![Google Sheet with frozen headers including an ID column for unique identifiers](http://bkper.com/docs/_astro/unique-ids-headers.sGALPzTL.png)

After freezing the first row, go to the Bkper extension and select **Generate Transaction IDs**.

![Bkper extension menu showing the Generate Transaction IDs option](http://bkper.com/docs/_astro/unique-ids-menu.D-rIygIO.png)

The unique IDs are inserted in each row that has data.

![Google Sheet showing generated unique IDs in the ID column for each Transaction row](http://bkper.com/docs/_astro/unique-ids-generated.C4vFmP9K.png)

## Auto Record

Activate **Auto Record** on a tab, and each new row added to a Google Sheet is automatically recorded as a new entry in your Bkper Book. This is especially handy when data flows into your Sheet automatically — from a Google Form, a `QUERY` formula, or another integration.

### Setting Up Auto Record

Open the [Add-on Sidebar](http://bkper.com/docs/guides/google-sheets/install.md#using-the-add-on-sidebar) from the Add-on menu and select the Book where you want to record the Transactions. Prepare the data you want to record automatically.

![Google Sheet with transaction data prepared for automatic recording](http://bkper.com/docs/_astro/auto-record-prepare.Bo8eldmx.png)

Select **Auto Record** on the Bkper Add-on menu.

![Bkper extension menu showing the Auto Record option](http://bkper.com/docs/_astro/auto-record-menu.BAZ8ZNJp.png)

Toggle the Auto Record switch to **YES**.

![Auto Record toggle switched to YES in the Bkper Add-on](http://bkper.com/docs/_astro/auto-record-toggle.bmQYSNQh.png)

New rows on the tab are now automatically recorded in your Bkper Book.

![New rows being automatically recorded as Transactions in Bkper](http://bkper.com/docs/_astro/auto-record-result.BFObX211.png)

> **Caution**
> When new rows are recorded, a pointer to the last recorded row is stored in the spreadsheet. **Deleting a row already recorded may make the pointer stale**, pointing to a blank row and preventing new lines from being recorded until the pointer is reached again. **Avoid deleting already recorded rows.** If you must delete one, reset the pointer by turning Auto Record off and back on for that tab.
## Accounts

Create Accounts in batch directly from your spreadsheet. Instead of manually creating each Account in Bkper, you can create several at once, defining their [Type](http://bkper.com/docs/core-concepts.md#account-types) and assigning them to [Groups](http://bkper.com/docs/core-concepts.md#groups) at the same time.

### Account Columns

| Column Header | Description |
|:---|:---|
| **Name** | Account name (required) |
| **Type** | Account type: ASSET, LIABILITY, INCOMING, or OUTGOING |
| **Group** | Group to assign the Account to |
| **BookId** | Target Book ID (overrides selected Book in the sidebar) |
| **Account Id** | Existing Account ID — read-only (for future updates) |

An Account must have a **Name** to be created. If **Type** is not specified, the Account defaults to **ASSET**.

You can assign an Account to multiple Groups by including multiple **Group** columns in your Sheet. Each column titled "Group" assigns the Account to the Group specified in the corresponding cell value.

### Account Notes

**Creating Accounts only** — Currently, the Save function creates new Accounts. Updating existing Accounts from Google Sheets is not yet supported but is planned for a future release. The **Account Id** column in fetched data is included to enable this functionality when available.

**Account types** — Valid types are ASSET, LIABILITY, INCOMING, and OUTGOING. Learn more about [Account Types](http://bkper.com/docs/core-concepts.md#account-types).

## Groups

Create Groups in batch directly from your spreadsheet. Instead of manually creating each Group in Bkper, you can create several at once, defining their hierarchy by assigning parent Groups.

### Group Columns

| Column Header | Description |
|:---|:---|
| **Name** | Group name (required) |
| **Type** | Group type: ASSET, LIABILITY, INCOMING, OUTGOING, or mixed (e.g., ASSET_LIABILITY) |
| **Parent** | Name of the parent Group (for creating hierarchies) |
| **BookId** | Target Book ID (overrides selected Book in the sidebar) |
| **Group Id** | Existing Group ID — read-only (for future updates) |
| **Children** | Number of child Groups — read-only |
| **Accounts** | Number of Accounts in Group — read-only |

A Group must have a **Name** to be created.

### Group Notes

**Creating Groups only** — Currently, the Save function creates new Groups. Updating existing Groups from Google Sheets is not yet supported but is planned for a future release. The **Group Id** column in fetched data is included to enable this functionality when available.

**Group types** — Groups can have a specific type (ASSET, LIABILITY, INCOMING, OUTGOING) or a mixed type (ASSET_LIABILITY for permanent Accounts, INCOMING_OUTGOING for non-permanent Accounts). Learn more about [Groups](http://bkper.com/docs/core-concepts.md#groups).

**Building hierarchies** — Use the **Parent** column to create nested Group structures. The parent Group must exist (either already in Bkper or created in a row above in your Sheet).

## Tips

**Bulk operations** — Prepare large datasets in Google Sheets and save them in one operation. The Add-on processes each row independently, so partial failures don't prevent other rows from being saved.

**Error handling** — Rows that fail to save are highlighted in red. Check the error message to understand what went wrong (missing required fields, invalid Account names, etc.).

**Troubleshooting** — For common issues with saving data, see [Known Issues - Google Sheets](http://bkper.com/docs/guides/troubleshooting/known-issues-google-sheets.md).

---
source: /docs/guides/templates/financial-statements.md

# Financial Statements on Google Sheets

Bkper integrates with Google Sheets so you can prepare financial statements with live data from your books. This lets you simplify periodic reporting obligations and gain a clear view of your business's financial position and performance — all in a format you can safely share with your team.

![A Balance Sheet on Google Sheets populated with data from a Bkper book](http://bkper.com/docs/_astro/bkper-balance-sheet.CucHtBxE.png)

The working example in this guide models a small team launching an online subscription-based service. It includes a **Bkper sample book** covering just over two years of operations and a **Google Sheets report** that presents a **Balance Sheet**, an **Income Statement**, and **Retained Earnings** — giving insight into both the financial position and the performance of the business.

## Concepts covered in the example

**Shareholders** — The [Shareholders](https://app.bkper.com/b/#transactions:bookId=agtzfmJrcGVyLWhyZHITCxIGTGVkZ2VyGICAwMWc48ELDA&query=group%253A) group contains transactions related to the distribution of shares. Two shareholders are founders; two others buy in at par value plus a premium.

**Investment** — The [Capital Contributions](https://app.bkper.com/b/#transactions:bookId=agtzfmJrcGVyLWhyZHITCxIGTGVkZ2VyGICAwMWc48ELDA&query=group%253A) group tracks investment transactions.

**Reimbursement** — The [Reimbursements](https://app.bkper.com/b/#transactions:bookId=agtzfmJrcGVyLWhyZHITCxIGTGVkZ2VyGICAwMWc48ELDA&query=group%253A) group records expenses paid by founders before the business generated revenue.

**Payment Gateway** — The [Accounts Receivable](https://app.bkper.com/b/#transactions:bookId=agtzfmJrcGVyLWhyZHITCxIGTGVkZ2VyGICAwMWc48ELDA&query=group%253A) group represents a payment gateway that handles customer billing.

**Gross Margin / Net Income** — The [Gross Margin](https://app.bkper.com/b/#transactions:bookId=agtzfmJrcGVyLWhyZHITCxIGTGVkZ2VyGICAwMWc48ELDA&query=group%253A) group captures revenue from operations minus cost of goods sold. [Net Income](https://app.bkper.com/b/#transactions:bookId=agtzfmJrcGVyLWhyZHITCxIGTGVkZ2VyGICAwMWc48ELDA&query=group%253A) includes all income and expenses.

**Retained Earnings** — The [Retained Earnings](https://app.bkper.com/b/#transactions:bookId=agtzfmJrcGVyLWhyZHITCxIGTGVkZ2VyGICAwMWc48ELDA&query=group%253A) at the end of the covered period reflect a profit from 2023 and a loss in 2024.

> **Note**
> Payroll in this example is simplified to salary expenses only.
## The financial statement

**Balance Sheet** — The Google Sheet fetches the [Balance Sheet](https://docs.google.com/spreadsheets/d/1GTFJAk3ZXpuxSiXxoTEX012LDNoQMdbEHkKukVborew/edit#gid=488070461) as of December 31, 2024, alongside the previous year, showing Assets, Liabilities, and Equity and how they evolved over the period.

**Income Statement** — The sheet also fetches an [Income Statement](https://docs.google.com/spreadsheets/d/1GTFJAk3ZXpuxSiXxoTEX012LDNoQMdbEHkKukVborew/edit#gid=726307163) covering the performance for 2024 and 2023.

**Retained Earnings** — The [Retained Earnings](https://docs.google.com/spreadsheets/d/1GTFJAk3ZXpuxSiXxoTEX012LDNoQMdbEHkKukVborew/edit#gid=177175078) tab tracks the Profit and Loss evolution across periods.

## Prerequisites

To follow this guide you should have some experience with Google Sheets and Bkper, along with a basic understanding of bookkeeping or accounting principles.

You will need:

- A [Bkper book](https://app.bkper.com/b/#transactions:bookId=agtzfmJrcGVyLWhyZHITCxIGTGVkZ2VyGICAwMWc48ELDA) — the foundation for organizing and consistently tracking all transactions and balances.
- A [Google Sheets](https://docs.google.com/spreadsheets/d/1GTFJAk3ZXpuxSiXxoTEX012LDNoQMdbEHkKukVborew) report — where Bkper data is transformed into financial statements.
- The [Bkper Add-on for Google Sheets](https://gsuite.google.com/marketplace/app/bkper/360398463400) — the integration that connects both platforms.

## How it works

The Bkper Add-on for Google Sheets integrates both services, enabling direct retrieval of financial data from your Bkper book into your spreadsheet.

![Diagram showing data flow from a Bkper book to a Google Sheets financial statement](http://bkper.com/docs/_astro/financial-statements-flow._53cQn-y.png)

A financial statement connected to a Bkper book updates automatically as new transactions change account balances. The data is fetched using OAuth2 authentication. The Bkper Add-on and Bkper Functions are open-source projects built on the BkperApp library for Google Apps Script, which accesses the Bkper API.

You can fetch financial data through the [Bkper Add-on wizard](http://bkper.com/docs/guides/google-sheets/first-report.md) or by writing [Bkper Functions](http://bkper.com/docs/guides/google-sheets/functions-reference.md) directly in your spreadsheet.

## Statement details

**Sheet FS 2024** — The **bookid** in cell [C6](https://docs.google.com/spreadsheets/d/1GTFJAk3ZXpuxSiXxoTEX012LDNoQMdbEHkKukVborew/edit#gid=0&range=C6) identifies the source book. The **dates** in cells [C8](https://docs.google.com/spreadsheets/d/1GTFJAk3ZXpuxSiXxoTEX012LDNoQMdbEHkKukVborew/edit#gid=0&range=C8) and [C9](https://docs.google.com/spreadsheets/d/1GTFJAk3ZXpuxSiXxoTEX012LDNoQMdbEHkKukVborew/edit#gid=0&range=C9) define the reporting period.

**Sheet Balance Sheet** — Bkper Formulas in cells [B7](https://docs.google.com/spreadsheets/d/1GTFJAk3ZXpuxSiXxoTEX012LDNoQMdbEHkKukVborew/edit#gid=488070461&range=B7) (2024) and [D7](https://docs.google.com/spreadsheets/d/1GTFJAk3ZXpuxSiXxoTEX012LDNoQMdbEHkKukVborew/edit#gid=488070461&range=D7) (2023) pull in the balance data. Here is what the dynamic formula looks like:

```
=BKPER_BALANCES_TOTAL('FS 2024'!C6, 1, "group:'Net Assets' on:"& C6, 5, FALSE, FALSE)
```

These formulas are **dynamic** — changing the bookid or dates on the FS 2024 tab causes the entire statement to adjust. This makes it straightforward to template and standardize reports across multiple books and clients.

**Tab Income Statement** — The Income Statement uses Bkper Formulas in cells [B7](https://docs.google.com/spreadsheets/d/1GTFJAk3ZXpuxSiXxoTEX012LDNoQMdbEHkKukVborew/edit#gid=726307163&range=B7) and [Q7](https://docs.google.com/spreadsheets/d/1GTFJAk3ZXpuxSiXxoTEX012LDNoQMdbEHkKukVborew/edit#gid=726307163&range=Q7) for extended P&L data, and [O8](https://docs.google.com/spreadsheets/d/1GTFJAk3ZXpuxSiXxoTEX012LDNoQMdbEHkKukVborew/edit#gid=726307163&range=O8) and [AD8](https://docs.google.com/spreadsheets/d/1GTFJAk3ZXpuxSiXxoTEX012LDNoQMdbEHkKukVborew/edit#gid=726307163&range=AD8) for P&L totals. Fetching the same data in both extended and totals formats provides a natural way to audit for discrepancies.

**Tab Retained Earnings** — This tab demonstrates how a wide range of reports can be derived from balance values. Cells [G9](https://docs.google.com/spreadsheets/d/1GTFJAk3ZXpuxSiXxoTEX012LDNoQMdbEHkKukVborew/edit#gid=177175078&range=G9) and [G10](https://docs.google.com/spreadsheets/d/1GTFJAk3ZXpuxSiXxoTEX012LDNoQMdbEHkKukVborew/edit#gid=177175078&range=G10) hold the Bkper Formulas for retained earnings totals, including comparisons across different periods.

## Try it yourself

The best way to learn is to experiment with your own copy of this working example.

Copy the [Bkper book template](https://app.bkper.com/b/#transactions:bookId=agtzfmJrcGVyLWhyZHITCxIGTGVkZ2VyGICAwMWc48ELDA) and the [Google Sheets template](https://docs.google.com/spreadsheets/d/1GTFJAk3ZXpuxSiXxoTEX012LDNoQMdbEHkKukVborew), then [install the Bkper Add-on](https://gsuite.google.com/marketplace/app/bkper/360398463400). [Record some transactions](https://www.youtube.com/watch?v=h9iF8wsjI5w) in your book, then open your copy of the financial statement. On the **FS 2024** tab, update the [bookid](http://bkper.com/docs/guides/using-bkper/books.md#bookid) to match your copied book, and adjust the start and end dates to cover the period of your transactions.

![Google Sheets showing where to update the bookid and date range on the FS 2024 tab](http://bkper.com/docs/_astro/bkper-financial-statement-instructions.BmBzZsjJ.png)

> **Note**
> It can take up to 24 hours for Google Sheets to recognize the Bkper Functions on a copied spreadsheet.
## Collaboration

This guide links directly to specific data in both the Bkper book and the Google Sheet — pointing you to exact values without any searching. This same approach works when collaborating with your team. Share links to specific cells, accounts, or transaction queries with clients, bookkeepers, CPAs, and auditors to communicate financial context with precision.

> **Caution: Disclaimer**
> This article is intended as an example and should not be considered professional advice. We recommend working with a local professional — such as a tax advisor or accountant — to ensure compliance with local regulations. Using this guide does not establish a professional-client relationship.

---
source: /docs/guides/templates/general-ledger-template.md

# Business General Ledger Template

If you are new to the Bkper Add-on for Google Sheets, the Business General Ledger Template is a great starting point. It pairs a Bkper Book with a simple Chart of Accounts and a Google Sheet report that fetches data directly from the Book.

- [The Bkper Book Template](https://app.bkper.com/b/#transactions:bookId=agtzfmJrcGVyLWhyZHITCxIGTGVkZ2VyGICAgKD_4bMLDA&viewer=true)
- [The Google Sheet Template](https://docs.google.com/spreadsheets/d/1icR8z8F3RSBeedfMbNE4-Q2FZvxyDhZeSrHuSXvPXr8/edit?gid=868176831)

## Copy the Book Template

Open the Bkper Book Template and click **Copy this Book** to create your own copy.

![Copy this Book button in the Bkper Book Template](http://bkper.com/docs/_astro/general-ledger-template-3.CaLZD796.png)

## Copy the Sheet Template

Open the Google Sheet Template and select **File > Make a copy** to save it to your own Google Drive.

![Make a copy of the Google Sheet Template](http://bkper.com/docs/_astro/general-ledger-template-4.BxgMGWKN.png)

> **Note**
> Select **My Drive** in the copy dialog to save the copy.
![Select My Drive in the Google Sheets copy dialog](http://bkper.com/docs/_astro/general-ledger-template-5.yx1C0y0E.png)

## Connect the Sheet to Your Book

Once you have both copies, retrieve the [bookId](http://bkper.com/docs/guides/using-bkper/books.md#bookid) from **your copy** of the Book Template.

![Finding the bookId in the Bkper Book URL](http://bkper.com/docs/_astro/general-ledger-template-6.DS-RnAxa.png)

Then open the **Instructions** tab in your copy of the Sheet and replace the bookId with your own.

![Replacing the bookId on the Instructions tab of the Google Sheet](http://bkper.com/docs/_astro/general-ledger-template-7.sIfowkw2.png)

## Record a Transaction and Explore

Record a [Transaction](http://bkper.com/docs/core-concepts.md#transactions) in your Book to generate some data. Then change the **year** on the Instructions tab and explore the other tabs to see your financial data flowing into the report.

![Changing the year on the Instructions tab of the Google Sheet Template](http://bkper.com/docs/_astro/general-ledger-template-8.C9bm8rTT.png)

## Important Notes

> **Caution**
> When you copy a Sheet with Bkper Functions, it may take some time (up to 24 hours) for the cache to update and recognize the formulas. You may initially see **#ERROR!** in cells with Bkper functions. Closing and reopening the Sheet can speed up the process. Eventually the errors disappear and balance values from your Book appear.
If you change the name of the **Total Equity** Group in your copy of the Book, you must also update that name in the query used by the Bkper Function in your copy of the Sheet report.

![Bkper Function referencing the Total Equity group name in the Sheet](http://bkper.com/docs/_astro/general-ledger-template-9.DL75qK2t.png)

---
source: /docs/guides/templates/profit-and-loss.md

# Profit and Loss Report

This guide walks through how to fetch data from a Bkper book and use Google Sheets to produce a Profit & Loss statement. Beyond the P&L itself, it explains how each piece connects so you can build your own reports.

![A Profit and Loss report on Google Sheets built with data from a Bkper book](http://bkper.com/docs/_astro/bkper-p-l-on-google-sheets.C6vS88cl.png)

## The key parts

A **Bkper book** is a ledger that tracks transactions between accounts. Each posted transaction updates the balance values of both accounts, keeping balances consistent over time.

The **chart of accounts** on a Bkper book organizes accounts into categories that can resemble a Balance Sheet and an Income Statement, or be structured around more managerial categories.

The **Bkper Add-on for Google Sheets** integrates Bkper with Google Sheets, enabling you to fetch financial data from a book directly into a spreadsheet.

![Diagram showing data flow from a Bkper book to a Google Sheets report via the Bkper Add-on](http://bkper.com/docs/_astro/financial-statements-flow._53cQn-y.png)

A **Bkper Function** is inserted into the Google Sheet by the Add-on to maintain a live connection to your book. From that point on, each newly posted transaction automatically updates your P&L report.

## Working example

To follow along, use these samples (you can make your own copies to experiment):

- [Bkper Sample Book](https://app.bkper.com/b/#transactions:bookId=agtzfmJrcGVyLWhyZHITCxIGTGVkZ2VyGICAwMWc48ELDA)
- [P&L Report on Google Sheets](https://docs.google.com/spreadsheets/d/1_jQHHnoHFjJ4JnuEkJ-zenMLvQSAjiFD8hLZ6TeN6ZI/edit#gid=168077234)

## Chart of accounts

A well-organized chart of accounts is essential to a P&L report — its structure should reflect the data you want to present.

Bkper's group hierarchy lets you organize accounts to mirror accounting definitions. For example, **[Gross Margin](https://app.bkper.com/b/#transactions:bookId=agtzfmJrcGVyLWhyZHITCxIGTGVkZ2VyGICAwMWc48ELDA&query=group%253A)** = **Revenue** - **Cost of Goods Sold**.

![Bkper chart of accounts showing Gross Margin as Revenue minus Cost of Goods Sold](http://bkper.com/docs/_astro/bkper-gross-margin.DsY8jAud.png)

This hierarchy continues: **Income** = Gross Margin - Expenses, and further, **Net Income** = Income + Non-operational income.

![Bkper chart of accounts showing the full Net Income hierarchy](http://bkper.com/docs/_astro/bkper-net-income.riCp_w-b.png)

**Learn more:** [Groups](http://bkper.com/docs/core-concepts.md#groups)

## The Bkper Add-on for Google Sheets

The Bkper Add-on sidebar opens within Google Sheets, where a form on the **Fetch** tab helps you define the scope of data to retrieve.

![Bkper Add-on sidebar in Google Sheets showing the fetch form configured for the Net Income group](http://bkper.com/docs/_astro/bkper-addon-sidebar.Ybb3EJq6.png)

In this example, the query field is set to the **Net Income** group for the year **2024**. Pressing the **Fetch** button inserts a Bkper Function into the sheet that retrieves the corresponding data:

```
=BKPER_BALANCES_TOTAL("agtzfmJrcGVyLWhyZHITCxIGTGVkZ2VyGICAwMWc48ELDA", 1, "group:'Net Income' on:2024", 2, FALSE, FALSE)
```

![Google Sheets showing the result of the Bkper Function fetching Net Income data](http://bkper.com/docs/_astro/bkper-addon-result.B4SVBlm_.png)

**Learn more:** [Bkper Add-on for Google Sheets](http://bkper.com/docs/guides/google-sheets.md) | [Build Your First Report](http://bkper.com/docs/guides/google-sheets/first-report.md) | [Bkper Query Guide](http://bkper.com/docs/guides/using-bkper/search-and-queries.md)

## The Bkper Function

The Bkper Function may look complex at first, but the Add-on sidebar can generate it for you. In cell [B5](https://docs.google.com/spreadsheets/d/1_jQHHnoHFjJ4JnuEkJ-zenMLvQSAjiFD8hLZ6TeN6ZI/edit#gid=168077234&range=B5) on the P&L sheet:

```
=BKPER_BALANCES_PERIOD("agtzfmJrcGVyLWhyZHITCxIGTGVkZ2VyGICAwMWc48ELDA", 1, "group:'Net Income' on:2024", 5, TRUE, FALSE)
```

Each parameter serves a purpose:

- **BKPER_BALANCES_PERIOD** — The function that fetches totals for a period (as opposed to a point in time).
- **First parameter** — The [bookid](http://bkper.com/docs/guides/using-bkper/books.md#bookid) identifying the source book.
- **1** — A cache number used to trigger dynamic updates. It is generated and updated automatically; change it manually to force a new fetch.
- **"group:'Net Income' on:2024"** — The [query](http://bkper.com/docs/guides/using-bkper/search-and-queries.md) defining which data to retrieve.
- **5** — The depth level in the group hierarchy to fetch.

![Bkper group hierarchy showing the depth levels used by the BKPER_BALANCES_PERIOD function](http://bkper.com/docs/_astro/bkper-group-hierarchy.DxidDUcK.png)

- **TRUE** — Transposes the result in the sheet.
- **FALSE** — Controls whether the date column is hidden.

> **Caution: Disclaimer**
> This article is intended as an example and should not be considered professional advice. We recommend working with a local professional — such as a tax advisor or accountant — to ensure compliance with local regulations. Using this guide does not establish a professional-client relationship.
**See also:** [Financial Statements on Google Sheets](http://bkper.com/docs/guides/templates/financial-statements.md)

---
source: /docs/guides/templates/spend-management.md

# Spend Management Template

Managing team expenses, tracking budgets, and processing reimbursements can be complex and time-consuming. Bkper's Spend Management template demonstrates how a Book can handle the complete expense management lifecycle using the fundamental principle of tracking resources as they flow between places.

The workflow is naturally embedded in the Book structure using core Bkper features. Transactions represent expense submissions, file attachments hold receipts, the Checked field serves as approval status, and custom properties enable policy enforcement. No specialized expense module is needed — everything works through the elegant flow of resources between Accounts.

## Copy the Template

Access the [Spend Management Book Template](https://bkper.app/b/#transactions:bookId=agtzfmJrcGVyLWhyZHITCxIGTGVkZ2VyGICA4Kz_5bIJDA&range=after%253A01%252F2026%2520before%253A01%252F2027) in Bkper and select **Copy this Book** to create your own version. The template includes a pre-configured Account structure and sample Transactions that demonstrate the complete workflow.

Access the [Team Member Report](https://docs.google.com/spreadsheets/d/1rXFzocdZk6VOlGEAK-gLLlvcVpRIUq27aMK8QtsppiE/edit?gid=1593013320#gid=1593013320) in Google Sheets and make a copy to **your Google Drive**, then follow the instructions on the first tab to connect the report to your own Book.

> **Note**
> This template is for didactic purposes. You may want to adjust access options and remove team member selection options to match your organization's needs.
## Understanding the Structure

The Spend Management Book organizes Accounts into Groups, each serving a specific role in the workflow.

**Total Allocated Budget** is an Asset Group (blue) containing individual budget allocation Accounts for each team member, such as *Arun Allocated Budget* or *Daniella Allocated Budget*. These Asset Accounts track each person's available funds throughout the period, showing exactly how much budget remains at any point in time.

**Expenses** is an Outgoing Group (red) containing category Accounts like Food, Lodging, Transportation, and Materials. These Outgoing Accounts track where money is being spent. Separating expenses into categories gives you visibility into spending patterns across the team.

**Budget allocation** is an Incoming Group (green) that serves as the source for funding team budgets. This Incoming Account represents where the budget comes from when allocating funds to team members. You can hide this Group from regular views since it is primarily used for administrative Transactions.

**Reimbursement** is an Incoming Account (green) that serves as the source for replenishing team member budgets after approved expenses. While Budget allocation funds the initial setup, Reimbursement represents the actual payment back to team members. This separation provides clarity — you can easily distinguish between initial budget allocations and ongoing reimbursements throughout the period.

![Spend Management Book structure showing budget, expense, and allocation Accounts](http://bkper.com/docs/_astro/spend-management-1.BPeKoWtq.png)

## The Workflow

The expense management cycle flows naturally through four stages, each represented by Transactions that move resources between Accounts.

### Budget Allocation

At the start of each period, budgets are allocated to team members. You record a Transaction from the Budget allocation Account to each team member's Allocated Budget Account. For example, if Arun receives a monthly budget of 5,000:

| Date | Amount | From Account | | To Account | Description |
|------|--------|------|---|-----|-------------|
| 09/01/2026 | 5,000.00 | Budget allocation | >> | Arun Allocated budget | Monthly budget allocation |

This Transaction moves 5,000 into Arun's budget, making it available for expenses.

### Expense Submission

When team members incur expenses, they record Transactions from their Allocated Budget Account to the appropriate Expense category Account. The key is attaching the receipt using Bkper's file attachment feature. For example, when Arun pays for a hotel:

| Date | Amount | From Account | | To Account | Description |
|------|--------|------|---|-----|-------------|
| 09/11/2026 | 1,060.00 | Arun Allocated budget | >> | Lodging | Contezza hotel #arun |

### Expense Approval

Managers review submitted expenses by examining Transactions and their attached receipts. When an expense meets policy requirements and has proper documentation, the manager checks the Transaction. The **Checked status** serves as the approval flag — only Checked Transactions are reimbursed at period end. Unchecked Transactions remain pending until approved.

Managers can send [comments](http://bkper.com/docs/guides/using-bkper/comments.md) to team members with Unchecked Transactions to request receipts or additional details.

### Reimbursement

On the first of the following month, approved expenses are reimbursed. You record a Transaction from the Reimbursement Account to each team member's Allocated Budget Account for the total of their Checked expenses:

| Date | Amount | From Account | | To Account | Description |
|------|--------|------|---|-----|-------------|
| 10/01/2026 | 1,136.39 | Reimbursement | >> | Arun Allocated budget | Budget reset - approved expenses |

This amount represents only the approved expenses — any Unchecked Transactions are excluded until reviewed and Checked.

## Transaction Flow Example

Here is a complete cycle showing how resources flow through the system.

### Budget Allocation

| Date | Amount | From Account | | To Account | Description |
|------|--------|------|---|-----|-------------|
| 09/01/2026 | 5,000 | Budget allocation | >> | Arun Allocated budget | Monthly Budget |
| 09/01/2026 | 1,000 | Budget allocation | >> | Daniella Allocated budget | Monthly Budget |

### Expense Submissions

| State | Date | Amount | From Account | | To Account | Description |
|-------|------|--------|------|---|-----|-------------|
| ☑️ | 09/11/2026 | 1,060.00 | Arun Allocated budget | >> | Lodging #arun | 📎 |
| ☑️ | 09/11/2026 | 31.39 | Arun Allocated budget | >> | Food #arun | 📎 |
| ☑️ | 09/11/2026 | 45.00 | Arun Allocated budget | >> | Food #arun | 📎 |
| ☑️ | 09/15/2026 | 17.00 | Daniella Allocated budget | >> | Transportation #daniella | Lyft - personal card |

### Approval

| State | Date | Amount | From Account | | To Account | Description |
|-------|------|--------|------|---|-----|-------------|
| ✅ | 09/11/2026 | 1,060.00 | Arun Allocated budget | >> | Lodging #arun | 📎 |
| ✅ | 09/11/2026 | 31.39 | Arun Allocated budget | >> | Food #arun | 📎 |
| ✅ | 09/11/2026 | 45.00 | Arun Allocated budget | >> | Food #arun | 📎 |
| ☑️ | 09/15/2026 | 17.00 | Daniella Allocated budget | >> | Transportation #daniella | Lyft - personal card |

> **Note**
> The gray check mark indicates the expense was not approved — in this case because the receipt attachment is missing.
### Monthly Reimbursement

| Date | Amount | From Account | | To Account | Description |
|------|--------|------|---|-----|-------------|
| 10/01/2026 | 1,136.39 | Reimbursement | >> | Arun Allocated budget | Budget reset - approved expenses |

> **Note**
> The reimbursement amount (1,136.39) equals only the Checked Transactions (1,060.00 + 31.39 + 45.00). The Unchecked Lyft expense (17.00) is excluded until it receives approval.
## Customization Options

The template is designed to be flexible and adapt to your team's specific policies and workflows.

**Account Properties** enable policy enforcement. You can add custom properties to team member Accounts defining spending limits:

```
monthly_budget: 5000
food_limit: 200
lodging_limit: 2500
transport_limit: 300
```

These properties can guide manual approvals or enable automated policy enforcement using AI agents, bots, or scripts. For example, a Bot could automatically flag or reject Transactions that exceed category limits, or send reimbursement orders to payment gateways.

**Workflow variations** are easy to implement through properties and Transactions. To distinguish personal card expenses from company card expenses, add a property like `payment_method: personal_card` to Transactions requiring reimbursement. To implement aging policies, you might configure automation that automatically disregards Unchecked Transactions older than three months.

## Incurring Expenses on the Go

Team members often incur expenses while traveling or working remotely, making it impractical to record detailed Transactions immediately. Bkper's mobile app transforms this challenge into a seamless workflow by enabling instant receipt capture with minimal effort.

When a team member makes a purchase, they take a photo of the receipt from within the Bkper mobile app and post the image with a brief description — perhaps just the vendor name or expense type. The Transaction is recorded in the Book but remains in an unposted state, waiting for review.

**Bkper Agent** can then analyze the receipt image, extracting key information such as the amount, vendor name, date, and nature of the expense. Based on the Book's Account structure and historical patterns, the Agent suggests the appropriate categorization and auto-completes the Transaction details.

The team member can review the Agent's suggestions and post the Transaction immediately, or leave it unposted for later review. A team manager can also review all unposted Transactions, verify the categorization against the receipt image, make adjustments, and post them in batch. This flexibility accommodates different trust levels and approval workflows.

The combination of mobile receipt capture and AI-assisted completion dramatically reduces the burden on team members. Instead of manually entering amounts, dates, categories, and descriptions while juggling receipts, they simply snap a photo and let the Agent handle the details — capturing expenses in real time while maintaining the accuracy required for proper expense management.

## Team Member Dashboards

While team members can view their budget status directly in the Book, many organizations create personalized dashboards using Google Sheets. These dashboards connect to the Book through Bkper Functions, displaying real-time data filtered to each team member's activities.

![Team member expense dashboard built with Google Sheets and Bkper Functions](http://bkper.com/docs/_astro/spend-management-2.B39POkqf.png)

A typical dashboard shows the team member's allocated budget for the period, their available balance after recorded expenses, and total amount spent. The dashboard breaks down spending by expense category — Food, Transportation, Lodging, Materials — helping team members understand their spending patterns at a glance.

The most valuable feature is the pending approval section, which lists Transactions that remain Unchecked. Each pending Transaction displays its date, amount, description, and a direct link to view the details in Bkper. This visibility eliminates the need for team members to repeatedly ask whether their expenses were approved.

The dashboard requires minimal setup — connecting to the Book through its identifier and filtering data by team member name and date range. Once configured, it updates automatically as Transactions are recorded, posted, and Checked.

## Managing External Team Members

Organizations frequently work with contractors, freelancers, or consultants who need to incur expenses against project budgets but should not access the organization's broader financial information. Bkper handles this through permission controls.

External members can be added to the Book with **post only** permission. This allows them to record Transactions and capture expenses with receipts through the mobile workflow, while preventing them from viewing the Book's structure, other team members' activities, or financial details beyond their own submissions.

To provide external members with budget visibility, you can create personalized dashboards as described above, showing only their allocated budget, submitted expenses, and approval status.

When an external member's engagement ends, you remove their Book access and revoke dashboard access. Their historical Transactions remain in the Book for audit purposes, but they can no longer record expenses or view information.

## Key Concepts

The **Checked** status is central to this workflow. When a Transaction is Checked, it signals approval and eligibility for reimbursement. Unchecked Transactions remain pending. Transactions can also be Trashed to indicate rejection, excluding them from calculations.

Receipts should be attached to Transactions before considering approval. The file attachment feature creates a permanent link between the expense record and its supporting documentation, establishing a complete audit trail.

The monthly reimbursement cycle aligns naturally with payroll and accounting periods, but you can adjust the timing to match your organization's needs — some teams reimburse weekly, others quarterly.

Every Transaction maintains a complete audit trail showing who spent what amount, when it occurred, which category it belongs to, and whether it was approved. Communication via [Comments](http://bkper.com/docs/guides/using-bkper/comments.md) stays within the context of the Book and is part of the historical record, even for Trashed Transactions.

The template demonstrates that Bkper handles sophisticated expense management workflows using only core features — Books, Accounts, Groups, Transactions, file attachments, the Checked field, and custom properties. By understanding resources as movements between places, complex workflows become simple, intuitive, and powerful.

---
source: /docs/guides/troubleshooting/issue-tracker-status.md

# Issue Tracker and Service Status

Bkper provides dedicated channels for reporting issues, requesting new features, and monitoring service availability. These resources help you stay informed and get problems resolved quickly.

## Report Issues and Request Features

The **[Bkper Issue Tracker](https://github.com/bkper/bkper-issues/issues)** on GitHub is the central place to report bugs and file feature requests. Whether you encounter unexpected behavior or have an idea for improving the platform, opening an issue on the tracker ensures your feedback reaches the development team and can be prioritized alongside other requests.

## Service Status

The **[Bkper Status Page](https://bkper.com/status/)** provides real-time information about the availability of Bkper services. Check this page if you experience connectivity issues or unexpected errors to see whether a known incident is in progress.

Since Bkper runs on Google Cloud Platform, the **[Google Cloud Status Page](https://status.cloud.google.com/)** is also a useful reference for checking the health of the underlying infrastructure.

---
source: /docs/guides/troubleshooting/known-issues-google-sheets.md

# Known Issues - Google Sheets

If you have trouble using [Bkper Functions](http://bkper.com/docs/guides/google-sheets/functions-reference.md), the solutions below address the most common issues.

## Where Can I Find the Book ID?

The Book ID is located in the URL of your Bkper Book.

![Bkper Book URL highlighting the Book ID](http://bkper.com/docs/_astro/known-issues-bookid.C6bTn7w-.png)

You can also copy it from the [Add-on Sidebar](http://bkper.com/docs/guides/google-sheets/install.md#using-the-add-on-sidebar) or learn more about [finding your Book ID](http://bkper.com/docs/guides/using-bkper/books.md#bookid).

## How to Identify an Error

When executing a function, you may encounter an error. Identify errors by hovering the mouse over cells showing **#ERROR!** or **#REF** results.

## 1. #NAME? Error: Unknown Function

When you copy a Google Sheet that contains Bkper Functions (such as one of Bkper's templates), Google Sheets may not immediately recognize the copied functions. The Sheet displays a **#NAME?** error in cells that call a Bkper Function.

![Google Sheet showing #NAME? error for an unknown Bkper function](http://bkper.com/docs/_astro/known-issues-name-error.CDClLvUi.png)

Often this error clears itself, but it can take up to 24 hours. Try running **Extensions >> Bkper >> Update** to trigger recognition.

If the problem persists, try these solutions (or a combination):

**1. The Add-on is not installed** — [Install the Add-on](http://bkper.com/docs/guides/google-sheets/install.md) from the [Google Workspace Marketplace](https://workspace.google.com/marketplace/app/bkper/360398463400), open it from **Extensions >> Bkper >> Open**, and reload your Google Sheet.

**2. The Add-on hasn't been opened yet** — Open the Add-on once from **Extensions >> Bkper >> Open**.

**3. The spreadsheet copy is broken** — Make another copy of the broken spreadsheet. If this works, you can track [this issue](https://issuetracker.google.com/issues/161245054) for a future fix.

**4. The Add-on installation is broken** — [Remove the Add-on](https://support.google.com/docs/answer/2942256) from Google Sheets and [install](https://workspace.google.com/marketplace/app/bkper/360398463400) it again.

## 2. Error: Invalid Query

![Google Sheet cell showing an Invalid Query error from a Bkper function](http://bkper.com/docs/_astro/known-issues-invalid-query.CSNx-zFW.png)

This means the query you are running is not valid. Copy the query and paste it in the Bkper dashboard search to verify it works:

![Bkper dashboard search bar where you can test your query](http://bkper.com/docs/_astro/known-issues-search.qO5nksh0.png)

Some tips:

- When building dynamic queries with `TEXT()` and `&` concatenation, construct the query in a cell first, then reference that cell in the Bkper function (as in the [Simple General Ledger Report example](https://docs.google.com/spreadsheets/d/1ynzuvDElnz5zLYaMSmANy1t9c4Vv9eKeZ4vXjteGCsY/edit#gid=1349638172))
- Check that the date format in your query matches the format in your Book Settings
- Check quotes around Account and Group names
- Check the operators in the [Query Guide](http://bkper.com/docs/guides/using-bkper/search-and-queries.md)

## 3. Error: Array Result Was Not Expanded

![Google Sheet showing an Array result was not expanded error](http://bkper.com/docs/_astro/known-issues-array-error.OO3OF_Yx.png)

This means the result returned from Bkper needs more rows in your spreadsheet. Select some rows in the middle of the dataset and add more rows until the result appears:

[Image: Adding rows to a Google Sheet to resolve the array expansion error]

**See also:** [Google Sheets Add-on](http://bkper.com/docs/guides/google-sheets.md) | [Bkper Functions Reference](http://bkper.com/docs/guides/google-sheets/functions-reference.md)

---
source: /docs/guides/troubleshooting/known-issues-web-app.md

# Known Issues - Bkper Web App

Bkper is constantly improving, but there are a few known issues you might encounter. Some are browser-related and outside of Bkper's control.

## Login issues

Some browser default configurations can block the login to Bkper with your Google Account. If you cannot log in, check the three scenarios below.

### Third-party cookies

The Google login requires third-party cookies to function. If they are blocked, the Bkper login will not work.

**Chrome**: Go to your cookie settings at `chrome://settings/content/cookies` and select **Allow all cookies**.

**Other browsers**: Check the cookie settings documentation for [Firefox](https://support.mozilla.org/en-US/kb/enable-and-disable-cookies-website-preferences#w_how-do-i-change-cookie-settings), [Internet Explorer](https://support.microsoft.com/en-us/help/17442/windows-internet-explorer-delete-manage-cookies), or [Safari](https://support.apple.com/guide/safari/manage-cookies-and-website-data-sfri11471/mac).

### Multiple Google Accounts in the same session

When you are signed in to more than one Google Account in the same browser session, the authentication on login may not work properly.

To resolve this:

- Sign out from Google by visiting [https://mail.google.com/mail/logout?hl=en](https://mail.google.com/mail/logout?hl=en)
- Sign in again at [https://app.bkper.com/](https://app.bkper.com/)

To prevent this problem, create different browser profiles — one for each Google account.

### Error 400: admin_policy_enforced

![Browser showing Error 400 admin_policy_enforced when trying to log in to Bkper](http://bkper.com/docs/_astro/known-issues-web-app-1.BiBlZCVc.png)

To resolve this error:

- Go to [https://myaccount.google.com/permissions](https://myaccount.google.com/permissions)
- Find **Bkper** and revoke access

![Google Account permissions page showing the option to revoke Bkper access](http://bkper.com/docs/_astro/known-issues-web-app-2.2egYFMrX.png)

- Go to [https://app.bkper.com/](https://app.bkper.com/) and sign in again

> **Note**
> After re-authorizing, if you use any add-on such as the Google Sheets add-on or Google integrations, you may need to reopen and re-authorize them as well.

---
source: /docs/guides/using-bkper/accounts.md

# Accounts

Accounts are the foundation of every Bkper Book. Every transaction is recorded between two Accounts, so the way you organize them determines the clarity of your financial data. For the conceptual overview, see [Core Concepts — Accounts](http://bkper.com/docs/core-concepts.md#accounts).

## Create an Account

Open your Book and navigate to the **Chart of Accounts** page. Click **New Account**, enter a name, and select the appropriate [Account Type](http://bkper.com/docs/core-concepts.md#account-types) (Asset, Liability, Incoming, or Outgoing). Press **Save** and the Account is ready for use.

- If it represents something you **own**, like a bank balance or cash, select **Asset**
- If it tracks what you **owe**, like loans or credit cards, choose **Liability**
- If it's for **money coming in**, such as sales or salary, go with **Incoming**
- If it's for **expenses**, like rent or transportation, select **Outgoing**

[Image: Animated walkthrough of creating a new Account in the Chart of Accounts]

> **Note**
> Account names must be unique within a Book.
### Creating from a Group

If your Book already has Groups, you can add an Account directly from the left menu. On the Transactions page, click the **three dots** next to the Group, select **Add New Account**, enter a name, and save. The new Account is automatically part of that Group.

[Image: Animated walkthrough of creating an Account directly from a Group in the left menu]

### From the Accounts page

Open the **Accounts** page, hover over the Account you want to modify, and click the **pencil icon**. Update the name or type, then press **Save**.

![Editing an Account from the Accounts page](http://bkper.com/docs/_astro/accounts-manage-3.C211F2KR.png)

### From the Transactions page

In the left menu, hover over the Account and click the **three dots**. Select **Edit**, make your changes, and save.

![Editing an Account from the Transactions page left menu](http://bkper.com/docs/_astro/accounts-manage-4.CqTH3Ldz.png)

> **Note**
> - Editing an Account does not affect its balance values.
> - All transactions that reference the Account are updated with the new name automatically.
### Account properties

You can attach [custom properties](http://bkper.com/docs/guides/using-bkper/properties.md) to any Account — contact information, external identifiers, or metadata for automations. Emails, URLs, and phone numbers stored as properties are rendered as **clickable links** in the chart of accounts, so clicking a phone number opens your calling app and clicking an email opens your mail client.

Account properties are managed from the account editor's properties section. They are commonly used to store values that bots need — for example, the [Exchange Bot](http://bkper.com/docs/guides/automations/exchange-bot.md) reads `exc_code` from each account to know its currency. See the [Properties guide](http://bkper.com/docs/guides/using-bkper/properties.md#account-properties) for details.

### Comments on accounts

You can leave [comments](http://bkper.com/docs/guides/using-bkper/comments.md) on any account — notes about its purpose, requests for a collaborator, or context for auditors. Select the account and click the comment icon. Mention a teammate with **@username** to notify them directly.

## Archive and Unarchive

Archiving removes an Account from the active list while keeping it in your historical records. This prevents new transactions from being recorded under it and keeps your Balance Sheet consistent.

Open the **Accounts** page, select the Account, and click **Archive**.

![Archiving an Account from the Accounts page](http://bkper.com/docs/_astro/accounts-manage-6.D8NtR11E.png)

> **Note**
> Archived Accounts cannot be used in [search queries](http://bkper.com/docs/guides/using-bkper/search-and-queries.md).
To restore an archived Account, open the **Accounts** page, select the **Archived** section from the left menu, find the Account, check the box next to it, and click **Unarchive**. The Account becomes available for new transactions again.

[Image: Animated walkthrough of unarchiving an Account]

### Searching by account

Use the [query language](http://bkper.com/docs/guides/using-bkper/search-and-queries.md) to filter transactions by account. The `account:` operator matches both From and To sides, while `from:` and `to:` target a specific direction — for example, `from:Cash after:$m-3` shows all outflows from Cash in the last 3 months. Archived accounts are excluded from query results.

## Delete an Account

An Account that has **never been used in any transaction** can be permanently deleted. Open the **Accounts** page, select the Account, click the **Trash Bin icon**, and confirm.

![Deleting an unused Account from the Accounts page](http://bkper.com/docs/_astro/accounts-manage-5.A3Xn06rC.png)

> **Caution**
> If an Account has been used in at least one transaction, it cannot be deleted — it can only be **archived** to preserve historical records.
## Accounts Menu

The **Accounts Menu** is located on the left side of the Bkper dashboard. It displays the balances of all your Assets, Liabilities, Incoming, and Outgoing Accounts and Groups in one consolidated view.

![The Accounts Menu showing all Account and Group balances](http://bkper.com/docs/_astro/accounts-menu-1.mBI_6_cL.png)

Balance values are presented with two visual cues:

- **Colors** — each balance uses the same color as its Account Type or Group, making it easy to distinguish between Assets, Liabilities, Incoming, and Outgoing items.
- **Parentheses** — a number wrapped in parentheses indicates a negative balance.

![Color-coded balances with parentheses indicating negative values](http://bkper.com/docs/_astro/accounts-menu-2.28EwKLXO.png)

Click any **Account or Group name** to filter the transaction list. Click a **balance value** to open both the filtered transactions and the [Chart Reports](http://bkper.com/docs/guides/using-bkper/chart-reports.md).

### Running balance

When you filter transactions by a single permanent Account, Bkper shows that Account's running balance for each transaction. This value appears toward the end of the transaction row and represents the Account balance immediately after that transaction is applied. Use it to follow how a bank, cash, or credit card balance changes over time and to confirm end-of-day or end-of-period positions.

## Opening Balances

When you start using Bkper, your Accounts need to reflect their real-world values. If your bank account has $1,000 today, your Bkper Bank Account should show $1,000. This is called setting an **opening balance**.

### Setting Your Opening Balance

To set the balance of any Account, right-click on it in the sidebar and select **Adjust balance**. Enter the actual balance value and click **Continue**. Your Account now shows the correct balance.

Bkper automatically records a Transaction to set the balance. You will see this Transaction in your ledger with the description "Balance adjustment", moving resources from an "initialize" Account to your target Account.

This works for any permanent Account — whether it is a bank balance (Asset), a credit card debt (Liability), or a loan you owe (Liability). Right-click, adjust, and you are done.

[Image: Setting an opening balance in Bkper using the Adjust balance feature]

### Example: Starting Fresh

Imagine you are setting up Bkper for the first time. Your bank shows $5,000, you have $2,000 on your credit card, and you owe $10,000 on a car loan.

Right-click each Account and adjust:

- **Bank Account** → adjust to 5,000
- **Credit Card** → adjust to 2,000
- **Car Loan** → adjust to 10,000

Each adjustment creates a Transaction, and your Book now mirrors reality. You are ready to start recording your daily Transactions.

### What Happens Behind the Scenes

When you adjust a balance, Bkper records a Transaction using an "initialize" Account. This Account is created automatically and serves as the counterpart for all opening balance entries.

For an Asset like a bank account:

`11/02/2026 1,000 initialize >> Bank Account Balance adjustment`

For a Liability like a credit card:

`11/02/2026 2,000 Credit Card >> initialize Balance adjustment`

The initialize Account is an Incoming type Account. Once you have set all your opening balances, you can archive it to keep your Account list clean. Archiving only hides it from active use — the opening balance transactions and their effect on the ledger remain part of your records.

### When to Use Opening Balances

Opening balances are typically set when:

- You first start using Bkper
- You migrate from another system
- You begin tracking a new Account mid-year

Only permanent Accounts (Asset and Liability types) need opening balances. Incoming and Outgoing Accounts track activity within the selected reporting period rather than carrying a position forward like Asset and Liability accounts do.

### Making Corrections Later

If you need to correct a balance after initial setup — perhaps you discovered a discrepancy or need to account for an unexpected adjustment — you can use the same **Adjust balance** feature at any time. Bkper will record the necessary Transaction to bring the balance to your specified value.

## Batch Export and Import

You can manage Accounts in bulk using the [Bkper Add-on for Google Sheets](http://bkper.com/docs/guides/google-sheets.md). Use **[Fetch Accounts](http://bkper.com/docs/guides/google-sheets/fetching-data.md#accounts)** to export your Chart of Accounts to a spreadsheet, and **[Save Accounts](http://bkper.com/docs/guides/google-sheets/recording-data.md#accounts)** to create Accounts in batch — including types, Groups, and Custom Properties.

[Image: Animated walkthrough of exporting Accounts to Google Sheets]

[Image: Animated walkthrough of importing Accounts from Google Sheets]

## Related

- **[Chart of Accounts](http://bkper.com/docs/guides/using-bkper/chart-of-accounts.md)** — build and organize your account structure with Groups and hierarchies
- **[Balances Audit](http://bkper.com/docs/guides/using-bkper/balances-audit.md)** — how Bkper automatically checks balance consistency

---
source: /docs/guides/using-bkper/attachments.md

# Attachments

Attachments keep all supporting documents — receipts, invoices, contracts — together with the transactions they belong to, enabling fully paperless bookkeeping. Instead of filing documents in separate folders or email threads, you attach them directly to the financial entry they support.

## File types and limits

You can add **multiple files** to any transaction, and there is no limit on the total number of attachments per Book. The maximum size per file is **20 MB**. Any file type is supported.

| File type | Behavior |
| --- | --- |
| Images (`.jpeg`, `.jpg`, `.png`, `.gif`, `.webp`) | Rendered inline in the browser |
| `.pdf` | Rendered inline in the browser |
| `.txt` or `.csv` | Each row is converted into a transaction |
| All other types | Available for download, not previewed inline |

> **Note**
> CSV and TXT files are a special case — dropping one into your Book creates individual draft transactions for each row, rather than attaching the file to a single transaction. This is useful for importing bank statements or bulk entries.
## Adding attachments

There are several ways to attach files to transactions.

### Via the paperclip icon

Click the **paperclip** on the input bar and follow the upload flow. The file is attached to the transaction you are recording.

![Clicking the paperclip icon on the Bkper input bar to attach a file](http://bkper.com/docs/_astro/attachments-1.D8zRQ2nd.png)

### Drop onto the form area

Drag and drop files onto the **gray form section** above the transaction list. This automatically creates a new transaction with all dropped files attached.

![Dragging a file onto the gray form section to create a transaction with an attachment](http://bkper.com/docs/_astro/attachments-2.CVD7v7B3.png)

### Drop into the white space

Drop files into the **white space below** the transaction list. Each file becomes a separate new **draft**.

![Dropping files into the white space to create individual drafts](http://bkper.com/docs/_astro/attachments-3.Da5jQPEn.png)

### Drop onto an existing transaction

Drop one or more files directly **onto a transaction row** to attach them to that existing transaction.

![Dropping a file onto an existing transaction to add it as an attachment](http://bkper.com/docs/_astro/attachments-4.BXus-4ml.png)

### Email forwarding

Forward invoices, receipts, or other documents to your Book's email address and the [Bkper Agent](http://bkper.com/docs/guides/automations/bkper-agent.md) creates a draft transaction with the files attached. This is especially useful for processing documents that arrive by email — forward them directly without downloading first. See [Record by Email](http://bkper.com/docs/guides/using-bkper/record-by-email.md) for setup details.

### Comment email replies

When you [reply to a comment notification email](http://bkper.com/docs/guides/using-bkper/comments.md#email-replies) with an attachment, Bkper automatically attaches the file to the same transaction the comment is on.

### Mobile capture

On mobile devices, use the camera or file picker to attach photos of receipts or documents. Transactions recorded from a mobile device also include a **geo-reference link** automatically, adding location context to the entry.

## Viewing attachments

Click the **paperclip icon** on a transaction row to expand it and view the attached files inline.

![Viewing an attachment inline by clicking the paperclip on a transaction](http://bkper.com/docs/_astro/attachments-6.BKipHcJ7.png)

## Removing attachments

Open the transaction and click the **X** on the attachment you want to remove. To add more files to the same transaction, click the **paperclip** inside the open transaction.

![Removing an attachment from a transaction by clicking the X icon](http://bkper.com/docs/_astro/attachments-5.BpreGMQh.png)

## Audit trail

Every attachment action — adding or removing a file — generates an [Event](http://bkper.com/docs/guides/using-bkper/events.md) recording who performed the action and when. This means you always have a complete history of document changes, even for removed attachments.

## Combining with external links

You can use both attachments and [external links](http://bkper.com/docs/guides/using-bkper/external-links.md) on the same transaction. Attach the receipt as a file and link to the invoice in your billing system — giving you both a local copy and a reference to the source.

---
source: /docs/guides/using-bkper/balances-audit.md

# Balances Audit

Accounts with recent balance changes are subject to an **Automatic Balance Audit** that runs periodically — approximately every hour on books where balances have changed. The audit takes anywhere from a few seconds to a few minutes, depending on the volume of transaction history that has not yet been audited.

For the conceptual overview of how balances work, see [Core Concepts — Balances](http://bkper.com/docs/core-concepts.md#balances).

A clock icon next to balance values in the left menu indicates the audit has not yet run. Once the audit completes, the icon disappears.

![Bkper sidebar showing the clock icon next to account balances that have not yet been audited](http://bkper.com/docs/_astro/balance-not-audited-yet.D5P4gIqF.png)

The automatic audit guarantees that balance values are consistent with the transaction history in your book. Although extremely unlikely, any inconsistency detected by the audit triggers an automatic settlement that restores the correct balance based on the transaction history.

> **Note**
> The Balance Audit is not the same as a reconciliation with real-life accounts. It is an internal consistency check that ensures balances match the recorded transactions.
## Triggering an audit manually

If you need the audit to run immediately rather than waiting for the next automatic cycle, hold the **Shift** key and click the **reload** button in your book.

![Bkper interface showing how to trigger a manual balance audit by holding Shift and clicking the reload button](http://bkper.com/docs/_astro/bkper-trigger-balanceaudit.DU_NmZe1.png)

The audit runs asynchronously. You can confirm it has finished when the clock icon next to the affected balances disappears.

## Background

Bkper stores accounts and transactions in a distributed, highly scalable database that replicates data across a wide geographic area for reliability and fault tolerance.

This architecture provides a robust foundation for finance and accounting in the cloud, but it introduces a potential [double-spending](https://en.wikipedia.org/wiki/Double-spending) problem — a scenario where concurrent operations could, in very rare cases, lead to balance inconsistencies.

To address this, Bkper developed an audit infrastructure based on [consensus](https://en.wikipedia.org/wiki/Consensus_(computer_science)) that has been refined over more than six years. This system runs periodically and ensures all balances remain strictly consistent.

---
source: /docs/guides/using-bkper/book-sharing.md

# Book Sharing

Bkper is a collaborative bookkeeping service that allows multiple people to access and work in the same Book, each with different levels of permissions. Everyone sees real-time balance sheets and profit & loss statements, keeping the whole team aligned.

![Bkper collaboration overview showing multiple users working in a shared Book](http://bkper.com/docs/_astro/book-sharing-1.-A0Ggeo8.png)

## Sharing a Book

Share a Book by choosing the type of access each person should have. Open the Book you want to share and click the blue **Share** button.

![Share button location in a Bkper Book](http://bkper.com/docs/_astro/book-sharing-2.DVu2tiEw.png)

In the **Sharing Settings** dialog, use the dropdown menu next to each email address to select the permission level. Click **Save** for the changes to take effect.

![Sharing settings dialog with permission dropdown menus](http://bkper.com/docs/_astro/book-sharing-3.DBPUiMqk.png)

## Visibility

You can control how visible your Books are to other people, from completely private to accessible by anyone with the link.

To change the visibility of a Book, open it and click the blue **Share** button. In the **Sharing Settings** dialog, click **Change** on the first line to choose between "available to anyone" or "restricted to only the people with access." Click **Save** to apply.

[Image: Animated walkthrough of changing Book visibility in Bkper]

> **Caution**
> Any data in a publicly visible Book can be accessed by anyone with the link. Login is still required.
## Permissions

When you share a Book with other people, you choose between **Owner**, **Editor**, **Record and View**, **View Only**, and **Record Only** access. You can change these permissions at any time.

| Capability | Owner | Editor | Record & View | View Only | Record Only |
|---|---|---|---|---|---|
| Create, modify, and delete Accounts and Groups | ✓ | ✓ | | | |
| Record Drafts | ✓ | ✓ | ✓ | | ✓ |
| Post Transactions | ✓ | ✓ | ✓ | | |
| Check / Uncheck Transactions | ✓ | ✓ | | | |
| Delete Drafts | ✓ | ✓ | ✓ | | ✓ |
| Revert Posted Transactions | ✓ | ✓ | ✓ | | |
| View Records & Balance Values | ✓ | ✓ | ✓ | ✓ | |
| Share and Visibility | ✓ | ✓ | | | |
| Lock Transactions | ✓ | ✓ | | | |
| Unlock Transactions | ✓ | | | | |

> **Note**
> The **lock date** feature is only available on Bkper Business or higher subscription tiers.
![Permission levels displayed in the Bkper sharing dialog](http://bkper.com/docs/_astro/book-sharing-5.CD1noavl.png)

> **Note**
> Record Only users can only use their smartphones (iOS and Android) to record and delete drafts with the Bkper App.
## Removing sharing privileges

As the owner of a Book, you can remove or change the permission settings for any collaborator at any time, giving you full control over who can access the Book.

---
source: /docs/guides/using-bkper/books.md

# Books

A **Book** is a self-contained ledger — the complete scope of an entity, whether an individual, a project, or a business. Every Account, Transaction, and Group lives within a Book, and every Book balances to zero. For a deeper look at the model, see [Core Concepts — Books](http://bkper.com/docs/core-concepts.md#books).

## Create a Book

On the [Book list](https://bkper.app/books/), click **New Book (+)** at the top. Your new empty Book is ready immediately.

To start with pre-configured accounts, choose a template from the Book list instead — such as **Business General Ledger** or **Personal Finances** — then click **View Book Template** and **Copy this Book**. Rename it and adjust the accounts and groups to fit your situation.

## Book Settings

Book settings are configured individually per Book. Open your Book and click the Configuration Menu (⚙️) on the right side. Select **Settings** to configure your preferences.

### Settings & Preferences

The following settings are available:

- **Time zone**
- **Date pattern**
- **Decimal places** — up to 8 digits, supporting cryptocurrencies
- **Number format**
- **Page size**
- **Lock date** — see [Closing & Lock Dates](#closing--lock-dates)
- **Closing date** — see [Closing & Lock Dates](#closing--lock-dates)

### Book properties

You can attach [custom properties](http://bkper.com/docs/guides/using-bkper/properties.md) to a Book to store metadata that applies to the entire ledger — a tax ID, company address, or base currency code. These key/value pairs are especially valuable in automated workflows: bots read Book properties to determine how they should behave, such as the [Exchange Bot](http://bkper.com/docs/guides/automations/exchange-bot.md) reading `exc_code` to know the base currency.

To manage Book properties, open **Settings** (⚙️) → **Configurations > Book Properties** and add or modify key/value pairs. See the [Properties guide](http://bkper.com/docs/guides/using-bkper/properties.md#book-properties) for details and examples.

### Renaming a Book

To rename a Book, open it and navigate to the Transactions or Accounts page. Click the Book name at the top-right and type a new name.

### Changing Book Ownership

Only the current owner can request an ownership transfer:

- Have the current owner send a request to [support@bkper.com](mailto:support@bkper.com).
- [Share the Book](http://bkper.com/docs/guides/using-bkper/book-sharing.md) with the new owner, granting them edit permissions.
- Include the new owner's email address and the Book ID (found in the Book URL) in the request.

> **Note**
> Ownership transfers are handled by the Bkper support team and cannot be done self-service at this time.
### Language

The **user language** is set by each individual user and applies system-wide across all their Books. Two users can work on the same shared Book, each with a different language.

Change your language from the Book overview, or from the Configuration Menu (⚙️) → **Settings**.

> **Tip**
> Bkper supports recording and querying in multiple languages, including a mix of left-to-right (LTR) and right-to-left (RTL) scripts.
### Closing & Lock Dates

Bkper provides two mechanisms to protect past periods from modifications: the **lock date** and the **closing date**. Both prevent changes to Transactions before a given date, but differ in who can adjust them.

#### Lock date

The lock date **prevents any modification prior to its date**. Set it after filing a tax return or completing an interim review to protect the corresponding period. Both the Book owner and editors can set or adjust the lock date.

To set a lock date, open the Configuration Menu (⚙️) → **Settings**, set the **Lock date**, and press **Save**.

> **Note**
> The lock date is available on the **Bkper Business Plan**.
#### Closing date

The closing date enforces a **permanent closed period**. It works like the lock date — blocking Transaction changes before the date — but only the Book **owner** can remove it or set it backward.

To set a closing date, open the Configuration Menu (⚙️) → **Settings**, set the **Closing date**, and press **Save**.

> **Note**
> The closing date is available on the **Bkper Business Plan**. Only the Book **owner** can remove the closing date or set it backward.
#### Lock date vs. closing date

| Feature | Who can set it | Who can remove or move it backward |
| --- | --- | --- |
| **Lock date** | Owner and editors | Owner and editors |
| **Closing date** | Owner and editors | **Owner only** |

If both are set on the same Book, Transactions are blocked up to the **most recent** of the two dates. Use the lock date for day-to-day operational locks and the closing date for definitive period closes.

## Copy a Book

To copy a Book, open it and click the Configuration Menu (⚙️), then select **Make a copy...**

Give the copied Book a name. To include transactions, check **Copy Transactions** and optionally enter a date from which transactions will be copied — leave blank to copy all. Press **Save**.

> **Note**
> Only Book owners can copy a Book with its transactions.
## Delete a Book

> **Caution**
> Deleted Books **cannot** be recovered. Make sure you no longer need the data before proceeding.
To delete a Book, open it and click the Configuration Menu (⚙️), then select **Delete this book**. In the confirmation dialog, mark the checkbox and click **Remove**.

## BookID

The **bookid** is a unique identifier for each Book in your Bkper account — a combination of letters, numbers, and symbols that appears in the URL when you open a Book. It is generated when the Book is created and **cannot be changed**.

### Where to find it

Open any Book in Bkper and look at the address bar — the bookid is the string between `/books/` and the next `/` in the URL.

### Using the bookid in integrations

Use the bookid whenever you need to reference your Book from external tools — Google Sheets, Google Apps Script, the REST API, or other integrations.

In Bkper Functions on Google Sheets, the bookid tells each function which Book to fetch data from. Placing it in a configuration cell lets you repoint an entire report to a different Book by changing one value.

**See also:** [Google Sheets — Financial Statements](http://bkper.com/docs/guides/templates/financial-statements.md) | [Profit and Loss Report](http://bkper.com/docs/guides/templates/profit-and-loss.md)

---
source: /docs/guides/using-bkper/chart-of-accounts.md

# Chart of Accounts

A Chart of Accounts is a list of accounts used by an entity, often following a Generally Accepted Accounting Standard (GAAP) for uniformity and understanding by third parties like analysts and auditors.

Bkper's Chart of Accounts offers the same functionality with greater flexibility, aligning with GAAP standards like Balance Sheets and Income Statements, while also serving managerial purposes such as tracking results and cost management.

![A Chart of Accounts in Bkper showing groups and accounts organized in a structured hierarchy](http://bkper.com/docs/_astro/chart-of-accounts-overview.BFgwe5CW.png)

## Grouping accounts

A [Group](http://bkper.com/docs/core-concepts.md#groups) in Bkper's Chart of Accounts is a powerful tool for categorizing related accounts. It combines and calculates the total balance of all accounts within the group, simplifying data presentation and improving financial analysis.

Think of a Group as a container for similar accounts. For example, an **Expenses** group gathers various related accounts together.

![An Expenses group containing multiple expense accounts with a consolidated total](http://bkper.com/docs/_astro/chart-of-accounts-grouping.DA1AqJGL.png)

As your financial records evolve, you might need more specific categories like **Marketing Expenses** and **Operational Expenses**. You can create these subgroups and categorize your existing accounts accordingly.

![Expenses group divided into Marketing Expenses and Operational Expenses subgroups](http://bkper.com/docs/_astro/chart-of-accounts-subgroups.B82aPKk1.png)

The beauty of this flexibility is that you can maintain the original group as the parent while further detailing subcategories and accounts.

## Financial insights through grouping

In your Chart of Accounts, you can represent different financial categories — Expenses, Costs, Revenues, Assets, Liabilities — but you can also represent Incomes and Equities by grouping different [Account Types](http://bkper.com/docs/core-concepts.md#account-types).

Incoming (green) and Outgoing (red) type accounts together in one group give an **Income** result.

![Incoming and Outgoing accounts grouped together showing the Income result](http://bkper.com/docs/_astro/chart-of-accounts-income.B3TlQhy_.png)

On the Balance Sheet, grouping Asset (blue) and Liability (yellow) type accounts gives you the **Equity** position.

![Asset and Liability accounts grouped together showing the Equity position](http://bkper.com/docs/_astro/chart-of-accounts-equity.DP7AhXUl.png)

## Scaling your Chart of Accounts

**Start simple** — Begin with a basic Chart of Accounts that covers your essentials. You can start with just four accounts (Assets, Liabilities, Revenue, and Expenses) and two groups (Equity and Income). Minimalistic, yet it provides a solid foundation for understanding your financial position and performance.

![A minimal Chart of Accounts with four accounts and two groups](http://bkper.com/docs/_astro/chart-of-accounts-simple.ImmZlfal.png)

**Add detail** — As your operations expand, questions arise. How much are we spending? Who owes us money? Who do we need to pay quickly? To answer these questions efficiently, enhance your Chart of Accounts with more specific categories:

- **Expense Categories** — Add general categories under Expenses to gain more control over spending
- **Balance Sheet** — Include receivables under Assets and payables under Liabilities for deeper insights into financial performance and position

![A more detailed Chart of Accounts with expense categories and balance sheet detail](http://bkper.com/docs/_astro/chart-of-accounts-detailed.BSRjA-0j.png)

**Meet external requirements** — As your business grows, so do external requirements like provisioning, taxes, reporting, and compliance. Your Chart of Accounts adapts to reflect these obligations. Beyond external demands, a robust Chart of Accounts empowers you to analyze your business deeply — implementing cost accounting for multiple product lines, enabling data-driven decisions with precision.

Your Chart of Accounts is not static; it's a flexible tool that evolves with your activities.

### Adding accounts to a Group

Navigate to your Book and select the Group in the left menu by clicking the sandwich button to its right. Click **Add New Account** on the popup, enter the account name, and click **Save**. Repeat for each account you want to add.

![Adding a new account to the Marketing Expenses group through the popup menu](http://bkper.com/docs/_astro/chart-of-accounts-add-account.BRC_riYy.png)

### Adding a parent Group

Click on the Group you want to nest, then click **Edit** on the popup. In the group's settings, select the **Parent** from the dropdown list and save. The group hierarchy updates automatically.

![Setting Expenses as the parent group for Marketing Expenses in the group editor](http://bkper.com/docs/_astro/chart-of-accounts-parent-group.Bjcq0Ra0.png)

## Hierarchy rules

![A Chart of Accounts hierarchy showing the grouping rules and constraints](http://bkper.com/docs/_astro/chart-of-accounts-hierarchies.Coq4RU37.png)

When building hierarchies, keep these conditions in mind:

- **Unique group placement** — A group can be part of only one hierarchy. Once placed within a hierarchy, it cannot simultaneously belong to another
- **Non-grouping parent** — A parent group cannot contain accounts directly. It serves as a higher-level category for subgroups, ensuring that balance totals always sum correctly
- **Single account use per hierarchy** — Each account can only appear once within a hierarchical structure. An asset can only be counted once on the Balance Sheet, but you can use that same asset in a separate hierarchy — for example, to track your portfolio
- **Balance Sheet grouping** — Groups under the Balance Sheet can only hold Asset and Liability type accounts
- **Income Statement grouping** — Groups under the Income Statement can only include Incoming and Outgoing type accounts

---
source: /docs/guides/using-bkper/chart-reports.md

# Chart Reports

Bkper Charts represent balance values across any range of time, giving you a fast and visual way to analyze financial trends.

## Opening Charts

There are two ways to open Charts in a Book.

**From a balance value** — on the Transactions page, click a **balance value** next to any Account or Group in the left menu. Both the chart and the filtered transactions appear.

![Opening charts by clicking a balance value in the left menu](http://bkper.com/docs/_astro/chart-reports-1.Bnp8D2iw.png)

> **Note**
> Clicking an **Account or Group name** shows only the filtered transactions. Clicking the **balance value** opens both the Charts and the transactions.
**From the Charts button** — click the **Charts button** wherever it appears in your Book to open the Charts panel.

{/* soft-remove
![Opening charts via the Charts button](http://bkper.com/docs/_astro/chart-reports-2.Caq_daCi.png)
*/}

## Closing Charts

Click the **X** in the top-right corner of the Charts panel, or click the **sidebar toggle button** in the menu bar.

![Closing the Charts panel](http://bkper.com/docs/_astro/chart-reports-3.CEa5fEBl.png)

## Interacting with Charts

Hover over any line or bar to see the balance value on a specific date. The level of detail depends on the query in the search bar.

![Hovering over a chart line to see the balance value on a specific date](http://bkper.com/docs/_astro/chart-reports-4.f6tNeUE_.png)

## Drilling down through the hierarchy

Charts mirror the [Chart of Accounts](http://bkper.com/docs/guides/using-bkper/chart-of-accounts.md) hierarchy. Click on a **line or bar** that represents a **Group** to expand the next level of the hierarchy in the chart.

For example, starting at the top-level **Net Assets** Group:

![Chart showing the Net Assets root Group](http://bkper.com/docs/_astro/chart-reports-5.DMrs999v.png)

Click the **Net Assets** line to reveal **Assets** and **Liabilities**:

![Chart drilled down to show Assets and Liabilities](http://bkper.com/docs/_astro/chart-reports-6.BaQAn1Bp.png)

Continue clicking to reach the individual Accounts at the deepest level:

![Chart drilled down to individual Accounts](http://bkper.com/docs/_astro/chart-reports-7.BDUGl3wV.png)

Click the **back arrow** in the top-left corner of the Charts panel to move up one level in the hierarchy.

![Using the back arrow to navigate up one level in the chart hierarchy](http://bkper.com/docs/_astro/chart-reports-8.CH9GqcXs.png)

## Analyzing transactions from Charts

Click on an **Account line or bar** in the chart to update the transaction list below with only that Account's transactions.

![Transaction list filtered by clicking an Account in the chart](http://bkper.com/docs/_astro/chart-reports-9.OyIK0uFV.png)

> **Note**
> - Charts always reflect the current search query.
> - With Charts open, you can click any Account or Group in the transaction list to switch the chart to that item.

---
source: /docs/guides/using-bkper/collections.md

# Collections

[Collections](http://bkper.com/docs/core-concepts.md#collections) create a relationship between Books that streamlines working with multiple Books. This can be as simple as opening multiple Books in a collection at once and switching between them in one click, or as sophisticated as creating a reference for automations (Bots or Apps) that work on all the Books in the collection.

You might track the same resources in multiple currencies, or have several branch offices in one collection and switch between them with ease.

## Creating a collection

On the Book list, press **More** in the top right corner and select **Create new collection**. Enter a name for the collection and press **Save**.

[Image: Animated walkthrough of creating a new collection in Bkper]

## Adding a Book to a collection

Click and hold the Book you want to move, drag it over the collection, and release.

[Image: Animated walkthrough of dragging a Book into a collection]

## Removing a Book from a collection

Click **More** on the right side of the Book you want to take out of the collection.

[Image: Animated walkthrough of removing a Book from a collection]

> **Note**
> The Book stays available on your Book list — it is not deleted.
## Deleting a collection

Click **More** on the right side of the collection, then select **Delete** and confirm.

[Image: Animated walkthrough of deleting a collection in Bkper]

> **Note**
> The Books in the removed collection remain available on your Book list — only the collection is removed.
## Switching between Books

Open a Book that is part of a collection. Click on the tabs at the bottom of the browser to move between Books in the collection.

[Image: Animated walkthrough of switching between Books in a collection using tabs]

> **Tip**
> Switching between Books in a collection maintains the current context — the current query being executed is preserved between tabs.
## Permissions

Collections are unique per user or domain. Only the owner who created the collection can edit it or add/remove Books. To share Books from your collection, grant permission for each Book separately, as access permissions are managed at the Book level. See [Book Sharing](http://bkper.com/docs/guides/using-bkper/book-sharing.md).

---
source: /docs/guides/using-bkper/comments.md

# Comments

Comments let you communicate directly within the context of your financial data — leave requests for collaborators, add contextual notes, maintain a historic reference, and move toward paperless bookkeeping without leaving Bkper.

## Where comments attach

Every comment is **contextual** — it references whatever is on your screen at the time. Comments can attach to five different contexts:

- **A single transaction** — select a transaction and comment to annotate that specific entry
- **A search query result** — run a query and comment to discuss the filtered set of transactions
- **An account** — select an account to leave a note visible to anyone viewing that account
- **A group** — select a group to coordinate with your team about that category
- **A hashtag** — select a hashtag to discuss all entries carrying that tag

This contextual attachment means comments stay relevant — they live where the conversation naturally belongs, not in a separate thread or email chain.

## Making a comment

Select a transaction, account, group, hashtag, or run a search query, then click the **comment icon**. Write your comment — mention a collaborator with **@username** to notify them — and click **Save**.

[Image: Making a comment on a search query result in Bkper — selecting items, writing a comment, and saving]

> **Tip**
> Add **@username** to your comments to make sure the mentioned user receives a notification.
## Deleting a comment

Open the comments sidebar and press the **trash bin icon** on the comment you want to remove.

![Deleting a comment from the comments sidebar in Bkper](http://bkper.com/docs/_astro/comments-2.Bu6XKnVg.png)

Deleted comments are recorded in the [Events](http://bkper.com/docs/guides/using-bkper/events.md) history, so there is always an audit trail — you can see who deleted what and when.

![Activity history showing a deleted comment entry in Bkper](http://bkper.com/docs/_astro/comments-3.BFMFSIe2.png)

> **Note**
> Comments cannot be edited — only deleted. If you need to correct a comment, delete it and post a new one.
## Notifications and @mentions

When a comment includes **@username**, that user receives an **email notification** and sees a **red dot** on the comment icon the next time they open the Book. Comments attached to a specific transaction also display a **black comment icon** on that transaction row.

![Comment notification indicators — red dot on the comment icon and black icon on a transaction](http://bkper.com/docs/_astro/comments-4.Bz6fSDhP.png)

The comment icon on a transaction turns **white** once you have read the comment, so you can easily distinguish between new and seen comments.

## Email replies

When a user is mentioned with **@username** in a comment attached to a single transaction, they receive an email notification. They can **reply directly to that email** — even including an attachment. Bkper adds the reply as a new comment on the same transaction, and attaches any files to that transaction automatically.

[Image: Email notification for a Bkper comment with a reply that creates a new comment and attachment]

> **Note**
> When the comment is not attached to a single transaction (for example, it references a search result), any attachment in the email reply is added to a newly created draft instead.
## Audit trail

Every comment action generates an [Event](http://bkper.com/docs/guides/using-bkper/events.md) — both creation and deletion are logged with who performed the action and when. This means comments form part of your Book's complete audit trail, even after deletion. You cannot silently remove a comment.

## Limitations

- Comments **cannot be edited** — only deleted and re-posted. This preserves the integrity of the conversation history.
- Email reply attachments only auto-attach to the transaction when the original comment was on a **single transaction**. For query-context comments, attachments go to a new draft.

---
source: /docs/guides/using-bkper/data-import-export/export-data.md

# Export Data from Bkper

You own the data in your Bkper Books and can export it at any time. Common reasons to export:

- Make periodic **backups**
- **Merge** or copy transactions to another Book
- Use the data in **another system**

## Exporting to Google Sheets

Use the [Bkper Add-on for Google Sheets](http://bkper.com/docs/guides/google-sheets.md) to export data directly into a spreadsheet.

Open the add-on from **Extensions > Bkper > Open**:

![Opening the Bkper Add-on from the Extensions menu in Google Sheets](http://bkper.com/docs/_astro/export-data-1.C7Jzi46s.png)

Select your **Book**, choose **Transactions**, enter a **query** that covers the date range you need (for example, `before:$y+10` to include all transactions), and press **Fetch**.

![Configuring the Fetch options — Book, Transactions, and query](http://bkper.com/docs/_astro/export-data-2.Cq8F8pnQ.png)

All matching transactions are exported to the spreadsheet:

![Transactions fetched from Bkper into a Google Sheet](http://bkper.com/docs/_astro/export-data-3.CgOULgiM.png)

> **Tip**
> - To export all transactions, use a query that spans the entire date range of your Book, such as `before:$y+10`.
> - Attachments are exported as links.
> - Enable the **Properties** option in the add-on to include custom property keys and values.
> - Each time you open the Google Sheet, Bkper Functions automatically refresh the fetched data.
> - From Google Sheets you can download the data as **CSV**, **Microsoft Excel**, or **PDF**.
To copy or merge transactions into another Book, export them to a spreadsheet first, then [import](http://bkper.com/docs/guides/using-bkper/data-import-export/import-data.md) them into the target Book.

## BkperApp for Google Apps Script

The [BkperApp library](https://bkper.com/api) for Google Apps Script gives you programmatic access to export data to any destination you need.

## Batch exporting Accounts

The [Bkper Add-on for Google Sheets](http://bkper.com/docs/guides/google-sheets.md) lets you export all Accounts from a Book in one step. This is useful for creating backups, building templates, or reviewing your Account structure outside of Bkper.

Open a Google Sheet and go to **Extensions > Bkper > Open**. Select your Book, switch to the **Fetch** tab, and choose **Accounts**. Click the cell where you want the data to start, then press **Fetch**.

[Image: Animated walkthrough of batch exporting Accounts from Bkper to Google Sheets]

The **Name**, **Type**, and **[Groups](http://bkper.com/docs/core-concepts.md#groups)** of each Account are listed in the spreadsheet, ready for reuse as a template or further processing.

---
source: /docs/guides/using-bkper/data-import-export/import-data.md

# Import Data into Bkper

Importing data into Bkper is straightforward because it leverages the [Bkper Agent's](http://bkper.com/docs/guides/automations/bkper-agent.md) capabilities to match transactions to the right Accounts — avoiding the complexity of mapping fields between systems.

You can import data from several sources, including Bank Connections, CSV files, Google Sheets, and Google Apps Script.

Common reasons to import data:

- Start a Book with **historical data**
- **Periodically update** a Book from an external source
- **Merge** transactions from another Book
- Copy transactions from another Book

## Importing from Google Sheets

Use the [Bkper Add-on for Google Sheets](http://bkper.com/docs/guides/google-sheets.md) to import data directly from a spreadsheet.

Open the add-on from **Extensions > Bkper > Open**.

![Opening the Bkper Add-on from the Extensions menu in Google Sheets](http://bkper.com/docs/_astro/export-data-1.C7Jzi46s.png)

Select the cells containing the data you want to record.

![Selecting cells in Google Sheets to import into Bkper](http://bkper.com/docs/_astro/import-data-2.CicwyL9E.png)

Choose the Book where you want to import the data, then press **Record**. The selected rows are recorded as drafts in your Book.

![Pressing Record to import the selected data into Bkper](http://bkper.com/docs/_astro/import-data-3.DGtKrhgI.png)

> **Tip**
> For the best results with the Bkper Agent's auto-discovery, order your data as:
> **Date | Amount | From Account | To Account | Description | URLs**
> 
> For example: `01/25/2018 34.67 Bank Transportation filling gas https://receipturl`
To copy or merge transactions between Books, first [export](http://bkper.com/docs/guides/using-bkper/data-import-export/export-data.md) the transactions to a Google Sheet, then import them into the target Book using the steps above.

## Batch importing Accounts

The [Bkper Add-on for Google Sheets](http://bkper.com/docs/guides/google-sheets.md) also makes it easy to create Accounts in bulk. This is especially useful when setting up a new Book from a template or migrating an existing [Chart of Accounts](http://bkper.com/docs/guides/using-bkper/chart-of-accounts.md).

Open a Google Sheet and go to **Extensions > Bkper > Open**. Select your Book, switch to the **Record** tab, and choose **Accounts**. Highlight the cells containing the Account data you want to import, then click **Record**.

[Image: Animated walkthrough of batch importing Accounts from Google Sheets into Bkper]

The new Accounts appear immediately in your Book, ready for use.

> **Tip**
> Enable the **Highlight** checkbox in the add-on so that Account rows in Google Sheets are color-coded to match their [Account Type](http://bkper.com/docs/core-concepts.md#account-types) in Bkper, making it easier to review what you imported.

---
source: /docs/guides/using-bkper/date-range-slider.md

# Date Range Slider

The **Date Range Slider** lets you navigate through account balances over time, providing valuable insights into the historical, current, and future financial position and performance of your business. It is especially useful for spotting trends quickly and making informed decisions based on accurate, up-to-date data.

![The Date Range Slider at the top of the Balance Sheet](http://bkper.com/docs/_astro/date-range-slider-1.AW1j3CuU.png)

Access the Range Slider by clicking the date range displayed at the top of the Balance Sheet.

- **The date on the Balance Sheet** represents the balance values at the end of the selected period.
- **The date range on Incoming & Outgoing values** represents the accumulated balance values during the selected period.

## Selecting a range

Click the dates in the Range Slider and choose a **Month**, **Quarter**, or **Year** from the pop-up menu.

Permanent accounts on the Balance Sheet show the position at the end of the selected range, while non-permanent accounts show the performance (accumulated values) during that range.

![Selecting a range period — Month, Quarter, or Year](http://bkper.com/docs/_astro/date-range-slider-2.ys9SPVPk.png)

## Changing the period

Click the **arrows** on the Range Slider to move the selected range forward or backward.

![Using arrows to change the period of the Range Slider](http://bkper.com/docs/_astro/date-range-slider-3.B71oKaOP.png)

## Changing the starting month of the annual range

To set a fiscal year that does not start in January, click the dates in the Range Slider, select the **Year** range, and pick the month in which your fiscal year begins.

![Selecting a custom starting month for the annual range](http://bkper.com/docs/_astro/date-range-slider-4.BXVMXMFw.png)

## Daily balance values

The Range Slider does not define a fixed daily period, but you can still identify a daily closing balance by filtering a single permanent Account and reading the running balance shown toward the end of the last transaction row for that day. Learn more in the [Accounts guide](http://bkper.com/docs/guides/using-bkper/accounts.md#running-balance).

![Viewing the running balance toward the end of a transaction row for a permanent account](http://bkper.com/docs/_astro/date-range-slider-5.D_43nmhu.png)

[Image: Animated walkthrough of the Date Range Slider in action]

---
source: /docs/guides/using-bkper/drag-and-drop.md

# Drag and Drop Files

Drag and drop is a fast way to get files into Bkper. Instead of navigating through menus, you simply drop files directly into your Book. Supported file types include images (`.jpeg`, `.jpg`, `.png`, `.gif`, `.tiff`, `.webp`), documents (`.pdf`, `.txt`), and data files (`.csv`).

With drag and drop you can:

- Upload **attachments** to a transaction
- Record batch entries from **CSV** files
- Record new **drafts** from files
- Add **multiple attachments** per transaction

## Three ways to drag and drop

**Record a single transaction** — drop one or more files onto the **input form area** (the gray section at the top). All files become part of one new transaction.

![Dropping files onto the input form to record a new transaction with attachments](http://bkper.com/docs/_astro/attachments-3.Da5jQPEn.png)

**Record multiple drafts** — drop files onto the **white space below the transaction list**. Each file becomes its own new draft.

![Dropping files below the transaction list to create individual drafts](http://bkper.com/docs/_astro/attachments-2.CVD7v7B3.png)

**Attach to an existing transaction** — drop one or more files directly onto a **transaction row** to add them as attachments.

![Dropping files onto an existing transaction to add attachments](http://bkper.com/docs/_astro/attachments-4.BXus-4ml.png)

> **Note**
> When you drop a CSV file, every row in the file is recorded as an individual draft. The Bkper Agent then helps complete each transaction by suggesting the appropriate Accounts.

---
source: /docs/guides/using-bkper/events.md

# Events

Every action in a Book — posting a transaction, editing an account, adding a comment, attaching a file — generates an **Event**. Events record _who_ performed the action (a person, a bot, or a bank connection), _what_ changed, and _when_. Together they form a complete, tamper-proof audit trail that is essential for collaboration and trust. For a deeper look at the model, see [Core Concepts — Events](http://bkper.com/docs/core-concepts.md#events).

Events are not just a log to look at. They are the mechanism that powers automations across Bkper — bots, AI agents, and integrations all listen for Events and react to them in real time.

## The Activities panel

The Activities panel is where you view Events in your Book. Click the **Activities button** in the top-right corner to open it.

![The Activities button in the top-right corner of a Bkper Book](http://bkper.com/docs/_astro/activities-1.DNfLn91C.png)

The panel shows a chronological feed of every action taken on the Book — transactions created, accounts edited, collaborators added, comments posted, and more. You can review exactly what each team member or automation has been doing.

![The Activities panel showing a chronological feed of Events in the Book](http://bkper.com/docs/_astro/activities-2.B805kMXP.png)

## Reading an Event

Each entry in the Activities panel shows:

- **Who acted** — The user's avatar and name, or the agent's logo and name for bots, apps, and bank connections. This makes it immediately clear whether a human or an automation performed the action.
- **What changed** — The entity affected (a transaction, account, group, or other object) and the nature of the change (created, updated, deleted, posted, checked, etc.).
- **When it happened** — A timestamp for every action, so you can reconstruct exactly what occurred and in what order.

## Filtering Events

Select any transaction in the list and the Activities panel instantly filters to show only the Events relevant to that specific record — every edit, state change, comment, and attachment across its entire lifecycle.

[Image: Animated walkthrough of filtering Events by selecting a transaction]

This is useful for auditing a specific transaction: you can see who created it, who posted it, whether a bot modified it, and who ultimately checked it.

## Humans and agents

Bkper treats human users and automated agents the same way — both generate Events, and both are clearly identified in the Activities panel. When a bot calculates taxes on a checked transaction, or a bank connection imports a statement, or an AI agent processes a document, each action appears as an Event with the agent's distinct logo and name.

![Events from automated agents identified by their logo and name in the Activities panel](http://bkper.com/docs/_astro/bkper-bot-agents.CtsWIZEd.png)

This means you always know _what_ acted and _why_, whether the action was manual or automated. There is no hidden behavior — every automation is transparent and auditable.

## Agent responses

When a bot or app reacts to an Event, its response is recorded directly on the Event that triggered it. Click the response at the bottom of an Event entry to see what the automation did — for example, the tax amount it calculated, the currency conversion it applied, or the subledger entry it created.

![A bot response recorded on the Event that triggered it](http://bkper.com/docs/_astro/bkper-bot-responses.UQXhqdai.png)

If an automation encounters an error, the error is also recorded on the Event, so you can review and troubleshoot without guessing what went wrong.

## How Events power Bkper

Events are the foundation of Bkper's automation model. Rather than running on a schedule, automations in Bkper are **event-driven** — they react the moment something happens:

- **[Bots](http://bkper.com/docs/guides/automations/automate-tasks.md)** listen for specific Event types and respond automatically. When you check a transaction, a Tax Bot can calculate and post the tax entry, an Exchange Bot can convert the amount to another currency, or a Subledger Bot can mirror the transaction in a related Book — all within seconds.

- **[AI Agents](http://bkper.com/docs/guides/automations/bkper-agent.md)** use Events to understand context and take action. The Bkper Agent can parse documents, extract transaction data, and record entries — each action generating its own Events for full traceability.

- **[Bank connections](http://bkper.com/docs/guides/automations/bank-connections.md)** import transactions from your bank and each import appears as Events, so you can trace every imported record back to its source.

- **Reports and analysis** — because Events capture every change with precise timestamps, they provide the data needed for compliance, auditing, and operational reporting.

The event-driven model means automations compose naturally: one bot's action generates a new Event that another bot can react to. A posted transaction can trigger a tax calculation, which triggers a currency conversion, which triggers a subledger entry — each step fully visible in the Activities panel.

For developers building custom automations, see the [Events reference](http://bkper.com/docs/build/concepts/events.md) and [Event Handlers guide](http://bkper.com/docs/build/apps/event-handlers.md).

---
source: /docs/guides/using-bkper/external-links.md

# External Links

External links let you reference related information — invoices in another system, supporting documents, or any web resource — directly from a transaction. Unlike [attachments](http://bkper.com/docs/guides/using-bkper/attachments.md) (which store the file in Bkper), external links point to a URL in an external system. You can add more than one link to the same transaction.

## Inserting links

There are two ways to add an external link.

### Via the link icon

Click the **link icon** on the transaction and paste the URL.

![Clicking the link icon on a transaction to insert an external URL](http://bkper.com/docs/_astro/insert-urls-links-1.Cakoxgy_.png)

### Directly in the input field

Include the URL in the input field when recording the transaction. Bkper detects it automatically and stores it as an external link.

![Typing a URL directly in the Bkper input field to attach it to a transaction](http://bkper.com/docs/_astro/insert-urls-links-2.XyhXGu_9.png)

## Removing links

Open the transaction and click the **trash icon** next to the link you want to remove.

![Removing an external link from a transaction by clicking the trash icon](http://bkper.com/docs/_astro/insert-urls-links-3.BRi-J36C.png)

## Accessing links

Click the **link icon** on the transaction row to open the attached URL in a new tab.

![Clicking the link icon on a transaction to open the external URL](http://bkper.com/docs/_astro/insert-urls-links-4.Ck1rqmkV.png)

## Combining with attachments

You can use both external links and [file attachments](http://bkper.com/docs/guides/using-bkper/attachments.md) on the same transaction. Attach the receipt as a file and link to the invoice in your billing system — giving you both a local copy and a reference to the source. Transactions recorded from a mobile device also include a **geo-reference link** automatically.

---
source: /docs/guides/using-bkper/groups.md

# Groups

[Groups](http://bkper.com/docs/core-concepts.md#groups) in Bkper help you categorize and structure Accounts, making financial analysis and reporting easier. Unlike rigid structures in traditional accounting systems, Bkper Groups are fully flexible — you can modify and reorganize them at any time while balance values stay in sync.

Groups offer several advantages:

- **Simplified reporting** — view consolidated balances of multiple Accounts at once
- **Organized data** — structure your [Chart of Accounts](http://bkper.com/docs/guides/using-bkper/chart-of-accounts.md) logically
- **Meaningful insights** — enable better financial analysis
- **Hierarchy support** — Groups can contain both Accounts and other Groups

## Create a Group

In your Book, look for the **New Group** option in the left menu. Give your Group a name that reflects its purpose — like **Travel Expenses**, **Revenue Streams**, or **Operational Costs** — then click **Save**.

Your new Group appears alongside the others in the left menu, ready to hold Accounts. From here, you can **drag and drop Accounts into the Group** or adjust its hierarchy to better organize your finances.

[Image: Animated walkthrough of creating a new Group in Bkper]

### Renaming a Group

Click the **three dots** next to the Group's balance, select **Edit**, enter the new name, and press **Save**.

[Image: Animated walkthrough of renaming a Group]

### Deleting a Group

Click the **three dots**, select **Delete**, and confirm. Deleting a Group does **not** delete the Accounts or their balance values inside it — those Accounts remain in your Book, just no longer grouped together.

[Image: Animated walkthrough of deleting a Group]

### Hiding a Group

If a Group should remain in your Book but not appear in the left menu or reports, you can hide it. Click the **three dots** and select **Hide**. This is useful for auxiliary Groups used only for internal tracking, custom properties, or bot configurations.

[Image: Animated walkthrough of hiding a Group]

### Showing a hidden Group

Hidden Groups are still visible (in light gray) in the Chart of Accounts. Click the **three dots** next to a hidden Group and select **Show** to bring it back into the left menu.

[Image: Animated walkthrough of showing a hidden Group]

### Group properties

You can attach [custom properties](http://bkper.com/docs/guides/using-bkper/properties.md) to a Group — typically to configure bot behavior for all accounts in that group. For example, the [Tax Bot](http://bkper.com/docs/guides/automations/tax-bot.md) reads `tax_rate` from a group to calculate taxes on every transaction in its accounts, and the [Exchange Bot](http://bkper.com/docs/guides/automations/exchange-bot.md) reads `exc_amount` to know which exchange rate to use.

To manage group properties, click **More > Edit** on the group and expand the properties section. See the [Properties guide](http://bkper.com/docs/guides/using-bkper/properties.md#group-properties) for details and examples.

### Comments on groups

You can leave [comments](http://bkper.com/docs/guides/using-bkper/comments.md) on any group to coordinate with your team — for example, a note explaining why a group's structure changed or a request to review its accounts. Select the group and click the comment icon; mention a collaborator with **@username** to notify them.

### Locking a Group

To prevent accidental changes to a Group's structure, you can lock it.

- Only **Book Owners** can lock or unlock a Group.
- Only **Root Groups** (the highest level in a hierarchy) can be locked.

Locking ensures that no one accidentally reorganizes critical data that could disrupt reports or automated workflows.

![Locking a root Group to prevent structural changes](http://bkper.com/docs/_astro/groups-manage-6.BufMdztE.png)

### Drag and drop from the Transactions page

Find the Account in the left menu and **drag and drop** it onto the target Group. The Account is immediately added and its balance included in the Group total.

[Image: Animated walkthrough of dragging an Account into a Group]

### From the Chart of Accounts

Open the **Chart of Accounts**, select the Account(s) you want to categorize, click the **Groups button**, choose the target Group, and apply. This method supports bulk selection, making it efficient for organizing many Accounts at once.

[Image: Animated walkthrough of adding Accounts to a Group via the Chart of Accounts]

## Group hierarchies

Groups can be nested within each other to create structured financial hierarchies. At the top sits the **Root Group** (for example, Assets), beneath it are **Child Groups** (for example, Current Assets), and the lowest level of Groups contains the actual Accounts.

An example hierarchy:

**Assets** (Root) → **Current Assets** (Child) → **Receivables** (Child) → Customer A, Customer B (Accounts)

> **Note**
> A parent Group cannot contain both Accounts and child Groups simultaneously. Only the last level of Groups in a hierarchy can hold Accounts.
### Adding a Group to a hierarchy

To place a Group within a hierarchy, edit the Group and assign a **Parent Group**. The parent Group must already exist.

[Image: Animated walkthrough of assigning a parent Group]

### Removing a Group from a hierarchy

To detach a Group from its parent while keeping it as an independent Group, edit it, clear the **Parent Group** dropdown, and save.

[Image: Animated walkthrough of removing a Group from its hierarchy]

When a Group is removed from a hierarchy:

- Child Groups inside it remain intact.
- Accounts stay in both the removed Group and the parent Group, unless the parent is also removed.
- Accounts can be manually reassigned as needed.

With a well-structured hierarchy, you can retrieve an entire **Balance Sheet** or **Income Statement** with a single query — for example, `Net Assets on:2026` or `Net Income on:2026`.

### Searching by group

The `group:` [query operator](http://bkper.com/docs/guides/using-bkper/search-and-queries.md) filters transactions and balance values by Group. Combined with date operators, this gives you instant reports — `group:'Travel Expenses' after:$y-1 before:$y` shows last year's travel spend. Since Groups roll up balances from all their child Accounts, a single `group:` query can replace dozens of individual account filters.

## Bulk export and import

You can manage Groups in bulk using the [Bkper Add-on for Google Sheets](http://bkper.com/docs/guides/google-sheets.md). Use **[Fetch Groups](http://bkper.com/docs/guides/google-sheets/fetching-data.md#groups)** to export your Group structure to a spreadsheet, and **[Save Groups](http://bkper.com/docs/guides/google-sheets/recording-data.md#groups)** to create Groups in batch — including hierarchy and Custom Properties.

[Image: Animated walkthrough of exporting Groups to Google Sheets]

[Image: Animated walkthrough of importing Groups from Google Sheets]

## Related

- **[Chart of Accounts](http://bkper.com/docs/guides/using-bkper/chart-of-accounts.md)** — build and visualize your full account and group structure

---
source: /docs/guides/using-bkper/hashtags.md

# Hashtags

Hashtags are lightweight labels you add to transaction descriptions. They serve three purposes: they help the [Bkper Agent](http://bkper.com/docs/guides/automations/bkper-agent.md) identify accounts, they make transactions instantly **searchable**, and they enable **segment reporting** — balance values cross-referenced with a hashtag across accounts. For the conceptual overview, see [Core Concepts — Hashtags](http://bkper.com/docs/core-concepts.md#hashtags).

## Adding hashtags

Include a `#hashtag` anywhere in the description when recording a transaction. Bkper registers and indexes it automatically, making it available for autocomplete and search from that point on.

For example, recording an invoice number as a hashtag — `Office supplies 150 #inv4821` — makes it easy to locate both the issuance and the payment later. Click the hashtag in any transaction and Bkper instantly filters all entries tagged with it.

You can add multiple hashtags to a single transaction. A marketing expense might carry `#team_marketing #project_alpha #q1_2026`, enabling filtering from any of those perspectives.

## Hashtag hygiene

Books sometimes accumulate undesired hashtags that pollute search and autocomplete. For example, most team members might use **#taxi** for reimbursements, but a few record it as **#taksi** — which then fails to appear in the reimbursement report.

Correcting this involves two steps: fixing the transactions and removing the stale tag from the Bkper Agent.

### Correcting misspelled hashtags

Search for the misspelled hashtag — in this case **#taksi**.

![Searching for the misspelled hashtag #taksi in Bkper](http://bkper.com/docs/_astro/hashtags-1.XAKlUK74.png)

Edit every matching transaction, replacing **#taksi** with the correct **#taxi** in the description.

![Editing a transaction to replace #taksi with the correct hashtag #taxi](http://bkper.com/docs/_astro/hashtags-2.BZkLR6ZZ.png)

Once no transaction references **#taksi**, it disappears from autocomplete and search results.

### Removing a hashtag from the Bkper Agent

Even after correcting all transactions, the [Bkper Agent](http://bkper.com/docs/guides/automations/bkper-agent.md) may still remember the stale tag and use it for account matching. To stop this, type **-#taksi** (with a minus sign) in the input field and press the red **Record** button.

![Typing -#taksi in the input field to remove the hashtag from the Bkper Agent](http://bkper.com/docs/_astro/hashtags-3.DD3aAtcY.png)

This tells the Agent to discard that tag for future entries.

> **Note**
> If you do not edit the misspelled hashtag in older transactions, it will continue to appear in autocomplete and remain indexed for search. Unused hashtags are automatically ignored by the Bkper Agent after 90 days.
## Hashtags and the Bkper Agent

The [Bkper Agent](http://bkper.com/docs/guides/automations/bkper-agent.md) uses hashtags as one of its signals for identifying the correct From Account and To Account. If you've used `#rent` in a previous transaction with specific accounts, entering `#rent 2000` in the input field lets the Agent apply the same accounts automatically.

This means well-chosen, consistent hashtags improve recording speed — the Agent learns faster when the same hashtag always appears with the same account pattern. Conversely, inconsistent hashtags (like `#taxi` vs. `#taksi`) confuse the Agent and produce unreliable suggestions.

The `-#tag` syntax described above removes a hashtag from the Agent's memory. Hashtags that go unused for 90 days are automatically dropped from the Agent's learned patterns.

## Segment reporting

Hashtags enable **managerial accounting** — reports that slice financial data across dimensions that don't map to your Chart of Accounts. A single Account like "Travel Expenses" might contain trips tagged `#sales`, `#engineering`, and `#executive`. Hashtags let you see the balance for each segment without creating separate accounts.

### How it works

In the web app, clicking a hashtag filters all transactions carrying that tag. Combined with account or group filters, this gives you segment-specific views — for example, all `#project_alpha` expenses within your "Marketing" group.

In [Google Sheets](http://bkper.com/docs/guides/google-sheets.md), you can fetch balance values filtered by a hashtag using Bkper Functions:

```
=BKPER_BALANCES_TOTAL(bookId, 1, "group:'COGS' #projectB on:2025", FALSE, FALSE, TRUE)
```

This returns the balance for the "COGS" group filtered to transactions tagged `#projectB`, enabling pivot-style managerial reports directly in your spreadsheet.

> **Caution**
> Balance values filtered by hashtag are calculated for up to **3,000 transactions**. For segments with higher transaction volumes, consider using [dedicated accounts with groups](http://bkper.com/docs/guides/accounting-principles/modeling/tracking-departments-projects.md#approach-2-accounts-with-groups) instead.
### When to use hashtags vs. accounts

Hashtags are ideal when segments are fluid, numerous, or cross-cutting — projects that come and go, cost centers that overlap, or ad-hoc analysis dimensions. They keep your Chart of Accounts clean and are the fastest approach to implement.

For segments that are stable, have high transaction volumes (above 3,000 per report), or need instant balance visibility without running a query, dedicated accounts within groups are a better fit. See [Tracking Departments & Projects](http://bkper.com/docs/guides/accounting-principles/modeling/tracking-departments-projects.md) for a detailed comparison.

## Hashtags in queries

Hashtags work with the [query language](http://bkper.com/docs/guides/using-bkper/search-and-queries.md). Clicking a hashtag in any transaction runs a search, but you can also type hashtags directly in the search bar and combine them with other operators:

- `#project_alpha after:$m-6` — all transactions tagged `#project_alpha` in the last 6 months
- `account:Cash #reimbursement` — reimbursement-tagged transactions in the Cash account
- `group:'Travel' #q1_2026` — travel expenses for Q1

In Google Sheets, hashtags in query parameters filter both transaction lists ([BKPER_TRANSACTIONS](http://bkper.com/docs/guides/google-sheets/functions-reference.md#bkper_transactions)) and balance values ([BKPER_BALANCES_TOTAL](http://bkper.com/docs/guides/google-sheets/functions-reference.md#bkper_balances_total), [BKPER_BALANCES_PERIOD](http://bkper.com/docs/guides/google-sheets/functions-reference.md#bkper_balances_period)).

## Scope and limitations

- Hashtags are **scoped to a Book** — each Book has its own set of indexed hashtags.
- Hashtags attach to **transactions only** — they don't apply to accounts, groups, or other entities.
- There is **no hierarchy** within hashtags — they are flat labels. For nested categorization, use [Groups](http://bkper.com/docs/guides/using-bkper/groups.md#group-hierarchies).
- Balance reporting with hashtags supports up to **3,000 transactions** per query. Beyond that, use accounts with groups for segment reporting.

---
source: /docs/guides/using-bkper/mobile/mobile-web-app.md

# Bkper Web App

![Bkper Mobile Web App on a smartphone](http://bkper.com/docs/_astro/mobile-web-app-1.mqbi3iY5.png)

The Bkper Web App is the current Bkper experience across mobile and desktop browsers. You can use it to record transactions, manage Books, track balances, and capture receipts. On mobile devices, it can also be installed to your home screen for faster, app-like access.

With the Bkper Web App, you can:

- List your Books and Collections
- Record entries with a single line of text, optionally adding images and attachments
- Delete and restore entries
- Post, edit, check, and uncheck Transactions
- View your Accounts and Groups with their balance values
- View your Events

![Bkper Mobile Web App feature overview](http://bkper.com/docs/_astro/mobile-web-app-2.BFhu9H3W.png)

> **Note**
> More features will be released gradually to improve the mobile experience.
## Installation

On your mobile device, open your browser, navigate to [bkper.com](https://bkper.com), and tap **Sign In**. When you first use the Bkper app on your mobile device, you need to authenticate and authorize access.

### Android

On Android devices, tap the **Install** button located at the top of the app, next to your avatar.

![Install button on Android for the Bkper Web App](http://bkper.com/docs/_astro/mobile-web-app-3.B1PBO8Ak.png)

### iOS

On iPhone and iPad, tap the **Share** button at the bottom of Safari, then select **Add to Home Screen** to install the app.

![iOS Share menu with Add to Home Screen option](http://bkper.com/docs/_astro/mobile-web-app-4.v81wTshG.png)

Confirm the installation, which may take a moment to complete. Once finished, the Bkper icon appears in the top bar and on your device's home screen. From that point on, you can access Bkper by tapping the icon instead of opening the browser.

![Bkper app installed on iOS home screen](http://bkper.com/docs/_astro/mobile-web-app-5.CK94L8ij.png)

You can remove the Bkper App from your device just as you would remove any other app.

For detailed installation instructions specific to your browser, see:

- [Installation on Apple Safari](https://support.apple.com/en-us/104996)
- [Installation on Google Chrome](https://support.google.com/chrome/answer/9658361)
- [Installation on MS Edge](https://learn.microsoft.com/en-us/microsoft-edge/progressive-web-apps-chromium/ux)
- [Installation on Mozilla Firefox](https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/Guides/Installing)

## Switching Between Desktop and Web App

When navigating in a mobile browser, Bkper defaults to the Web App version. If you need to access the desktop version, open it from the avatar menu in your Books.

![Switching from mobile Web App to desktop version via avatar menu](http://bkper.com/docs/_astro/mobile-web-app-6.tpgY5gDX.png)

To return to the Web App from the desktop version, use the same avatar menu.

![Switching from desktop version back to the Web App](http://bkper.com/docs/_astro/mobile-web-app-7.D8Zh7FB7.png)

> **Tip**
> You can also access the PWA version from your desktop browser.
If you have feedback, questions, or comments about the Bkper Web App, reach out through the support channel or join the [Bkper user community](https://groups.google.com/g/bkper).

---
source: /docs/guides/using-bkper/navigating-bkper.md

# Getting around in Bkper

After [signing in](http://bkper.com/docs/guides/using-bkper/signing-in.md), you land on the Book list page. From there you can navigate to the three other main pages: Transactions, Accounts, and Automations.

## Book list

The **Book list** is your starting point — a dashboard showing all the Books you have access to. From here, you can:

- Create a new Book
- Access pre-built templates like **Business General Ledger** or **Personal Finances**
- Open any Book to start working
- Manage [Collections](http://bkper.com/docs/guides/using-bkper/collections.md) for organizing related Books

This page appears when you first sign in or when you click the ← arrow next to the Bkper logo from within a Book. The Book list also shows the Book owner, total number of transactions, and monthly posted transactions for each Book.

When you open a Book, you land on the Transactions page.

## Transactions page

The **Transactions page** is where you record, view, and manage your financial transactions. It's the heart of your bookkeeping in Bkper.

From here, you can:

- Record new transactions manually or via automations
- Search and filter transactions with [queries](http://bkper.com/docs/guides/using-bkper/search-and-queries.md)
- Check, edit, or delete transactions
- Access the **Configuration Menu (⚙️)** for Book settings, Book properties, copying, or deleting the Book

Every Book opens to the Transactions page by default. In the top-left corner, you can switch between the Transactions and Accounts pages. The Automations page is accessible via the Configuration Menu (⚙️).

## Accounts page

The **Accounts page** is where you build and maintain your chart of accounts — the structure of assets, liabilities, equity, income, and expenses.

From here, you can:

- Create, edit, delete, or archive Accounts
- Create and organize Groups into hierarchies for reporting
- Hide, unhide, edit, or delete Groups

You can navigate back to the Transactions page by clicking **Transactions** in the top-left menu.

## Automations page

The **Automations page** is your control center for Bots and Apps that automate your bookkeeping.

Use it to:

- Install and configure Bots like the [Tax Bot](http://bkper.com/docs/guides/automations/tax-bot.md) or [Exchange Bot](http://bkper.com/docs/guides/automations/exchange-bot.md)
- Manage Bank Connections for automatic transaction imports
- Add your own automation bots, apps, or reports

Click the **← arrow** next to the Bkper logo (top-left) to return to the Transactions page at any time.

## Navigation tips

- In the top-left corner, switch between the Transactions and Accounts pages within a Book
- From the Transactions or Accounts page, click the **← arrow** next to the Bkper logo to return to the Book list
- From the Automations page, click the **← arrow** to return to the Transactions page

## Next steps

Now that you're oriented, dive into [creating and managing Books](http://bkper.com/docs/guides/using-bkper/books.md) to get started with your first ledger.

---
source: /docs/guides/using-bkper/properties.md

# Properties

Custom properties let you attach structured metadata to **Books, Accounts, Groups, and Transactions** as **key/value pairs**. This is useful for storing data such as tax rates, contact information, invoice numbers, or external references like URLs and IDs from other systems.

For the conceptual overview, see [Core Concepts — Custom Properties](http://bkper.com/docs/core-concepts.md#custom-properties).

By centralizing this information within your Book, you can work in context without switching between apps. For example, storing contact data on an overdue receivable account makes it possible to reach out to a client directly from Bkper — manually or through an [automated process with Google Apps Script](https://github.com/Jacobvdb/bkper-doxey-gs-sample).

> **Note: Rules for custom properties**
> - Property **keys** must be lowercase.
> - Spaces in keys are automatically converted to underscores (`_`).
> - To remove a property, delete its value.
> - All property changes (create, edit, delete) are logged in the book's [Events](http://bkper.com/docs/guides/using-bkper/events.md) feed.
## Book properties

Book-level properties store information that applies to the entire Book — a tax ID, company address, base currency code, or any configuration data your automations need. They are especially valuable in automated workflows where bots read Book properties to determine how they should behave.

To manage Book properties, open your Book's **Settings** (⚙️), go to **Configurations > Book Properties**, and add or modify key/value pairs.

![Bkper book properties panel showing key/value pairs for company metadata](http://bkper.com/docs/_astro/book-properties.DkNlqeuJ.png)

**Common examples:**

| Key | Value | Purpose |
| --- | --- | --- |
| `tax_id` | `12.345.678/0001-90` | Company tax identification |
| `exc_code` | `BRL` | Base currency for exchange bots |
| `address` | `123 Main St, São Paulo` | Company contact info |

## Account properties

Account properties are ideal for storing contact information, external identifiers, or metadata specific to individual accounts. Emails, URLs, and phone numbers are rendered as **clickable links** in the chart of accounts — clicking a phone number, for example, opens your configured calling app.

To manage account properties, open the account editor, expand the properties section, and add or modify key/value pairs.

[Image: Adding custom properties to a Bkper account — entering a key and value pair in the account editor]

**Common examples:**

| Key | Value | Purpose |
| --- | --- | --- |
| `email` | `client@example.com` | Clickable contact link |
| `phone` | `+55 11 99999-0000` | Opens calling app |
| `exc_code` | `USD` | Currency for exchange bots |
| `external_id` | `CUST-4829` | Reference to an external system |

## Group properties

Group properties work the same way as account properties but apply to an entire group. They are commonly used to configure bot behavior — for example, setting a tax rate on an expense group so a Tax Bot can calculate taxes automatically for every transaction in accounts under that group.

To manage group properties, hover over the group name in the sidebar, click **More > Edit**, then expand the properties section.

[Image: Adding a custom property to a Bkper group through the group editor]

**Common examples:**

| Key | Value | Purpose |
| --- | --- | --- |
| `tax_rate` | `0.21` | Tax Bot calculates taxes at 21% |
| `exc_amount` | `buy` | Exchange Bot uses buy rate |
| `inventory_type` | `fifo` | Inventory Bot uses FIFO method |

## Transaction properties

Transaction properties attach metadata to individual transactions — useful for storing invoice numbers, reference codes, purchase order IDs, or any other per-transaction data that doesn't belong in the description.

To add properties, open a transaction for editing and expand the properties section to enter key/value pairs.

[Image: Adding a custom property to a Bkper transaction through the transaction editor]

**Common examples:**

| Key | Value | Purpose |
| --- | --- | --- |
| `invoice` | `INV-2026-0042` | Invoice reference |
| `po_number` | `PO-1234` | Purchase order tracking |
| `receipt_url` | `https://...` | Link to digital receipt |

## Properties in Google Sheets

When you use the [Bkper Add-on for Google Sheets](http://bkper.com/docs/guides/google-sheets.md), properties integrate seamlessly through the column header system. Any column header that is not a [recognized system column](http://bkper.com/docs/guides/google-sheets/recording-data.md#column-headers) automatically becomes a property key — the header is the key and each cell value is the property value.

This works for all entity types that support properties:

- **[Save Transactions](http://bkper.com/docs/guides/google-sheets/recording-data.md#transactions)** — non-system columns become transaction properties
- **[Save Accounts](http://bkper.com/docs/guides/google-sheets/recording-data.md#accounts)** — non-system columns become account properties
- **[Save Groups](http://bkper.com/docs/guides/google-sheets/recording-data.md#groups)** — non-system columns become group properties

When you **fetch** data back to Sheets, properties appear as additional columns alongside the system columns, making them available for reporting and analysis.

> **Note**
> Book properties cannot be recorded via Google Sheets — manage them directly in the web app through **Settings > Book Properties**.
## Properties in automations

Properties are the primary configuration mechanism for [Bots](http://bkper.com/docs/guides/automations/apps-and-bots.md) in Bkper. Each bot defines its own set of expected property keys — consult the documentation for the specific bot you are using to learn which properties to set.

Common patterns:

- **Book properties** tell a bot _how_ to behave globally — for example, the [Exchange Bot](http://bkper.com/docs/guides/automations/exchange-bot.md) reads `exc_code` from the Book to know the base currency.
- **Account properties** tell a bot _what_ applies to specific accounts — for example, `exc_code: USD` on an account tells the Exchange Bot which currency that account tracks.
- **Group properties** configure behavior for entire groups — for example, the [Tax Bot](http://bkper.com/docs/guides/automations/tax-bot.md) reads `tax_rate` from a group to calculate taxes on all transactions in that group's accounts.
- **Transaction properties** carry per-entry metadata that bots can read or write — for example, storing the calculated tax amount after processing.

## Properties in the audit trail

Every property change — create, edit, or delete — generates an [Event](http://bkper.com/docs/guides/using-bkper/events.md) in the Book's Activities panel. This means you have a complete history of who changed which property, when, and what the previous value was.

This is important for compliance and debugging: if an automation misbehaves because a property value was changed, you can trace exactly when and by whom the change was made.

---
source: /docs/guides/using-bkper/record-by-email.md

# Record Transactions by Email

The Bkper Email integration lets you record new transactions with attachments directly by email. Forward invoices, receipts, bills, or any other documents to your Bkper book, and the [Bkper Agent](http://bkper.com/docs/guides/automations/bkper-agent.md) transforms them into draft transactions.

## How document parsing works

When you email attachments to your Bkper book, the Bkper Agent analyzes each attachment and automatically extracts the relevant financial data — dates, amounts, descriptions, and line items — to create transactions.

The Agent handles different document types intelligently:

| Document Type | What Gets Created |
| --- | --- |
| **Invoices and Receipts** | A single transaction with the total amount, vendor details, and date extracted from the document |
| **Bank Statements** | Multiple transactions — one for each line item in the statement |
| **Bills** | A single transaction with payee, amount, and due date information |

Any files you attach are preserved with the resulting transactions for your records.

## Sending your first email

Sign into your Bkper account and open the book where you want to send the email. Click the **More** button and select **Record Transactions by email**.

![Record Transactions by email option in the More menu](http://bkper.com/docs/_astro/record-by-email-1.Dw0MBeg9.png)

Gmail opens with a new email addressed to your book. Attach your documents and send.

![Gmail compose window addressed to your Bkper book](http://bkper.com/docs/_astro/record-by-email-2.Die1FpJ0.png)

The Bkper Agent processes your attachments and creates draft transactions for your review.

## Using other email providers

While Bkper opens Gmail by default, you can send from any email client. Your book's unique address follows this format:

```
[bookid]@books.bkper.com
```

You can find your Book ID in the URL when viewing the book. Save this address as a contact for quick access from Outlook, Yahoo Mail, Apple Mail, or any other client.

![Finding your Book ID in the URL](http://bkper.com/docs/_astro/record-by-email-3.-wTjtzTa.png)

## Email structure reference

| Email Field | Becomes |
| --- | --- |
| **To** | Your book's unique address |
| **Subject** | Comment on the transaction |
| **Body** | Transaction data (date, amount, description) if no attachment |
| **Attachments** | Parsed by Bkper Agent into transactions |

> **Note**
> You must have write permissions on a book to record draft transactions by email.

---
source: /docs/guides/using-bkper/record-guide.md

# Record Guide

Easy recording for team members makes all the difference when it comes to keeping books up to date.

![Bkper record input showing a transaction entry](http://bkper.com/docs/_astro/record-guide-1.COly_MWE.png)

When recording a transaction, the position and case of the text you enter does not matter. Bkper parses the description intelligently:

- The first **value** found is treated as the transaction amount.
- The first **account** found is treated as the **From Account**.
- The second **account** found is treated as the **To Account**.
- The **language** in which you type is irrelevant.

From and To Accounts are discovered automatically when you enter their **names**, previously used **descriptions**, **hashtags**, or **location**.

> **Note**
> The amount format depends on your [Book's settings](http://bkper.com/docs/core-concepts.md#books) (commas or points as decimal separators). Languages written right-to-left finish with the hashtag on the left side.
## Description

Any text that Bkper does not recognize as an account, amount, date, or command is recorded as the transaction's description.

## Amount

Record an amount like **35.95** anywhere in the input — the order does not matter. Bkper matches the number format to your Book's settings.

> **Note**
> For a Book with 2 fraction digits and a comma separator, a record like *"invoice 12345 value 12,34"* will interpret the value as 12,34, since it better matches the Book's settings.
## Hashtags

Add a hashtag like **#sometag** to tag the transaction. Tags help you categorize and search for transactions later.

> **Tip**
> Record a tag with a minus sign in front of it (e.g. **-#sometag**) to make Bkper forget that tag. The system will stop replacing words or finding accounts automatically based on that tag until you record it again.
## Dates

Enter a date like **05/21/2025** to record on a specific date. You can also use a short form like **05/21** to record on that date in the current year. The date format follows your Book's settings.

## Record Multiplier (Monthly Installments)

Use the **$Nx** syntax to repeat a transaction across multiple months. For example, **$4x** records the entry as a draft for the next four months on the same day.

> **Note**
> Use the letter "x" — not the multiplication asterisk. This feature only works in the one-line input, not in the expanded form.
As an example, entering `22000 #rent $4x` produces four monthly draft entries:

![Recording a transaction with 4x multiplier for monthly rent](http://bkper.com/docs/_astro/record-guide-2.cLj1C0gi.png)

The resulting transactions appear in the Book:

![Four monthly rent transactions created by the multiplier](http://bkper.com/docs/_astro/record-guide-3.OAV-4gVA.png)

## Attachment

You can attach files to a record by clicking the paperclip icon to upload, or by dragging and dropping a file onto the input form. You can also drag and drop a file onto an existing entry (draft or posted transaction).

## URL (Links)

Record a link to associate an external resource URL with a transaction.

## Ignoring Text with Quotes

To prevent Bkper from processing certain parts of your description — like timestamps or reference numbers — wrap that text in quotes. For example, `"10 Gas "at 10:56""` ensures that `at 10:56` is not interpreted as an account match.

> **Tip**
> This is useful when descriptions contain metadata like times, locations, or reference numbers that should not affect account matching.
## Putting It All Together

A complete record might look like:

`205.00 01/01/2025 $5x #insurance #car`

This records 5 drafts on the first day of January through May, each with the value 205.00 and the description **#insurance #car**.

---
source: /docs/guides/using-bkper/search-and-queries.md

# Search & Queries

**Bkper Search** uses a powerful query language for filtering transactions and balance values. This same language works across the Bkper web app, the [Bkper Add-on for Google Sheets](http://bkper.com/docs/guides/google-sheets.md), [Bkper Functions](http://bkper.com/docs/guides/google-sheets/functions-reference.md), and Google Apps Script — so a query that works in one place works everywhere.

Search results display matching transactions along with corresponding balance values (shown in charts). On the Bkper Add-on for Google Sheets, results can also be fetched as balance values and/or transactions.

## Search Assistant

The Search Assistant guides you through building queries visually. Access it from the search bar at the top of any Book.

![The Bkper search bar where the Search Assistant is accessed](http://bkper.com/docs/_astro/search-assistant-1.DU2yEmO-.png)

Type the term you are looking for and the Search Assistant suggests matching options based on your Book's Accounts, Groups, and transaction data.

![The Search Assistant suggesting options as you type a search term](http://bkper.com/docs/_astro/search-assistant-2.oiLKBTqP.png)

### Picking absolute dates

Click the **Date Picker** in the Search Assistant to select fixed start and end dates.

![The date picker for selecting absolute dates in the Search Assistant](http://bkper.com/docs/_astro/search-assistant-5.D_kotumh.png)

You can also choose which date type to filter on:

![Date type selector showing Transaction Date, Post Date, and Update Date options](http://bkper.com/docs/_astro/search-assistant-6.Dy-O2ZCe.png)

- **Transaction Date** — the first date column on a transaction.
- **Post Date** — the last date column on a transaction.
- **Update Date** — the date a transaction was last modified.

### Running the search

Press **Search** and the assembled query is added to the search bar and executed. The matching transactions appear in the list below.

![Search results after running a query built with the Search Assistant](http://bkper.com/docs/_astro/search-assistant-7.K6vPnjvP.png)

The Search Assistant is a great way to learn query syntax — the queries you build here work identically in [Bkper Functions for Google Sheets](http://bkper.com/docs/guides/google-sheets/functions-reference.md) and in the [Bkper Add-on](http://bkper.com/docs/guides/google-sheets.md).

## Using search directly

You can also type queries directly in the search field on the Transactions page and press **Enter**.

![Bkper search field on the transactions page](http://bkper.com/docs/_astro/bkper-search.DNib6u7V.png)

### By account or group

| Operator | Description | Example |
| --- | --- | --- |
| `account:` | Filter by account | `account:Cash` |
| `from:` | Filter by origin (From) account | `from:Cash` |
| `to:` | Filter by destination (To) account | `to:Expenses` |
| `group:` | Filter by group | `group:Expenses` |

### By transaction status

| Operator | Example |
| --- | --- |
| `is:draft` | Transactions not yet posted |
| `is:posted` | Posted transactions |
| `is:trashed` | Trashed transactions |
| `is:checked` | Checked transactions |
| `is:unchecked` | Unchecked transactions |

### By user

| Operator | Description | Example |
| --- | --- | --- |
| `createdBy:` | Filter by the user who recorded the transaction | `createdBy:arun` |
| `updatedBy:` | Filter by the user who last updated the transaction | `updatedBy:arun` |

### By account type

Use these keywords without a colon to filter by account type:

`asset` | `liability` | `incoming` | `outgoing`

### By date

| Operator | Description | Example |
| --- | --- | --- |
| `on:` | Transactions on a specific date | `on:2024-01-01` |
| `after:` | Transactions after a date | `after:2023-12-31` |
| `before:` | Transactions before a date | `before:2025-01-01` |
| `after: before:` | Date range (between) | `after:2023-12-31 before:2025-01-01` |

### By creation or modification date

| Operator | Description | Example |
| --- | --- | --- |
| `using:createdAt` | Search by creation date | `after:02/07/2025 before:02/10/2025 using:createdAt` |
| `using:updatedAt` | Search by last modification date | `using:updatedAt after:$d-2` |

### Date variables

Date variables create dynamic, relative date references — especially useful in Google Sheets reports that should always reflect recent data.

| Variable | Description | Example |
| --- | --- | --- |
| `$d` | Relative days | `$d-14` (14 days ago), `$d+1` (tomorrow) |
| `$m` | Relative months | `$m-3` (3 months ago), `$m+1` (1 month ahead) |
| `$y` | Relative years | `$y-1` (last year), `$y+1` (next year) |

Combine date ranges with variables to create rolling reports. For example, `after:$d-14 before:$d+1` always returns the last 14 days of results.

![Using date variables to define a dynamic date range in the search](http://bkper.com/docs/_astro/search-assistant-3.CTBzr7eZ.png)

The Date Variable annotation follows the pattern: `($y|$m|$d)(-|+)(1-999)`.

![Date variable annotation syntax reference](http://bkper.com/docs/_astro/search-assistant-4.CrSoCO1R.png)

### By amount

| Operator | Description | Example |
| --- | --- | --- |
| `amount:` | Exact amount | `amount:2000` |
| `amount>` | Greater than | `amount>1000` |
| `amount<` | Less than | `amount<1000` |

### Logical operators

| Operator | Description | Example |
| --- | --- | --- |
| `AND` (default) | Match all conditions | `amount:2000 AND account:Expense` |
| `OR` | Match either condition | `account:'Revenue' OR account:'Other Income'` |
| `NOT` | Exclude from results | `NOT "Bank Account"` |

### Balance periodicity

Change how balance values are grouped in search results:

| Operator | Description |
| --- | --- |
| `by:d` | Balance values per day |
| `by:m` | Balance values per month |
| `by:y` | Balance values per year |

## Examples

**Combining AND, OR, and a date filter** — Find salary payments from a specific account before a date:

```
account:'Brex Cash' ('Salary Pat' OR 'Salary Michael') before:01/01/2026
```

![Bkper search results showing salary transactions from the Brex Cash account](http://bkper.com/docs/_astro/bkper-search-query-example1.DoNubfwY.png)

**Dynamic income search for the last 24 months** — Show Revenue and Cost of Goods Sold over a rolling window:

```
group:'Revenue' OR group:'COGS' after:$m-24
```

![Bkper search results showing Revenue and COGS groups with balance chart over 24 months](http://bkper.com/docs/_astro/bkper-search-query-example2.B0YUAdv4.png)

## Saved queries

Saved queries reduce the effort of periodic reporting. Prepare your search conditions — including date variables for dynamic ranges — and save the query for later use. You can re-run it with a single click in the web app, or use it with auto-update in the Bkper Add-on for Google Sheets.

> **Tip**
> Saved queries are available on [Bkper paid plans](https://bkper.com/pricing/).
### Saving a query

Open your Book and type the desired query in the search box. Then open the **context menu** (three-dot icon), select **Save Query**, give it a meaningful name, and confirm with **OK**.

![Typing a query in the Bkper search box](http://bkper.com/docs/_astro/saved-queries-1.B-ex0M8f.png)

![Selecting Save Query from the context menu](http://bkper.com/docs/_astro/saved-queries-2.DyxNn37n.png)

![Entering a descriptive name for the saved query](http://bkper.com/docs/_astro/saved-queries-3.DZKm4pf3.png)

#### From the Bkper web app

Your saved queries appear in the left sidebar of the Book. Click any saved query to instantly run it and view the updated results.

![Saved queries listed in the left sidebar of a Bkper Book](http://bkper.com/docs/_astro/saved-queries-4.Cx3m4-f4.png)

#### From the Bkper Add-on for Google Sheets

Open a Google Sheet and launch the [Bkper Add-on for Google Sheets](http://bkper.com/docs/guides/google-sheets.md). Select your Book, click **Fetch**, and choose your saved query from the list. The add-on pulls the matching data directly into your spreadsheet.

![Using a saved query from the Bkper Add-on for Google Sheets to fetch data](http://bkper.com/docs/_astro/saved-queries-5.CE7dM9p-.png)

## Where queries work

The query language is universal across Bkper:

- **Web app** — type queries in the search bar on the Transactions page
- **Search Assistant** — build queries visually with guided suggestions
- **[Bkper Functions](http://bkper.com/docs/guides/google-sheets/functions-reference.md)** — use queries as parameters in `BKPER_BALANCES` and `BKPER_TRANSACTIONS`
- **[Bkper Add-on](http://bkper.com/docs/guides/google-sheets.md)** — fetch transactions and balances filtered by query
- **[Google Apps Script](http://bkper.com/docs/build.md)** — pass queries programmatically to the Bkper API

A query that works in one place works in all of them. This means you can prototype a query in the Search Assistant, then paste it into a Google Sheet for automated reporting.

---
source: /docs/guides/using-bkper/signing-in.md

# Sign in to Bkper

Bkper uses **Google Sign-In**. Your Google Account is how Bkper recognizes you when you access the app and related Google Workspace integrations.

You can sign in with a **Gmail** account, a **Google Workspace** account, or any other email address linked to a **Google Account**.

## Before you sign in

If you use a work email, the main thing to confirm is whether it already belongs to **Google Workspace** or still needs to be linked to a **Google Account** first.

## How to sign in

1. Go to [bkper.app](https://bkper.app)
2. Click **Sign In**
3. Follow the Google sign-in steps

The first time you sign in, Google may ask you to authorize Bkper to recognize your account. Future sign-ins are usually simpler unless your session changes or access is revoked.

## Using a company or non-Gmail email

Many people use a company or domain email, such as `name@yourcompany.com`, instead of Gmail. You can still sign in to Bkper with that address as long as it is linked to a Google Account.

### Google Workspace account

If your organization uses Google Workspace, your company email is already a Google Account. Just sign in with that email as usual.

### Non-Google email provider

If your company email is hosted outside Google, you can create a Google Account using that same address and then use it to sign in to Bkper. You do not need to create a separate Gmail inbox just to use Bkper.

> **Tip: You don’t need Gmail**
> Bkper works with Gmail, Google Workspace, and non-Gmail email addresses that are linked to a Google Account.
## Who manages sign-in and security

Bkper uses Google Sign-In, but Google manages most identity and security settings for your account. That includes your password, email verification, account recovery, two-factor authentication, and general sign-in security.

If you use **Google Workspace**, your administrator may also manage organization-wide sign-in policies and security requirements for your company account.

Bkper manages what happens inside Bkper itself, including your access to the app, your Books, collaboration, and sharing permissions.

## What Bkper accesses

When you sign in for the first time, Google may ask you to authorize Bkper. This lets Bkper use your basic profile information, including your name and email address, so it can recognize your account.

Bkper does **not** gain access to unrelated personal content like your Gmail inbox just because you signed in with Google.

Some Bkper integrations request additional permissions separately when needed. For example, the [Google Sheets Add-on](http://bkper.com/docs/guides/google-sheets.md) asks for its own access scopes.

## If you can’t sign in

First, make sure you are signing in with a **Google Account**. If you use a work email, confirm whether it is already part of **Google Workspace**. If it is not managed by Google, create a Google Account with that same address first.

If the problem is related to your password, email verification, account recovery, or two-factor authentication, check your Google Account settings or contact your Google Workspace administrator.

## Next steps

Start by [signing in to Bkper](https://bkper.app). After that, learn how [Books](http://bkper.com/docs/guides/using-bkper/books.md) work.

---
source: /docs/guides/using-bkper/transactions.md

# Transactions

Transactions are at the heart of Bkper — they track the movement of value between **Accounts**, keeping your financial records accurate and always balanced. The more transactions you record and post, the smarter Bkper becomes, automatically recognizing patterns and completing entries for you over time. For a deeper look at the model, see [Core Concepts — Transactions](http://bkper.com/docs/core-concepts.md#transactions).

## Recording a transaction

You can record transactions using **any text, file, or URL** as input. Entries can come from the Bkper web app, mobile app, Google Sheets (via the [Bkper Add-on](http://bkper.com/docs/guides/google-sheets.md)), [Bank Connections](http://bkper.com/docs/guides/automations/bank-connections.md), email, or other user connections.

Type a description in the input field at the bottom of your Book. For example, if you took a taxi ride for **$25** and paid in cash, type **Taxi 25** and press the **Post** button.

At this point, the transaction is recorded in a **Draft** state. Bkper hasn't assigned any accounts yet, so it remains incomplete and no account balances are updated.

### Hashtags in descriptions

Adding [hashtags](http://bkper.com/docs/guides/using-bkper/hashtags.md) to a transaction description — like `Office supplies 150 #inv4821` — makes the entry instantly searchable and helps the [Bkper Agent](http://bkper.com/docs/guides/automations/bkper-agent.md) learn account patterns. Click any hashtag to filter all transactions carrying that tag. Hashtags also enable [segment reporting](http://bkper.com/docs/guides/using-bkper/hashtags.md#segment-reporting): balance values cross-referenced by hashtag across accounts, useful for tracking projects, departments, or cost centers without adding accounts.

### Attaching files

You can attach receipts, invoices, and other documents directly to any transaction using the [Attachments](http://bkper.com/docs/guides/using-bkper/attachments.md) feature — via the paperclip icon, drag-and-drop, or by [forwarding emails](http://bkper.com/docs/guides/using-bkper/record-by-email.md) to your Book. Multiple files per transaction are supported, with a 20 MB limit per file. Images and PDFs render inline for quick review.

### External links

You can also add [external links](http://bkper.com/docs/guides/using-bkper/external-links.md) to a transaction — URLs pointing to invoices, documents, or resources in other systems. Paste a URL in the input field when recording, or click the link icon on an existing transaction. External links complement attachments: link to the source and attach a local copy.

## Posting a transaction

To post a transaction, press the **green >>** or **red >>** button at the beginning of the transaction. If accounts aren't yet assigned, click the red **>>** symbol to open the form and assign the **From Account** and **To Account**:

- **From Account** — where the value is coming from (e.g. **Cash**)
- **To Account** — where it's going (e.g. **Transport Expense**)

Once posted, the transaction moves to the **Unchecked** state and your account balances are updated. Bkper also learns this pattern for future transactions — type **Taxi 30** next time and it will automatically suggest the same accounts.

[Image: Animated walkthrough showing how to record, complete, and post transactions in Bkper, and how Bkper learns from patterns]

## Transaction states

Every transaction moves through states that keep your financial data accurate, auditable, and always under your control.

### Draft

When you record a new transaction, it begins as a Draft. At this stage it **does not affect account balances**. A Draft can be **incomplete** (red **>>**) if it's missing a date, amount, From Account, or To Account — or **complete** (green **>>**) and ready to post. Trashed Drafts can still be recovered.

Over time, the [Bkper Agent](http://bkper.com/docs/guides/automations/bkper-agent.md) learns from your entries and completes more records for you.

### Unchecked

Once posted, a transaction moves to **Unchecked**:

- It **updates account balances** and becomes part of your financial records
- It can still be **edited**, trashed, or recovered
- It can be **checked** to lock it for accuracy

### Checked

A **Checked** transaction is locked for financial integrity:

- It **cannot be edited**, preventing accidental changes
- It **cannot be deleted**, keeping your records secure
- Only users with **edit permissions** can uncheck it if adjustments are necessary

### Trashed

When a transaction is trashed, it moves to the trash bin instead of being permanently erased. Both Draft and Unchecked transactions can be recovered. Checked transactions cannot be trashed.

### Searching transactions

Use the [query language](http://bkper.com/docs/guides/using-bkper/search-and-queries.md) to filter transactions by status, account, date, amount, or description. Status operators like `is:draft`, `is:checked`, and `is:unchecked` let you find transactions in a specific state — combine them with account and date filters for precise reporting, such as `is:unchecked account:Cash after:$m-1` to find all unchecked cash transactions from the last month.

## Editing a transaction

To modify a transaction, click the **pencil icon** at the beginning of the transaction.

### Transaction properties

You can attach [custom properties](http://bkper.com/docs/guides/using-bkper/properties.md) to individual transactions — invoice numbers, purchase order references, receipt URLs, or any per-entry metadata that doesn't belong in the description. Open a transaction for editing and expand the properties section to add key/value pairs.

Properties keep transaction descriptions clean while making structured data available for search, reporting, and automations. See the [Properties guide](http://bkper.com/docs/guides/using-bkper/properties.md#transaction-properties) for details.

## Checking and unchecking

To **check** an Unchecked transaction, click the **gray check icon** — this locks it from further modifications. To **uncheck** a Checked transaction, click the **green check icon**. Only **Book Owners or users with Edit permissions** can uncheck transactions.

### Comments on transactions

You can leave [comments](http://bkper.com/docs/guides/using-bkper/comments.md) on any transaction — requests for a collaborator, notes explaining why an entry was recorded, or audit context. Mention a teammate with **@username** and they receive an email notification; they can reply directly to the email, and Bkper adds the reply (plus any attachment) as a new comment on the same transaction.

## Trashing and restoring

To delete a transaction, click the **trash bin icon** at the end of the transaction. To restore a deleted transaction, click **Trash** in the left menu, find the transaction, and click the **restore icon** at the beginning of the transaction.

## Split transactions

In Bkper, each transaction has exactly **one From Account and one To Account**. To split a transaction across multiple accounts, use an intermediate account to break the total into its component parts.

Imagine a **$100** purchase at a supplier using a credit card, where **$60** is for office materials and **$40** is for a maintenance service. Record it in two steps:

First, record the total payment to the supplier:

| Date | Amount | From Account | | To Account | Description |
| --- | --- | --- | --- | --- | --- |
| 01/15/2026 | 100.00 | Credit Card | >> | Supplier | Total purchase |

Then, split the expense using the supplier as the intermediate:

| Date | Amount | From Account | | To Account | Description |
| --- | --- | --- | --- | --- | --- |
| 01/15/2026 | 60.00 | Supplier | >> | Office Materials | Office supplies |
| 01/15/2026 | 40.00 | Supplier | >> | Service Fees | Maintenance service |

![Split transaction in Bkper using a supplier as intermediate account](http://bkper.com/docs/_astro/split-transactions-1.Dzl-62PK.png)

This ensures the credit card's running balance matches its statement and expenses are properly categorized. In this example, the Supplier account acts as a temporary clearing account that is fully cleared by the two split entries.

> **Tip**
> The same approach works for receivables or any situation involving multiple origin or destination accounts — just use an intermediate account to connect the flows.

### Copying a transaction

Select a transaction using the **checkbox**, then click the **+** button in the input bar to open the input form in order to *copy* it. Post the transaction from the form to *paste* it as a new Transaction.

### Merging transactions

Select **two transactions** using the checkboxes, then click the **merge button** in the top menu (the top menu does not appear with the input form open).

Merging two transactions with different values produces a new transaction reflecting the **difference in amount**, ensuring balance accuracy. The oldest entry merges into the newest while preserving all data. A record of the merge remains in **Activities** and the **Trash bin**. If transactions have a `remoteId` from an external source, both IDs are retained to prevent future duplicates.

To undo a merge, restore the trashed transaction.

### Batch editing

Select **two or more transactions**, then click the **pencil icon** in the top menu to edit them in bulk. Batch edits on draft transactions do not post the modified transactions.

### Batch deleting

Select **two or more transactions**, then click the **trash bin icon** in the top menu to delete them at once.

## Related

- **[Record Guide](http://bkper.com/docs/guides/using-bkper/record-guide.md)** — detailed recording workflows, including date and amount formats, account completion, and the record form
- **[Record by Email](http://bkper.com/docs/guides/using-bkper/record-by-email.md)** — record transactions by sending an email to your Book
