Building a detailed event management system (and some other cool stuff) with CiviCRM

2011-04-28 21:37
Written by

Note: You can see videos of these features in action on NS Web Solutions' case study page for this project.

Update: Some of the code for these features is available on GitHub. See my comment below.


CiviCRM offers an incredible set of features straight out of the box. At NS Web Solutions we're sometimes asked to provide a CRM system with some pretty unique features, and we've found that by relying on CiviCRM's wide array of hooks and customization features, there's a lot that can be done.

We recently completed a project for a client that conducts many events per year in which all participants are fully sponsored to attend, including airfare, airport pickup, hotel accommodations, and meals. To complicate the equation, not all participants are given the same package; variations include hotel room type, in-room amenities, class of travel, length of stay, type of airport pickup, and more.
Seemlessly integrating all this data into CiviCRM was critical. We built a custom Drupal module implementing CiviCRM's wide array of hooks, in addition to a number of custom data fields, to achieve this.

Active event

To help minimize extra clicks, the client requested a way to set a "active" or default event for most operations. Since this system is used so heavily for event management, and since most staff users generally work with only one event at a time, we save a lot of time by removing the repeated question, "Which event?" by just answering it once in once place.  This is a persistent per-user setting, accessed through a custom "settings" page.
Once this is set, the system remembers this setting for most event-related actions. For example, when adding a contact to an event, the active event is selected by default, and when viewing event reports, the report is displayed for the active event. For our custom event-management features, the active event is simply assumed outright.
Active event in contact search

In-place editing on a single page

For this system we created over 50 custom fields for Participants, to cover the variety of participation options mentioned earlier. Since the host organization is sponsoring all aspects of participation, their staff often need to adjust these amenities for a large number of records at once. Finding and opening each individual participant record can be a tedious process. 
To streamline this process, we designed a one-page interface that lists all participants in the active event, with relevant amenities for each participant. Staff can simply click any item in the page to edit it in-place, thus avoiding multiple page loads and getting the job done very quickly.
Simple one-page interface for editing multiple contacts
A similar technique was used for special screens designed for staff who manage inbound and outbound flight data, airport pick-up and drop-off, hotel reservations and check-ins, and more. In these screens, participants are edited through pop-up screens that save the data in-place, again avoiding repeated page loads while providing a slightly more spacious interface for each participant.
More spacious in-place editing for multiple contacts

Report sorting and group headers

At the client's request, we enhanced CiviCRM's reporting tools to allow for configurable sorting and group headers. For example, where a report includes 100 participants arriving on 3 different days for two different hotels, the staff hotel coordinator may prefer to see a report that groups participants by date, then by hotel within each date, and then sorts by flight arrival date. Each group header include a total count of records within the group, so that staff can get a quick overview of numbers in addition to the detailed report contents.
Report with sorting and headers

Relationship mapping and listing

Besides event management, this client also makes heavy use of CiviCRM's great relationship tracking features. To add to the power of these features, we designed two additions that appear under the contact "Relationships" tab: Relationship Maps, and Relationship Lists.
These are meant to help answer the question: "If we know Joe Smith, who else can we connect with through him?" Or: "Who do we know who can help us connect to Jane Doe?" It's another play on the old "6 degrees of separation" game.
The Relationship Map is a simple point-and-click browser that allows staff to quickly and visually navigate from one contact to another through an extended node map of relationships. With this feature, staff can easily see which other contacts of interest may be accessible through a network of relationships.
Relationship map
The Relationship List displays similar information in a more compressed list display, showing who is connected to a given contact's network, and how many degrees or steps they are removed. By selecting an contact from this list, the user can see a visual display showing the specific path from the first contact, through any number of intermediary relationships, to the target contact.
Relationship list

A lot of possibilities

When we started this project, we weren't sure how much we'd be able to do without having to hack CiviCRM core files. As it turned out, everything was done without any hacks to core, except the "Report sorting and group headers" features. CiviCRM hooks open up a lot of possibilities. It's this kind of potential for customization that keeps us coming back to CiviCRM, and as new hooks and features are added in the newer releases, that flexibility continues to increase.


Thanks for sharing.


Definitely in place editing would benefit the standard page of civicrm. What widget did you use? I'd like to chat about it on IRC with you


As for the distance relationship, it sounds great. Have you shared the code (as a separate module presumably) ?



I've posted code for the "Relationship mapping and listing" and  "Report sorting and group headers" features on GitHub. Each is in a separate Drupal module:

Each of these modules is dependent on the tmcivi module, which is here:

There's lots of room for improvement. Please ping me on IRC (TwoMice) or message me on GitHub with questions, suggestions, or rants.