Skip to main content

Food and Beverage (F&B): Recording Sales

Written by Nisha Ravi (NR)

Introduction

Food and Beverage (F&B) businesses typically sell through a POS system, delivery platforms, or a mix of both — and however the sale happens, it eventually needs to land in Bukku as a proper accounting entry. This guide covers the different ways to record sales in Bukku, and how to report sales by revenue stream or outlet.

Sales Recording Methods

Depending on how your business operates, sales can be recorded in Bukku automatically through a POS integration, or manually if you don't use a POS system. F&B businesses typically use one of the following methods:

  1. StoreHub Integration

    • Bukku offers a direct integration with StoreHub. Once activated, sales orders recorded in StoreHub sync to Bukku automatically, reducing manual data entry.

    • Refer to our StoreHub Integration article collection for more information.

  2. FeedMe Integration

    • FeedMe also supports integration with Bukku, managed and maintained by the FeedMe team.

    • Contact FeedMe directly for setup assistance, or refer to their API documentation for technical details.

  3. Open API Integration

    • For businesses using other POS systems, Bukku's Open API can be used to build a custom integration so sales data transfers in automatically.

    • Refer to developers.bukku.my for documentation, or contact our developer team at dev@bukku.my with any questions.

  4. Manual Recording

    • Sales are entered directly into Bukku based on POS-generated reports or manual sales records, either as individual transactions or as a summary total, depending on the level of detail you need.

    • For businesses with high transaction volumes, creating a separate invoice for every individual sale is generally not practical. Instead, you can record daily, weekly, or monthly sales summaries in Bukku, provided detailed supporting records are maintained through POS-generated sales reports or manual cash sales books. This keeps accounting records efficient while retaining sufficient detail for reference and audit purposes. See two examples under Recording Sales in Practice below.

    • If your business needs transaction-level detail inside Bukku rather than a summary total, sales can instead be brought in via Batch Import using files exported from your POS. Refer to: Batch Creating and Importing Sales Invoices.

Recording Sales in Practice

The two examples below walk through the most common manual recording scenarios — summarising daily sales collected across different payment methods, and recording sales made through delivery platforms.


Example 1: Manual Sales Summary Recording

This example shows how to record a daily sales summary split by payment method.

Situation: ABC Café operates a single outlet with no POS system and doesn't sell through delivery platforms — just walk-in customers paying by cash, QR, or card at the counter. Since there's no POS or platform integration, daily sales are recorded manually as a summary at the end of each day, split by the payment methods actually collected.


Step 1: Set Up Payment Methods

Control Panel > Payment Methods

Map each payment method to the correct account:

  • Cash → 1000-00 Cash on Hand (received immediately)

  • QR Payment → 1000-01 Bank Account (settles instantly)

  • Credit Card → 1003 Undeposited Funds (settles a few days later — parked here until it actually lands in the bank)

This is a one-time setup.

Step 2: Create the Sales Invoice

Sales > Invoices > +New

2.1 Fill in the Invoice Details

Set Payment Mode to Cash Sales, and select the Cash Sales contact in the Customer field, since this is a summary invoice that isn't billed to a specific customer.

Example: ABC Café's total daily sales for 1 October 2026 amounted to RM1,500, coded to your Sales Income account.


2.2 Split the Payment Received by Payment Method

Instead of leaving the Payment Received section as one row, click + Payment to add a row per payment method collected during the day.

Example: RM1,500 collected via RM600 cash, RM500 QR payment, RM400 credit card:

📌 The Deposit To account fills in automatically based on the mapping set up in Step 1, so you only need to select the Payment Method and enter the amount.

Double Entry:

  • Debit Cash on Hand RM600

  • Debit Bank Account RM500

  • Debit Undeposited Funds RM400

  • Credit Sales Income RM1,500

Once saved, the invoice is marked Paid, and each amount goes straight into its account in one step.

Step 3: Clear Undeposited Funds When the Card Settlement Arrives

Bank > Money In > +New

Credit card amounts don't reach your bank on the same day. When the settlement lands (usually 1 to 3 business days later), record it as Money In to move the amount from Undeposited Funds to your Bank Account, so both balances stay accurate.

Example: On 3 October 2026, RM392 is credited to the bank after the card provider deducts an RM8 processing fee from the RM400 card sales.

  • Item line: Account set to Undeposited Funds, with the full card sales amount

  • Payment Received: Deposit To set to your Bank Account, with the same full amount under Amount

  • Fee Amount: the processing fee deducted by the card provider, with Fee Account set to Bank Charges

Double Entry:

  • Debit Bank Account RM392

  • Debit Bank Charges RM8

  • Credit Undeposited Funds RM400

After this, the RM400 in Undeposited Funds from 1 October is cleared, and your bank balance matches the bank statement.

Example 2: Recording Sales via Delivery Platforms

