We are a trade union with several hundred members paying their dues on a monthly basis. They pay via their bank or through check-off from their employer. We have to keep their contributions and membership status up to date.

We have membership status rules set up so that we know who is a financial member and who has lapsed.

My question is this: how to bulk import contributions in a way that will automatically renew the membership?

Batch data entry seems to achieve this - but it requires putting in the names one at a time.

Importing a csv file enables bulk import of contributions, but does not seem to automatically renew membership.

Using profiles does not seem to renew membership either.

So ... suggestions would be much appreciated.

  • What CMS is this on? I am asking because I was thinking through what CiviEntities and Views Bulk Operations could offer, since it would allow for bulk updates of eg Membership Status ID and End Date. I doubt it will answer your needs but a useful exercise in exploring more of what we can do via VBO now ;-)
    – petednz - fuzion
    Apr 10, 2015 at 23:10
  • Dave - did you find a solution. I am trying to do the same with monthly standing orders from a bank statement and I don't think any of the solutions suggested below are going to work for me.
    – Mick Kahn
    Feb 3, 2019 at 0:11
  • I would check if civicrm.org/extensions/api-csv-import-gui can help, or be extended to help
    – petednz - fuzion
    Mar 10, 2019 at 18:56

4 Answers 4


We've done this sort of thing in our Direct Debit extensions. From memory if there is a recurring record and the membership is set to auto renew then it works fine i.e. renews the membership as needed. If you are a techie you could take a look at the code.

  • Could you provide a link and a few more details to improve this answer?
    – Coleman
    Apr 10, 2015 at 14:05
  • civicrm.stackexchange.com/users/271/parvez-saleh, am I right in reading that these extensions relate to use of Smart Direct Debit. I'm looking to for something that goes from a bank statement mainly for Standing Orders, so I don't this would be a solution for me.
    – Mick Kahn
    Feb 3, 2019 at 0:07

What I have done for similair puprose is to create a custom extension witch a scheduled job which runs daily and renews all memberships which should be renewed on that day.

See for an example: https://github.com/SPnl/nl.sp.renewmembership this example contains a bit more organisational specific logic.


It may be worth noting that the fuzion csv GUI import to API extension opens up many new doors for importing via the UI that were previously not available so worth considering as an option.


I have exactly the same issue as Dave Smith with regular bank payments via the bank. They are standing orders not direct debits so Parvez Saleh's answer doesn't help. The way I think I will do it for now, is to use the contribution imports and give each batch a source such as "Bank Feb 2019". Then I can do an advanced search on memberships matching contributions with this source and use a profile to bulk update the membership end dates.

This means a lot less typing and risk of errors than typing everything into a contribution/membership batch, but is far from perfect. What I would really like is the ability to upload a contribution/membership batch. Whilst I expect much of the code already exists to do contribution upload and batch processing, the data checking would be quite complicated and its beyond my competence to produce this.

Dave - what solution did you find?

  • Just to update that I have now had a chance to try out my solution to this problem and it works quite well. I also realise that there are always quite a few special cases to be dealt with, so fully automating it would require a lot of coding to do the checking. It will certainly do for now
    – Mick Kahn
    Oct 26, 2019 at 17:36

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.