Skip to content
Report · Financials

Profit and loss summary by month

Revenue, cost of sales, gross profit, operating expenses and net income per month, with margins.

  • monthly
  • kpi
  • profit and loss
Sample preview, fictional dataYour own figures appear after import.

01

About this report

The main income statement totals, one row per posting period for the last 24 months, in base currency from the primary accounting book. The columns are revenue, cost of sales, gross profit, operating expenses, other income and expense as one net figure, net income, gross margin and net margin.

When you group by Quarter or Year, margins are recalculated from the totals, not averaged. The report is built for dashboard tiles and trend lines. For the account-level statement, use Income statement by month.

02

Sample preview

Fictional figures in the shape you will see. Yours come from your account.

MonthRevenueCost of salesGross profitOperating expensesOther income and expenseNet incomeGross marginNet margin
2026-06588,200196,400391,800301,250-2,10088,4500.670.15
2026-07552,900190,100362,800296,80085066,8500.660.12
2026-08600,750201,900398,850305,120-1,220.8092,509.200.660.15
2026-09571,300198,200373,100299,40031074,0100.650.13

03

The SuiteQL

This is the query each report runs. Read it, copy it, or change it after import.

Profit and loss summary by month
SELECT period,
       revenue,
       cost_of_sales,
       revenue - cost_of_sales AS gross_profit,
       operating_expenses,
       other_net,
       revenue - cost_of_sales - operating_expenses + other_net AS net_income,
       (revenue - cost_of_sales) / NULLIF(revenue, 0) AS gross_margin,
       (revenue - cost_of_sales - operating_expenses + other_net) / NULLIF(revenue, 0) AS net_margin
  FROM (SELECT TO_CHAR(p.startdate, 'YYYY-MM') AS period,
               SUM(CASE WHEN a.accttype = 'Income' THEN -tal.amount ELSE 0 END) AS revenue,
               SUM(CASE WHEN a.accttype = 'COGS' THEN tal.amount ELSE 0 END) AS cost_of_sales,
               SUM(CASE WHEN a.accttype = 'Expense' THEN tal.amount ELSE 0 END) AS operating_expenses,
               SUM(CASE WHEN a.accttype IN ('OthIncome', 'OthExpense') THEN -tal.amount ELSE 0 END) AS other_net
          FROM transactionaccountingline tal
          JOIN accountingbook ab ON ab.id = tal.accountingbook AND ab.isprimary = 'T'
          JOIN transaction t ON t.id = tal.transaction
          JOIN account a ON a.id = tal.account
          JOIN accountingperiod p ON p.id = t.postingperiod
         WHERE tal.posting = 'T'
           AND a.accttype IN ('Income', 'COGS', 'Expense', 'OthIncome', 'OthExpense')
           AND p.startdate >= ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -23)
           AND p.startdate <= SYSDATE
         GROUP BY TO_CHAR(p.startdate, 'YYYY-MM'))
 ORDER BY period

04

Appears in

ReportFinancials

Profit and loss summary by month

Screenshot of the Profit and loss summary by month report in HiScale Advanced Reports, filled with fictional sample data
Sample preview, fictional dataOpen image full size (opens in a new tab)