For businesses selling through delivery platforms (GrabFood, foodpanda, ShopeeFood), each platform can be set up as its own contact. This way, gross sales, commission, and net payout are tracked separately, instead of only the net amount landing in the bank.


Step 1: Set Up the Platform as a Contact

Contacts > +New

Create one contact for each delivery platform you sell through (e.g. GrabFood, foodpanda, ShopeeFood), so sales and payouts are tracked separately per platform.

  • Entity Type: General Public

  • Legal Name: the platform name, e.g. GrabFood

  • Registration No. Type: None

  • Type: Customer

📌 Why General Public? The actual buyers are the individual customers ordering through GrabFood, not GrabFood itself, so the contact is set as General Public with no registration details. GrabFood also issues e-Invoices to these customers on your behalf, so invoices under this contact are for your own bookkeeping only.

Step 2: Set Up a Commission Expense Account

Accounting > Chart of Accounts > +New

Create an expense account to track platform commission separately, e.g. Platform Commission, so it appears as its own line in the Profit & Loss.

Step 3: Record the Sale

Sales > Invoices > +New

Issue an invoice to the platform contact for the gross sales amount, with Payment Mode set to Credit Sales, since the platform hasn't paid out yet.

Example: GrabFood sales are recorded as a weekly summary. Sales for 1 – 7 October 2026 amounted to RM1,000.

Double Entry:

  • Debit Accounts Receivable RM1,000

  • Credit Sales Income RM1,000

Once saved, the invoice appears in your invoice list with an outstanding balance and a Coming Due status until GrabFood releases the payout.

Step 4: Record the Payout and Commission

Sales > Payments > +New

Enter the full invoice amount under Amount, and the platform's commission under Fee Amount, with Fee Account set to Platform Commission. Then, under Invoice Payments, select the GrabFood invoice (IV-10009) to apply the payment.

Example: GrabFood charged 20% commission (RM200) and paid out RM800.

Double Entry:

  • Debit Bank Account RM800

  • Debit Platform Commission RM200

  • Credit Accounts Receivable RM1,000

Once saved, the invoice is marked Paid, with the RM800 payout recorded in your bank account and the RM200 commission recorded as an expense.

Separating Revenue Streams with Sub-Accounts

By default, all sales are recorded under one Sales Income account. To see each sales channel as its own line in your Profit & Loss, you can set up sub-accounts under Sales Income.

Situation: ABC Café sells through its POS at the counter, as well as on GrabFood and foodpanda. The owner wants the Profit & Loss to show how much comes from each channel.


Step 1: Create Sub-Accounts Under Sales Income

Accounting > Chart of Accounts > +New

Create a parent income account (e.g. 5000 Sales Income) with a sub-account for each revenue stream, such as:

  • 5000-00 POS Sales

  • 5000-01 GrabFood Sales

  • 5000-02 foodpanda Sales

For step-by-step instructions on creating parent and sub-accounts, refer to Structuring Your Chart of Accounts with Parent and Sub-Accounts.

Step 2: Use the Sub-Account When Recording Sales

Sales > Invoices > +New

When creating the invoice, select the relevant sub-account on the item line instead of the main Sales Income account. For example:

  • Daily sales summary invoice → 5000-00 POS Sales

  • GrabFood weekly sales invoice → 5000-01 GrabFood Sales


Result in Profit & Loss

Each sub-account appears as its own line under Sales Income, so you can see how much each revenue stream contributes to total sales at a glance.

Reporting by Branch or Outlet with Tags

If your business has more than one branch or outlet, you can use tags to track each location's sales and expenses separately, without creating extra accounts.

Situation: ABC Café now operates two outlets, in Bangsar and Cheras. Both outlets use the same accounts, but the owner wants to compare sales and expenses for each outlet.


Step 1: Create a Tag Group and Tags

Control Panel > Tags

Create a tag group for outlets, then add one tag for each outlet:

  • Tag Group: Outlet

  • Tags: Bangsar, Cheras

Step 2: Tag Each Transaction

Sales > Invoices > +New

In the General Info section, select the outlet under Tags. Do the same when recording expenses if you want to see each outlet's full profitability, not only its sales.

Step 3: View the Profit & Loss by Outlet

Reports > All Reports > Profit & Loss

In the Comparison field, select the Outlet tag group, then generate the report. Each outlet appears as its own column next to the overall total, so you can compare them side by side.

In this example, Bangsar brought in RM3,500 and Cheras RM2,100, out of RM5,600 total sales.

📌 Using both together: Sub-accounts and tags work on the same transaction. In the screenshot above, the Bangsar outlet's GrabFood sales (RM800) are recorded under the GrabFood Sales sub-account and tagged Bangsar, so the Profit & Loss shows sales by channel and by outlet in one report.

For full details on setting up tags and on filtering or comparing reports by tag, refer to Setting Up and Using the Tagging Function.

Did this answer your question?