Sell event tickets and merch on one site without Eventbrite fees

Type
Concept
Applies to
Medusa v2.x
Updated

Short answer

Medusa lets you sell event tickets and merch from your own store with no per-ticket platform fee, so you pay only your payment provider. Its official ticket booking tutorial covers venues, seat maps, show dates, QR tickets and check-in. Seat limits use native inventory and discount codes use the native Promotion Module.

What selling tickets costs on Eventbrite, Ticket Tailor, and your own Medusa store

Ticketing platforms charge a fee on every paid ticket, on top of card processing. A store you run on Medusa charges no per-ticket platform fee, so you pay only your payment provider and your hosting. The figures below are from each vendor's own pricing page, as of October 2026.

OptionPlatform fee per paid ticketPayment processingNotes
Eventbrite (US)3.7% + $1.79 service fee2.9% per orderBuyers pay the fees by default; organizers can absorb them
Ticket Tailor£0.60 pay as you go, from £0.22 with prepaid credits (ex. VAT)Separate, charged by your Stripe, PayPal, or Square accountThe pricing page lists fees in GBP
Your own store on MedusaNoneYour provider's rate, for example Stripe US cards at 2.9% + 30¢Self-host for free (MIT-licensed core) or use Medusa Cloud from $29/month with a 0% GMV fee

For a $40 ticket, Eventbrite's service fee is $3.27 (3.7% of $40 plus $1.79) before processing. On Medusa with Stripe, a single $40 order costs $1.46 in Stripe fees and nothing else per ticket. The trade-off is that you build and run the store, while Eventbrite also brings event discovery and a ready-made checkout.

How ticketing features map to Medusa

Medusa has no built-in ticketing product type. The official ticket booking tutorial builds a Ticket Booking module on top of Medusa's products, inventory, carts, and orders, with full code on GitHub.

Ticketing termWhat it meansHow Medusa does itStatus
Seat limits, capacityNo more tickets than seats per showOne variant per show date and row type, with inventory set to the row's seat countNative
Seat map, reserved seatingBuyers pick a specific seatVenue and row models with seat counts, seat numbers stored on each ticket purchase, and a seat chart in the Next.js Starter StorefrontOfficial guide
Discount codesPromo codes, early-bird pricingPromotion Module: percentage or fixed discounts, rules, and campaigns with budgetsNative
QR tickets and check-inScannable ticket at the doorQR codes in the order confirmation email and a verify route that marks a ticket as scannedOfficial guide
Double booking preventionA seat sells once per showValidation when a seat is added to the cart and again when the cart completesOfficial guide
Tickets and merch in one cartOne checkout for bothSupported by Medusa's cart; the tutorial's checkout needs changesCustom

What changes when you add merch to the ticket checkout

The ticket booking tutorial builds a ticket-only checkout. Its storefront removes the shipping address and shipping method steps, and its custom cart completion step rejects any cart item with a quantity other than 1, which also blocks merch bought in multiples.

Medusa itself supports mixed carts. Each item's shipping requirement comes from its product's shipping profile or its inventory item's Copy to clipboardrequires_shipping flag, as described in Configure Selling Products. To sell merch alongside tickets, you:

  1. Limit the quantity check in Copy to clipboardvalidateTicketOrderStep to items that carry seat metadata.
  2. Show the shipping steps in the storefront only when the cart contains an item that requires shipping.
  3. Keep tickets on Copy to clipboardrequires_shipping: false so they never need a shipping method.

The docs don't ship a mixed ticket and merch example yet, so treat this as custom work on top of the tutorial.

How Medusa stops a seat from selling twice

Medusa checks available inventory when an item is added to a cart and creates a reservation when the order is placed, according to the Inventory Module flows. It does not hold stock while an item sits in a cart.

The tutorial adds seat-level checks with the Copy to clipboardvalidate hook of Copy to clipboardaddToCartWorkflow and again in a custom cart completion workflow. If a seat sells while it sits in another buyer's cart, that buyer's order fails validation and is canceled. The completion lock is keyed on the cart, so for high-demand on-sales add a lock keyed on the seat and show date. A timed seat hold, such as "this seat is yours for 10 minutes", is custom work.

When Medusa is not the right choice for ticketing

  • You run a few events a year, have no developer, and want listings on a discovery marketplace. Eventbrite or Ticket Tailor gets you selling today.
  • You need a ready-made box office, scanning app, and payouts to promoters without writing code.
  • Your fee savings are smaller than the cost of building and hosting a store. Medusa fits when you sell enough tickets for the per-ticket fee to matter, or when tickets are one part of a larger store.

Common questions

Does Medusa charge a fee per ticket?

No. Medusa's core is open source under the MIT license and Medusa Cloud charges a 0% GMV fee, so a ticket sold through a Medusa store pays only the payment provider's processing fee.

Can Medusa sell tickets and merch in the same cart?

Yes, Medusa's cart supports items that need shipping next to items that don't. The official ticket booking tutorial builds a ticket-only checkout, so you adapt its storefront and its quantity check to add merch.

Does Medusa support reserved seating?

Yes, through the official ticket booking tutorial. It adds venues with rows and seats, a seat selector in the Next.js Starter Storefront, and validation that a seat sells once per show date.

How do discount codes work for tickets in Medusa?

Ticket products are regular Medusa products, so the native Promotion Module applies to them. You create percentage or fixed discounts with rules, and group them in campaigns with start and end dates and budgets.

Can I scan tickets at the door with Medusa?

The ticket booking tutorial emails a QR code per ticket and adds an API route that verifies a scanned code and marks the ticket as scanned. You connect your own scanner app to that route.