Is there a non-code way to search for contacts with no contributions recorded?

(A search in search builder will only result in contact with contributions with null values, which is not the same as no contributions at all.)

It could be a search, or a report, or even an extension. But how do you find contacts with no contributions?

  • Wonder if you can do this using Drupal Views? Commented Apr 14, 2015 at 16:09

5 Answers 5


You can do it in two steps:

  • Search for all contacts, and put these in a tag (or group).
  • Do a second search, for all contacts WITH a donation. And then remove these from you tag (or group) using action Untag Contact (or Remove contact from group).

Adding the Summary Fields extension is the way to go. Use Advanced Search to find contacts with zero lifetime donations to create a smart group or list of people who have never given. Subsequent donations from those contacts will automatically remove them from the smart group.

If you are interested in finding people who have given at some point, but not since a specific date, you use Advanced Search and Summary Fields to exclude anyone who has a non zero life time contribution, but who's last contribution was before your cutoff. Here's an example of the search entries. Advanced Search summary fields

You can get the summary fields extension by installing from Administer > System Settings > Manage Extensions, and can find more information about it at https://civicrm.org/extensions/summary-fields


Summary Fields is a very cool extension that can do what you're talking about.

Once you set it up, you can search by many aggregate parameters including "total lifetime contributions".

  • Cool! However I am also(!) wondering about the possibility to search for no contributions in a certain time span...
    – Flying
    Commented Mar 26, 2015 at 17:58

For contacts with no gifts ever, use Search Builder. Include contacts where >Contribution > Contribution ID > Is Null.

For contacts who didn't give within a specific timeframe, I can only come up with one front-end way. It's kludgy but may get the job done. Create a custom text field for contacts, let's call it "Special Use". Create a group that includes all contacts who gave before OR after the timeframe. Use Batch Update via Profile to edit all contacts in this group, setting the text of Special Use to "Exclude". Now use Search Builder to look for contacts where >Contact > Special Use > Is Empty (or Is Null). Not pretty at all, but no code required.

It would be nice if Search Builder had a NOT option, so we could exclude people who meet certain criteria. Or if we could use CiviMail's Include/Exclude group functionality to build our list and save the result as a new group without actually sending the email (like Raiser's Edge users do with the Quick Letters feature). Maybe one day!

  • CiviCRM's search facilities are relatively weak IMO in respect of trying to find records where things haven't happened or omitting a set of records from a search result. I used to use FileMaker years ago, and that had some useful, and user-friendly tools in this regard.
    – Graham
    Commented Mar 26, 2015 at 21:53

I know you said "no code", buuuut... just in case anyone else might be wondering, here's the SQL that would do it (including the date range you mentioned in your comment)

from civicrm_contact as contact
left join civicrm_contribution as contrib on 
  contrib.contact_id = contact.id and 
  contrib.receive_date between '2015-01-15' and '2015-02-15' 
  contrib.id is null;

Building a custom search from a query like this is actually one of the easier types of customizations to make.

Or if you're in a pinch, you could use an application like MySQL Workbench to run this code and inspect the results through a nice visual interface.

  • Thanks, nice reference. But SQL is not especially helpful for low-tech backend staff...:-)
    – Flying
    Commented Mar 26, 2015 at 19:14
  • yes, but you can use the sql to get your developer to write a custom search extension and hence is a good starting point Commented Apr 14, 2015 at 16:09

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.