Camp Registration - Streamlining with Webform Civi Integration

2013-03-18 15:27
Written by


Lisa presented this work at the SF Meetup in March. Her presentation slides are here

Three years ago I set up a Drupal-based community site for our children’s K-8 public charter school. As the school’s needs grew, I integrated CiviCRM to enable online enrollment, tour registration, ticket sales, volunteer hour tracking, and other functionality that had previously been accomplished through unwieldy paper forms.


As I began to work more closely with a local arts education non-profit, I realized the lessons I had learned from working on the school site were directly applicable to the organization’s needs. SFArtsED runs a summer camp program for children. Till this year, all registrations were completed  on a paper form that was sent, along with a check, via snail mail. The Registrar mailed back four forms to the parent, who filled them out and mailed them back to SFArtsEd, along with a receipt for payment. Last month I set out modernize their camp enrollment process using Drupal, CiviCRM, Ubercart and Webform Integration.


Class Enrollment – The enrollment process now takes place via shopping cart functionality in Ubercart. Each class is set up as a product, as are optional morning and afternoon extended care sessions. Parents can browse the camps offerings, and are instructed to complete a separate order for each child. Each child’s first and last name is added to the user’s UC address information with UC Extra Fields Pane ( to differentiate multiple orders by the same parent for multiple children.  The UC Discount Coupons module automatically applies discounts for multiple sessions, and allows the user to take a 10% sibling discount (


Forms Completion - With Ubercart/CiviCRM integration ( a Civi account is created for the user as soon as they complete a purchase. Through Rules integration, the completion of an order sends them an invoice and a link to a set of Webforms. Once they’ve logged in, their own basic information (name, email, phone, address) is auto-populated into the form. Using Webform CiviCRM Integration (, each form is build with three contacts – User 1, an existing contact – the current logged in parent account, User 2, a Summer Camp Student contact subtype, where the parent can add the child’s information, and User 3, fields for a second parent. The parent is guided through four pages of custom fields including emergency contact information, family background, student pick-up authorizations and a liability waiver. Webforms Integration creates the Parent/Child relationships for each submission. All of this information is now available on a single Civi contact screen, instead of across pages of paper in folders.


Reporting – As a non-profit serving children, the organization is often asked to report on student demographics, including race/ethnicity of students, as well as public vs. private school enrollment. In addition, staff keeps notes regarding student’s skills and abilities to help track their creative development. A custom set of fields is available to the camp administrators to help them track and report on these attributes.


Future Enhancements  - When I learned the specifics of SFArtEd’s needs for summer camp enrollment, I knew that Drupal/Civi/UC were the perfect way to achive the desired results. But as a non-profit, they have multiple other stakeholders including donors and guest artists. I am hoping to extend Civi to provide an all-encompassing CRM that they can leverage for fundraising, ticket sales, and email blasts to their constituents.


The total concept to launch time for this project was almost exactly a month, time outside of my regular job and parenting responsibilities. I can’t imagine making this happen without Civi, Webforms Integration, Ubercart and a lot of great advice from the Civi Community!

Click thumbs up if you thought this blog post was useful (login to vote or to comment)


Hey, good to hear the Webform Integration module is being put to good use. I've actually heard of one other summer camp that also uses civi+webforms to register their campers. They are doing it all through webforms and a civi contribution form at the end to collect payments (requires a bit of custom code to get that to work). It's interesting that you've got it set up with ubercart, so probably that means the flow is reversed - payment first, forms second?

True, all that gets collected during initial registration/payment process is student first name, last name, age and school, mirroring the process they were using on paper. Deeper info gets added after payment.

Also, the benefit of using UC was the complexity of their discount structure, UC Discount Coupons gave me the flexibility I needed for that portion of the purchase process.

Anonymous (not verified)
2013-03-11 - 09:02

I like the flow - pay first and fill out forms later makes sense. uses Version 2 of the CiviCRM API. Also, not sure how nicely it will play with the civiaccount module.  

Sorry I missed it in person but I enjyed the slides.

One note: not sure about the UC side of things, but on the webform end it would be possible for parents to register more than one kid at a time. You could clone contact 2 and conditionally show the extra "student" contact fieldsets based on a webform field (i.e. "how many students are you enrolling").

Anonymous (not verified)
2013-06-02 - 18:41

I've been looking around at options to put together an almost identical enrollment/registration solution.  I have almost narrowed it down to Drupal with Drupal Commerce and CiviCRM as the base system.  Now I just found your blog post.  This is great informaion for me, and I really appreciate you sharing it.

Is there any chance you would be willing to share your base setup and database structure (without any of the user data of course)?  That would allow me to quickly set it up on a test server to evaluate how well it would work for my application.  I guess I'm assuming that you have done this as a volunteer rather than a paid developer, but if the latter is true I quite understand if you're not willing to share.

Thanks again!