I would like to let my users reserve seats (or a whole table) for events, and pay for the reservation via PayPal.

Different performances/shows would be advertised, users could choose which tables or seats they would like to reserve. A theater OR bar, restaurant, etc. would have "fix" seats and tables, so they would not change (or just rarely); events can be repetitive/recurring (e.g. concerts) - in some cases, locations can remain the same too, so only the date changes (e.g. a concert played in Example Bar 3 times a month); but one event can be played in other locations too.

I tried on Drupal.org first, but I got no answer; any help would be appreciated.

If there's no way to "bind" it to Ubercart, I'd solve it in another way (PayPal IPN), but I have to do it ASAP.

P.S.: I've already tried MERCI, Simple Reservation, Hotel Booking System for Ubercart and Reservation modules (the latter seemed OK from the picture), but unfortunately I couldn't figure out how to do something similar to what I need - BUT THIS MEANS NOTHING, maybe I just overlooked some opportunities!!!

If you say I can solve it with one of these modules, please help! Even if you have a totally different suggestion! Thanks!


In the meantime I found this very interesting article: Ubercart Event Registration
Let me quote from it:

at the moment, the de facto Ubercart method for doing online event registration is with a module called UC Node Checkout. It's perfect for a one-and-done event registration site, but for a site that is hosting several events simultaneously and on an ongoing basis, it's awkward. This is due to the fact that it maps a content type to a product SKU - so for each event you'd need to create a new content type. Not really very good long-term, particularly when the site administrator is not overly familiar with Drupal or Ubercart.

So, an alternative solution was devised using the Webforms module. The webform stores the registrant's organization's information - and also asks the registrant how many tickets to the event they want, which is the use case the client specified. The webform, after processing the form, adds the event 'tickets' to the cart. This is done with the 'Webform advanced settings' field in the webform configuration, under 'Additional Processing'.

Good to know. This means the article I found earlier doesn't describe what I need.

Another quote from uc_event_registration's readme:

UC Node Checkout

This is the approach that has been used alot for Drupal conferences and demo'd at drupalcons. The huge problem here is twofold: First, registrations are nodes. That means we have to build views to create registration lists and that seems like unnecessary overhead when Webform is so much lighter weight. Second, and most importantly, you need a new content type for EVERY event. No thanks. On sites that are doing dozens of events per year, this would mean, eventually, a huge amount of content types. That's bad.

Here's another one related to Webforms: Drupal Webforms With Dynamic Select Boxes Tutorial This seems very promising, maybe this could be the way one could solve what Andy suggested.
I'm still interested in suggestions for practical solutions - maybe this way!

  • There's now an awful lot on this page counting comments and answers and I can't quite process it all! How are you doing? Do you still have questions?
    – Andy
    Dec 20, 2011 at 14:29
  • Finally I decided to write my own module, because it seems like unfortunately I will not be able to do this whole thing with the existing modules. Which complicates the situation is that I realized when reserving a seat, I don't have to pay for just one person (with a PayPal account), I'd rather have to let it be payed for the location's owner (or a person who should get the money for tickets). I don't know how I will do that (e.g. on an ebay, every user has their own PayPal-account). :\ I hope I can publish a finished version that I made - maybe this could be shared with the community.
    – Sk8erPeter
    Dec 20, 2011 at 16:39

6 Answers 6


I don't think you are going to find a solution that does 100% of what you need, I expect there will need to be custom development here.

Sounds like a custom content type (CCK) + ubercart + paypal (with ubercart) will be the most flexible solution. Perhaps read through the reservation module to see how it limits the available supply of tickets (i.e. sold out).

I would also suggest to remove the graphical part of the event registation, as this looks like it could be tricky, and instead focus on the core functionality of the app, i.e. the registration and payment workflow.

Every problem can be solved in drupal, but some of them are unique, and have their own solution.

