Not got any recommendations myself, but definitely don’t try and build this yourself, unless you have some ultra specific requirements.
Is it just one venue? Or multiple? - I guess you do something very simple by having a bunch of “available date” childnodes, to a venue. together with a price. And then use something like snipcart as you payment gateway/checkout engine. You can then use the snipcart API, to then remove (or marked booked) in the date node.