From the way you asked the question, I will assume you would know how to group by customer and month, if the month was calendar month - and I will focus only on what is special about the "custom" month definition.
Here is code to generate the test data (which would have been a bit better if it included more than one customer; and, importantly, if it included gaps in the data - "custom" months with no orders from some customers, showing us what you would need in the output in that case):
create table orders (
order_no number primary key,
customer_id number,
order_date date,
amount number
);
insert into orders (order_no, customer_id, order_date, amount)
select 1001, 201, timestamp '2024-06-11 20:10:00', 2000 from dual union all
select 1002, 201, timestamp '2024-06-25 15:35:00', 2100 from dual union all
select 1003, 201, timestamp '2024-06-26 10:20:00', 1700 from dual union all
select 1004, 201, timestamp '2024-07-15 20:58:00', 800 from dual union all
select 1005, 201, timestamp '2024-07-25 13:45:00', 1500 from dual union all
select 1006, 201, timestamp '2024-07-29 16:25:00', 900 from dual
;
commit;
I (ab?)used the TIMESTAMP literal - less writing than TO_DATE and a full format model; alas the DATE literal does not allow time component. Anyway, this is not important - it's just to create test data.
Note that DATE is an Oracle reserved keyword, so you shouldn't use it as a column name (you could, if you enclosed it in double-quotes - which is generally a poor practice). I used ORDER_DATE instead. Similar comment for the output - I used MTH instead of MONTH to avoid any confusion.
The trick is to use TRUNC(ORDER_DATE - 25, 'month') wherever you would otherwise use just TRUNC(ORDER_DATE, 'month'). The reason for this should be obvious. I believe this is what Connor was suggesting (his answer doesn't seem to address your question in its entirety).
In the SELECT list, I add one month to this (because apparently your "month" is based on the last day in the month, not on the first); and I apply TO_CHAR to control the output, so I can't use MTH from the SELECT list in ORDER BY. Alternatively (and the solution I would prefer) is to use ADD_MONTH(...) in the SELECT list, without applying formatting with TO_CHAR - and then format dates in the output from the user interface (NLS_DATE_FORMAT for example).
select customer_id,
to_char(add_months(trunc(order_date - 25, 'month'), 1), 'Mon-rr') as mth,
sum(amount) as sum_amount
from orders
group by customer_id, trunc(order_date - 25, 'month')
order by customer_id, trunc(order_date - 25, 'month')
;
Output is as requested:
CUSTOMER_ID MTH SUM_AMOUNT
----------- --------------- ----------
201 Jun-24 4100
201 Jul-24 4000
201 Aug-24 900