If you need this solved ASAP, looks like you may need contractors, or some late nights ;) If you want to attract more quality answers, consider placing a bounty on this

  • @wiifm: +1, thanks for your quick answer!! Yes, I already know I have to do some custom development, but to be more specific, what kind of custom content type do you think of (within CCK)? I will have to create a relatively simple admin surface too, where I thought I could place some text areas where the user could set the total amount of tables in the place, and narrowing this one by one how many seats there are around the tables. I can think of some possible solutions in my head with my own codes, but I would have to "marry" them to Drupal, which is not a simple task I think...
    – Sk8erPeter
    Dec 13, 2011 at 0:09
  • (to place a bounty on it, I have to wait one more day. I know even a hundred points of mine wouldn't lead to a half-complete solution, but how nice this would be... :P But maybe I will try.) Oh, and what is not an easy job, I have to maintain a stock not to let users be able to reserve seats that already have been reserved...and let them pay via PayPal.
    – Sk8erPeter
    Dec 13, 2011 at 0:09
  • 1
    I've already placed a bounty on it... hope someone will have time to give me a really detailed help...
    – Sk8erPeter
    Dec 15, 2011 at 3:22

I agree with other answers in that you wouldn't get 100% of the way there without some custom development.

My first thought on solving this is don't worry too much about the interface, just get the data entities right. I think your products really only need two new fields at its most basic (venue, which could be a node reference and date (or another node reference to an event content type and reuse events)). Use stock to be the number of tickets available at a venue for an event and product kit could be a table which is just made up of the individual seats and would therefore manage stock and could also have discounts associated with it.

As far as interface goes you could create a calendar view of "seats" and "tables" (tables are just product kit).

EDIT: To distill the gist of the comment thread on this I'm going to summarise here.

What we seem to have got to is the following:

  • A particular event at a particular venue is a product class/content type. These content types all have one CCK field, the event date.
  • When you create a new instance of this product class you specify the date and add ONE attribute to it, that is the table number. The values of this attribute correspond to the number of tables to the event.

The workflow this describes is that a customer chooses to add an event to the cart, and as part of this process they have to choose a seat number and a number of seats that they want.

This allows a couple of things:

  • You can actually price tables differently,
  • You can manage stock at a per table level.

This is because an attribute, straight out of the box, has its own SKU and therefore its own stock levels and own pricing. If you think of what attributes are for this makes sense. If you have red and blue shirts you need to know how much of each you have, i.e. stock levels. If large shirts cost more than small shirts then you have to know how to price them.

Keep in mind this only describes the workflow and the backend. Webforms as described in other answers can still be used to control the interface, as could a custom built form. This is just to manage the data entities. You still have to create events manually but I think in this case the small number of content types is a good thing, and a process could be put together pretty quickly to automate some of this (look at Node Import for this, it can with some other contrib modules handle attributes as well if you wanted to customise the values)

Some notes:

An interface that works in this instance is a simple view of your new content types (split them by venue if you want as each content type is venue specific) with a link to the actual product. Then you can select a date and a number of tables. If you want to book seats at different tables then you will need to add another product to the cart.

The module UC Attribute Stock isn't really relevant here I think. As far as I can tell it just combines multiple attributes into one selection. That is given the example above of red and blue colours and small and large sizing, rather than have two dropdowns that the customer has to select from you have one drop down with four selections.

The webform solutions are not precluded from anything above. They are providing the interface, and may make sense if there is other, NON PRODUCT, data that you want to collect from your registration. Keep in mind though that you may be able to collect this from the checkout pane a bit more easily and in line with current shopping workfow. I think writing a form though, especially if you want it to have some smarter widgets on the front of it will be easier and lighter in the long run than shoe horning webform into what you want to do. For the basic workflow I don't think you even need it.

  • +1: thanks for your answer! Yes, I thought something similar would be great: locations could be node references; tickets as stock units would be good too. But what if an event (like a concert) is repetitive, but it's like a tour, played on many locations? Do I always have to edit the node references and date fields? And you mentioned tables are product kits - but what if a visitor just wants to reserve 2 seats from a table for 8 people? Unfortunately I have to take care about the admin interface too as the user can only handle the simplest interface (and has no idea about Drupal). Thanks!!
    – Sk8erPeter
    Dec 13, 2011 at 9:31
  • Hmm. OK, I was suggesting product kit to offer pricing variations for "bulk" seating purchases. But it actually sounds like your actual product is a table, where the stock level is the number of seats at the table. You could mitigate your backend work by making a product class that is a table for an event at a venue, the only variable then is the date.
    – Malks
    Dec 14, 2011 at 0:47
  • yes, the number of tables per locations is "static" as it doesn't change all the time, it has to be "bound" to a location. So you suggest "making a product class that is a table for an event at a venue" - but what if there are 100 tables at a venue? Should I create 100 nodes from the "Table" content type in this case? :\ Will I bind these with node references to a venue? And if there are e.g. 30 locations with 100 tables each, does it mean I should create 30*100 = 3000 nodes ("tables"), and attach these tables to my "Event" node type via node references? I still don't know the good solution.:(
    – Sk8erPeter
    Dec 14, 2011 at 2:01
  • I reckon you could make the product class have a static link to the venue, that is you have a product class that is a table at a venue. It does mean lots of nodes. The other option may be have something that represents a table at a venue and an attribute that allows them to select a table, i.e. a drop down with the table number.
    – Malks
    Dec 14, 2011 at 2:58
  • OK, but what happens if an event is repetitive? In this case I had to repeat creating the "Table" content and link to a venue all the time. E.g. there would be a concert 3 times a month in the same location, but the number of tables and seats would always remain the same; and I would like to advertise them a month earlier than the events' date. How would I do it then? Oh, and what about the dates of the events? Should I always attach a new "date" reference field to an event? And then attach the event to a venue, etc.? Sorry for asking so much, but I'm still lost in the task.Thx 4 your answers!
    – Sk8erPeter
    Dec 14, 2011 at 10:28

A slightly different approach to the others. You could use Ubercart Event Registration for the individual registration forms, and the custom coding could just be a custom webform widget (see webform_hooks.php and the files in the components directory for more details). This would be responsible for showing only available places, and reserving the selected place on submission. If you saw a reason, you could integrate the component with one of the reservation modules you mention above. I don't think this is much less work than the alternatives, but it's a slightly different model in that it uses webform. (And I agree entirely with Malks that you want to first decide about how it's going to be handled internally.)

More details: I think there's a number of ways you can do it, depending on for example whether you want to integrate with an existing module, whether you want to use nodes (can be great for quickly making reports with Views), etc. Here's a very brief description of how you might do it with an entirely bespoke implementation.

Assumptions: a single reservation consists of a date, and any positive number of seat IDs.

  1. Create a module that provides a webform component for the reservation.
  2. The module should also create a DB table for storing reservation details.
  3. To begin with forget about a fancy widget, just make it simple (eg. have a textfield for the date, and another for the seat IDs - they can be entered as a comma separated list at first).
  4. On validation, the webform component checks with the DB table that the values are valid (ie not already reserved).
  5. On submission, the webform component again checks if the reservation is available, and if so makes the reservation. You want to be careful here that two users submitting a request at the same time can't make the same reservation (eg. use a lock in your submit handler).
  6. Go back to your widget and make it fancy, eg. have a nice JS date picker that only shows dates with remaining reservations, maybe with some semi-graphical tables that show available seats and let you select them neatly. But underneath it's all basically doing the same thing.

I've not tried something quite like this, so just an idea!

This is still a very simple system, and as it stands it's not very easy to get the data out. You might want to make some bespoke admin screens or you could views enable your db table.

You don't want to use this approach unless you want the idea of one node per form, with submissions being stored in the webform submitted data table. You really want to be sure that this fits your needs before taking this path imho.

  • +1: it seems to be a very good approach too, thank you! But if you don't mind, let me ask to clarify I understood you correctly: the form for showing available places and letting them be selected would be a "separate" webform, which on submission would update the available places and decrement them; and this "event registration" webform is one that can be bound to Ubercart. Is it correct? And how could this webform be built up? And yes, all of you are right that I have to find out first HOW I would do this whole thing... that's why it's very good you all help me think about it. Thx in advance!
    – Sk8erPeter
    Dec 13, 2011 at 9:58
  • hmm, I still haven't figure out how to solve it with webforms - e.g. how to maintain a stock of seats. (So one table would have a stock of the available seats.) Could you push me a little bit further with your approach?
    – Sk8erPeter
    Dec 14, 2011 at 11:41
  • @Sk8erPeter Updated anwer
    – Andy
    Dec 14, 2011 at 12:57
  • thanks for the updated answer! I also have to "categorize" seats to tables. So the best would be to have tables e.g. like this: T1 - 4 seats, T2 - 6 seats, ..., Tn - 3 seats, etc. I understand the theory of what you say, I can imagine something similar, but I still don't know the adequate Drupal-way solutions in practice. E.g. you didn't mention the problem of recurring events - what should I do with date fields? Should I pass a new date field to a content type every time a new event is coming? What about the same event - new location problem? Date+location would be tied together. Thx again!
    – Sk8erPeter
    Dec 15, 2011 at 2:55
  • I updated my question, please see the new infos under the line! I think "you're tha man" :D, because you suggested webforms from the beginning - I think this seems to be the best approach so far! Do you have experience with similar solutions, anything related to webforms+products?
    – Sk8erPeter
    Dec 16, 2011 at 12:39

I think you should make table as a product.

We've this relationship: event1 -> date1 -> city1 -> restraunt1 -> table1

So 1 refers to 1-many relationship.

Have Venue table with information about each venue and tables and other attributes

Have City table with city + venue details

Have OrderBooking table with this: event1,date1,city1,venu-id,product-id

Customer will browse from event to restraunt and will see available seats(products). Write a module to display the (availability) details along with links to create a product. As soon as one clicks a link in the venue, arrange for a pop up which will ask for table specific details and direct to product form and auto populate the product with those details in a custom cck field. Now when tries to buy the product then you should write a module to check availability and after payment have this product related to the OrderBooking table.

You'll need to use UC Node Checkout module as described here for collecting registration data.

I've taken a simplistic view.

  • +1: thanks. I also thought much about the theory of the whole process, I've already drawn a diagram of table relationships, but I'm interested in practical todos. By the way your link is the same as the one I also posted on drupal.org: drupal.org/node/1365664 , but collecting user data is maybe the easiest part of the whole thing. I'm curious about the easiest practical solution of the problem - maybe the modules I linked are suitable for the task, I just didn't find out how to do it. And I still don't know to make an event recurrent (passing newer date field, etc.??). Thanks!
    – Sk8erPeter
    Dec 16, 2011 at 10:50
  • I updated my answer with a link to an article which states UC Node Checkout is a little bit overkill for tasks like this. What's your opinion about it?
    – Sk8erPeter
    Dec 16, 2011 at 12:54
  • 1
    It isn't. It is easy to configure and is very useful. I've done for my site, try adding this product in the cart: utilitiesindia.com/send-letter-online-india . This will allow you to associate any type of Node(in your case, receive any custom registration data, before selecting a table) with a checked out product. Great thing is that it works seamlessly and integrates well with product checkout workflow. Also I'm not aware of any improvements in this module in last 10 months. So checkout.
    – AgA
    Dec 16, 2011 at 13:11
  • Although I'm not an expert in Ubercart, I think that custom solution will be simple, flexible and easy to maintain. Ubercart does not provide the functionality you're looking for. Using "techniques" to use Ubercart functions in different( like using Tables as attributes) way will mess up the logic and workflow.
    – AgA
    Dec 16, 2011 at 13:26
  • +1 for your comment, thanks for the example! It gave me an idea: maybe this way I could create an Event product type with a "Location" node reference (description and address of the venue) and a date field; change the "Add to cart" submit button's text to "Buy tickets"; and after the user submits the form, I could attach another node with UC Node Checkout, where I would display a custom reservation Webform node. With this form, the user could select which table and how many seats he/she would like to reserve. With this number I would have to decrement the available seats for the given table.
    – Sk8erPeter
    Dec 16, 2011 at 15:58

I did something similar for a tour agency. I used the Hotel Booking module for Ubercart, each event is a "room" which you can set a limit for occupancy and charge differently depending on the day. On the admin side, you have calendars you can select what days are available on a recurring basis. I believe you can have different kinds of [events] as well.

The only issue was it was new in Drupal 7 and had a few bugs, but it may have improved by now.


You can check the following module: Booking Time Slots.

As the name says, it provides Time Slots Booking functionality. It integrates with Views and Calendar.

Check the sample screenshot in Drupal 7.x:

Drupal 7.x - Booking Time Slots

For more, check Comparison of Booking System modules.

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.