Altru Query for Net Revenue by Payment
← Back to Blog

How to Query Net Revenue by Payment in Altru (Not by Sales Order)

October 31, 2026

Finance asks a simple question: how much money actually came in, payment by payment, after refunds? You build a query on sales orders, export it, and the numbers don’t tie to the deposit. One order shows its full amount even though half of it was refunded last week. Another order was paid with two cards, and the query shows one line. The order total is accurate. It just isn’t the number finance wants.

The fix is mostly about where the query starts and which kind of “net” you’re after. Here’s how to think it through and build something that holds up at month end.

Sales orders and payments are different records

In Altru, a sales order describes what was sold: tickets, memberships, add-ons, donations, discounts, the order total. The payment is the money that settled that order, and it lives on the revenue side. Most of the time there is one payment per order and the two match. They drift apart in a few predictable cases:

  • Split tender. One order paid with cash plus a card, or two cards, produces more than one payment.
  • Refunds. A refund is recorded as its own transaction after the fact. The original order and payment don’t shrink; the refund sits alongside them.
  • Exchanges and adjustments. Changes to an order after it closes can add or offset revenue without changing what a simple order query reports.
  • Payments that cover more than one thing. A single payment can be applied across a membership, a donation, and tickets, which matters when finance wants net by fund or category.

A query built on sales orders answers “what did we sell?” To answer “what did we collect, net?” you generally need to start from revenue.

Decide which “net” you mean

Before building anything, pin down the definition with whoever asked. “Net” means different things to different people:

  1. Net of refunds. Payments received minus money returned. This is the most common request and the one Altru data supports most directly.
  2. Net of discounts. Usually already reflected in the amount paid, since the discount reduced what the guest owed. Check this before subtracting anything a second time.
  3. Net of processing fees. Card processor fees typically live in your merchant statements, not in Altru. Unless your organization records fees in Altru somehow, a query can’t produce this number on its own, and you’ll be matching against processor reports outside Altru.

Write the agreed definition at the top of the query description. Six months from now, someone will ask why the totals don’t match a different report, and that note will answer it.

Building the query

Start from revenue, not sales orders

Create a new ad-hoc query using a revenue-based source rather than a sales order source. That makes each row a payment (or refund) instead of an order. Field names and available sources vary with your Altru setup and security rights, so browse the source’s field list rather than expecting a specific name. Look for the transaction date, amount, payment method, transaction type, and the related constituent.

Bring in the order as context

If you still need the order number or sales channel on each row, add it from the related sales order fields within the revenue source. The row should still represent the payment. If adding a field suddenly multiplies your row count, you’ve likely joined to something one-to-many (like order line items), and amounts will double count when you total them.

Include refunds deliberately

Make sure your filters capture refund transactions, not just payments. Then confirm how they come through: some outputs show refunds as negative amounts, some show a positive amount with a type that says “refund.” Run a test on a date range where you know a refund happened and look at that row before trusting a total. If you can’t tell how refunds are represented, ask Blackbaud support or test in a sandbox before reporting on it.

Filter on the date that matters

Filter on the payment or transaction date, not the order date or the visit date. Advance sales are the classic trap: a ticket bought in March for a July visit belongs to March’s cash, and a refund issued in July belongs to July.

Do the subtraction where it’s reliable

Ad-hoc queries are good at returning rows and summing them, but they aren’t built for arbitrary math like “payment minus later refund on the same order.” If refunds already come through as negatives, a simple sum gives you net. If they don’t, export and compute net in a spreadsheet, or look at whether an existing smart field or report in your database already calculates what you need. Don’t assume a calculated net field exists; check the field list.

Reconcile before anyone relies on it

Pick one closed month and compare the query’s net total against your batch and deposit totals for the same period. If it ties, save the query and lock down who can edit it. If it doesn’t, the difference usually points at the cause:

  • Too high: refunds are missing, or a join is duplicating rows.
  • Too low: a payment method or channel (online sales, group sales) is filtered out.
  • Off by a timing amount: you’re filtering on order date instead of payment date.

Once it ties for one month, check a second month with a known refund or split payment in it. That’s where these queries usually break.

Getting the numbers out of Altru

If the net calculation ends up living in a spreadsheet, the weak point becomes the manual export every week or month. Data Bridge syncs Altru query results to Google Sheets, so a revenue query like the one above can feed a sheet where the refund math and any fee matching happen automatically, with Altru remaining the source of the underlying data.

Quick answers

Why does my sales order query show the full amount after a refund?
Because the refund is a separate transaction. The original order isn’t reduced, so you need a query that includes refund transactions to see net.

Can a query show net of credit card fees?
Generally not from Altru alone, since processor fees are usually recorded by your payment processor rather than in Altru. Match against processor statements for that figure.

Continue reading

How to Track Instructor Activity for Scheduled Programs in Altru

How to Track Instructor Activity for Scheduled Programs in Altru

“How many classes did Maria teach last spring, and which ones?” It sounds like a question Altru should answer in ten seconds. In practice, many education departments end up digging through calendars, email threads, and a payroll spreadsheet to piece it together, because the instructor was never recorded anywhere a query could find. Altru is

How to Turn a Group Sales Overpayment Into a Donation in Altru

How to Turn a Group Sales Overpayment Into a Donation in Altru

A school books a field trip for 60 students, sends a check for the full quote, and then 48 kids show up. The teacher says, “Keep the difference, it’s a gift.” Now you have a group sales order that is overpaid, money that is really a donation, and a deposit that has to balance. The

Can a Spouse Be a Fundraiser in Altru? Solicitor Credit for Couples

Can a Spouse Be a Fundraiser in Altru? Solicitor Credit for Couples

It happens more often than you’d expect. A board member and her husband both care about your capital campaign. She asks a friend for a gift, but it was really his introduction and his follow-up phone call that closed it. Development wants him credited as the fundraiser on that gift. Then someone at the desk

Social Good platform

See it in action

Get started with Social Good

Book a demo to see Social Good Software in action for Altru.

Book a Demo
Social Good platform

See Social Good in action

Tell us a bit about your organization and we’ll take you straight to short demo walkthroughs of the software.

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.