“How many people do we have in each ZIP code?” sounds like a one-query job. It turns into two questions as soon as someone asks a follow-up: are we counting people or mailboxes? A grant report about community reach usually wants individuals. A postcard budget wants households, because two adults at one address get one piece of mail. Altru can give you both numbers, but you have to build them differently, and you should decide which one you need before you open the query designer.
Count individuals by ZIP
This is the easier of the two. Start a constituent query and keep it limited to individuals, not organizations or groups.
- Filter to individual constituents. Organizations and household/group records are constituents too. If you don’t exclude them, a household record can get counted alongside the people in it.
- Exclude records you wouldn’t count in real life. Deceased constituents and inactive records are the usual ones. Many organizations also exclude records with no address at all, since they can’t be placed in a ZIP anyway.
- Use the primary address. Pull the ZIP from the constituent’s primary address rather than from “any address.” If you use all addresses, someone with a home and a seasonal address shows up in two ZIP codes, and your totals add up to more people than you have.
- Output the constituent ID and the ZIP. Keep the ID in the output even if you don’t need it. It’s how you’ll spot duplicates later.
Then group and count. Altru’s query and reporting options may let you summarize results directly, but the method that’s easiest to check is to export the results and run a pivot table in Excel or Google Sheets (rows = ZIP, values = count of constituent ID). Use that the first time you build this, so you can see every row behind each number.
Clean up the ZIP before you count
Postal codes are rarely stored consistently. You’ll see “98501”, “98501-1234”, and occasionally “98501 ” with a trailing space. Each one becomes its own row in a pivot. Before counting, add a helper column that keeps only the first five characters (for U.S. addresses) so ZIP+4 values roll up into their five-digit ZIP. Canadian and other international postal codes need their own handling; it’s usually simplest to filter them out or group them by country.
Count households by ZIP
Households are where people get tripped up, because not every individual in Altru belongs to a household record. Some organizations create households for every member family; others only create them when a membership or gift requires it. That means “count the household records” usually undercounts.
A more dependable approach is to count mailing units:
- Every individual who belongs to a household counts once per household, not once per person.
- Every individual who does not belong to a household counts as their own household.
To do that, add the household’s ID (through the individual’s group or household membership fields) to the same individuals query you built above. In your spreadsheet, create a “mailing unit” column: use the household ID when there is one, otherwise the constituent ID. Then count distinct mailing units per ZIP instead of counting rows.
Two things to watch:
- Former household members. If an individual has left a household (a divorce, an adult child who moved out), make sure your query only pulls current household membership. Otherwise they’re still attached to the old household and get placed in the wrong ZIP.
- Household members with different primary addresses. It happens more than you’d expect, usually from an address update made on one person but not the other. When the same household ID appears under two ZIP codes, that’s a data-quality flag, not two households. Decide whether to use the household’s address or the head of household’s, and fix the outliers in Altru.
If you aren’t sure which household or group fields your Altru version exposes in the query designer, check the available fields under the constituent’s group membership area, or test the query against a small set of constituents you know well, such as staff members who are also members.
Sanity-check the numbers
Before you hand the report to anyone, run three quick checks:
- Total individuals across all ZIPs should equal the row count of your query. If it’s higher, someone is appearing twice.
- Households should never exceed individuals in any ZIP. If they do, your mailing-unit logic is off.
- Look at your top five ZIPs. You know your community. If a ZIP you’ve never heard of is in the top five, it’s probably a typo pattern or an import that went in wrong.
Duplicate constituent records will inflate both counts. If the same person exists twice with slightly different names, they count twice, and the household logic can’t save you. It’s worth checking for obvious duplicates in your highest-count ZIPs before reporting.
Make it repeatable
Save the query with a clear name and a description of what it includes and excludes, for example “Individuals by primary ZIP – excludes deceased, inactive, no address.” The next person who runs it (or you, in six months) will need that context to trust the number. If you’re filtering to a segment, such as current members or donors from the last 24 months, build that as a separate saved query rather than editing the base one each time.
If this report gets requested every month or quarter, the export-and-pivot step becomes the tedious part. Social Good’s Data Bridge syncs Altru query results to Google Sheets, so you can keep the ZIP cleanup and pivot on a separate tab that reads from the synced data, rather than rebuilding them from a fresh export each time.
Quick answers
Should I count by primary address or all addresses?
Primary address, almost always. Counting every address on file places some people in more than one ZIP and inflates the total.
Why is my household count so much lower than expected?
You’re probably counting household records only. Individuals who aren’t in a household need to count as their own household, or you’ll miss them entirely.



