Seat maps and assigned seating for CiviCRM events

2012-10-17 20:57
Written by

We've been using CiviCRM at Bay Area Children's Theatre since 2008, and started using it for ticket sales shortly thereafter.  CiviEvent was really designed for event registrations, and there are some differences between an event registration and a ticket purchase, but we found that CiviEvent gave us enough flexibility to use it for ticket sales -- especially with price sets.  BACT also has some unique flexibility that allowed us to adopt CiviEvent for ticket sales, which other organizations may not have:

1) Ticket fraud (and therefore ticket control) is not a major concern given our audience base

2) Our audience is comfortable with print-at-home tickets (or will call)

3) All of our shows are general admission (no assigned seats)

As BACT has grown, our flexibility around general admission seating has gotten, well...  less flexible :)  Our audience has grown, we have more ticket sales to large groups, we have sell-outs more often, and we're expanding into new venues.

As de facto volunteer IT manager for BACT, I've evaluated lots of different options for ticket sales with assigned seating, and they break down into two categories:

1) Traditional software products which you run on your own servers/infrastructure.  Typically have a huge up-front cost, possibly with customization/implementation fees.

2) Software-as-a-service solutions where you (or your patrons) pay a per-ticket or per-order fee.  The cost may seem small at first, but over time it can add up to be more than #1.

3) Open source ticketing solutions.

Aside from cost, neither option 1 or 2 allow us to retain the rich set of patron data that we get when we use CiviCRM as our ticket sales platform.  It's invaluable to go back and see which performances an important donor has attended in the past, or see which upcoming performances they might be attending and have a board member present to greet them.  This led us to option 3.

Unfortunately, the field for open source ticketing systems is pretty small.  I looked at a few (mostly incomplete) projects before coming across FusionTicket, which is derived from another incomplete project called phpMyTicket.  The current maintainers have adopted a kind of "donationware" model, where the code is licensed under the GPL, but you have to make a donation to their website to download the latest release.  Older releases are available for download without donation.

FusionTicket is "mostly functional" at this point, although the maintainers still caution against using it in a production environment.  FT uses smarty as a templating engine, and its web GUI is divided into admin, web POS (for self-service online ticket sales), live POS (for phone or at-the-door sales) and ticket-taker GUI, designed to be used ticket checkers at the venue entrance.  I find most of the web interfaces to be pretty clunky, although the seat map editor is decent once you get the hang of it.

After a few false starts and much procrastination, I started really thinking about how I could integrate FusionTicket with CiviCRM.  As a test, I decided to see what would happen if I just unpacked the FT code into a new Drupal module directory, and wrote a simple module/hook that called an FT function to draw a seat map and assign the seatmap HTML to a template var.  Then create a custom CRM/CRM/Event/Form/Registration/Register.tpl to display the custom var.  And it actually worked pretty well.  Before long, I was fleshing out buildForm and postProcess hooks to receive the selected seats, call FT functions to check availability and reserve them, and display the seat info on the Confirm and ThankYou pages.  Also hooks for the Event management page to allow admins to assign a particular FT seatmap to a given FT event.

Some things that I've implemented already:

1) Access FusionTicket admin interface from CiviCRM Events menu

2) Allow FT seatmaps to be assigned to CiviCRM events in the Event management page

3) Display seatmap on registration page if event has one configured

4) Check that selected seat count matches number of price set participants 

5) Display selected seats on Confirm and ThankYou pages

6) If participant is deleted, also delete corresponding seats in FT database

7) If CiviCRM event is deleted, also delete corresponding FT seat map copy and seats

There is still lots to do, like allow seat assignments from the admin backend, support seat maps with more than one seat category/price, etc.

My initial module and code is available here:

It includes the full FusionTicket 7.0b release. Definitely experimental at this point.  Looking forward to discussing it with some other folks at the San Francisco CiviCRM meetup on Oct 25.


This sounds like a great start on a really important project. I'm helping evaluate Civi versus some other CRMs for an arts organization that I am a member of (as well as webmaster and go-to web guy). The big player in the arts nonprofit space seems to be Patron Technology, which integrates this kind of seat management on top of Salesforce and makes the cost question easy for mid-size non-profit arts organizations by putting a surcharge on ticket sales rather than billing the arts organization directly.

Without this functionality for Civi, Patron has a strong lead. But with an easy way to add individual reserved seat sales to Civi you're facing the typical battle of control/customizability vs. the ease of having someone else take care of running the service/support.

For smaller art organizations, Patron's ticket service fee might be unwieldy. So this capability would be key to capturing the attention of arts organizations while they're small and growing with them and their members.