How to use BuzzHive
Everything you need to set up your account, sell tickets, run the door, and get paid. The whole flow takes about 10 minutes for your first event. If you get stuck anywhere, jump to Contact support at the bottom.
1. Your account
Your account is what lets you create events, see orders, and get paid. If you signed up through a link from the BuzzHive team, your account is already created. Otherwise, head to buzzhive.info/promoter/signup and fill in your name, email, and password.
The person who creates the account is automatically the owner — the highest role. Owners can do everything: manage events, manage the team, manage billing, view payouts. You can add additional team members later (see Add team members).
2. Connect Stripe (so you can get paid)
We use Stripe Connect for payments and payouts. You'll connect your Stripe account (or create one in 2 minutes) the first time you log in. Until this is complete you can't sell tickets — Stripe needs to know where to send your money.
| 1 | Log in. If onboarding isn't done, you'll be sent to /promoter/onboarding. |
| 2 | Click Start Stripe onboarding. You'll be taken to Stripe. |
| 3 | Enter your business details, ID, and a bank account or debit card for payouts. Stripe walks you through it. |
| 4 | When Stripe says "Done," you'll be redirected back here. The dashboard will show "You're in" and you can start selling. |
3. Create an event
From your dashboard, click + New event (top right, or in the Getting Started card). Fill in:
Basics (required)
- Title — what attendees see at the top of the sales page
- Date — show date
- Doors / start time — what time guests arrive (defaults to 8:00 PM)
- Venue — name of the place
- Address, city, state — for the sales page and ticket email
Details (optional but recommended)
- Lineup — performers, format:
Artist 1 · Artist 2 · Artist 3 - Description — short blurb. Markdown isn't supported, but line breaks are.
- Age restriction — e.g.
21+,All Ages,18+
Flyer image (recommended)
Upload a JPEG, PNG, or WebP. Up to 5 MB. Portrait (4:5) or square (1:1) looks best. Without a flyer your event page is plain text — flyers double click-through to checkout.
Sales window
- Sales start — when tickets become buyable. Leave blank to start immediately.
- Sales end — when sales close. Leave blank to keep selling up to door time.
- Max capacity — total tickets across all tiers (a hard cap). Leave blank if each tier caps itself.
Visibility
- Status: Draft — only you can see it (use this while you set up tiers)
- Status: Published — live and selling
- Status: Sold out — hides the buy button but the page stays up
- Status: Cancelled — page shows the event was cancelled
- Enable ticket sales — emergency off-switch; uncheck to pause sales without changing status
- Show on marketplace homepage — controls whether your event appears at buzzhive.info alongside other promoters
Click Create event and you'll be sent straight to ticket types.
4. Add ticket tiers
Every event needs at least one ticket tier (GA, VIP, Early Bird, etc.). You can have as many tiers as you want — they show up on the public sales page as a stack of buy buttons.
| 1 | From an event's edit page, click Manage ticket types →. |
| 2 | Fill the row at the bottom: |
- Name — what buyers see (e.g.
General Admission,VIP) - Price ($) — in dollars, e.g.
25.00 - Quantity — how many to sell. Enter
0for unlimited. - Min/order — fewest a buyer can take in one order (usually
1) - Max/order — most a buyer can take in one order (usually
10)
Click + Add. Repeat for each tier.
Editing & removing tiers
- Click Deactivate to hide a tier from the sales page without deleting it. The numbers stay so you can re-activate later.
- Click Delete to remove a tier entirely. Only allowed if no tickets have been sold — otherwise deactivate instead.
Discount codes
Each event has its own set of discount codes. From the event edit screen, click Discount codes (top-right or in the sidebar) to open the manager. You can create as many codes as you like.
For each code you set:
- Code — case-insensitive when buyers enter it. 2–48 characters,
letters / numbers / dash / underscore. Examples:
EARLYBIRD,VIP_25,RADIO5. - Type — percentage off (e.g. 20% off) or fixed dollar amount off (e.g. $5 off).
- Value — the number. For percent, 1–100. For fixed, dollars (the system stores it as cents internally).
- Max uses — optional cap on total redemptions across all buyers. Leave blank for unlimited.
- Expires at — optional date/time after which the code stops working. Leave blank for no expiration.
- Applies to — optionally restrict to specific ticket tiers. Leave all unchecked to apply to every tier in the event.
- Internal notes — for your own reference (e.g. "Sent to mailing list 6/1"). Buyers never see this.
How it works for buyers:
- A "Have a discount code?" field appears on the event's public sales page, right above the buy button.
- Buyer enters the code along with their name and email and clicks the buy button.
- If the code is valid for the cart, the discount is applied and Stripe charges the discounted total. If the code is invalid (expired, used up, wrong ticket type, etc.) the buyer is bounced back to the event page with a specific error message.
How the math works:
- Percent codes apply to each applicable ticket's face value individually. E.g. 20% off applies to each GA ticket separately.
- Fixed-amount codes apply once per order, capped at the applicable subtotal (you'll never go negative).
- If a code is scoped to specific tiers and the buyer's cart doesn't contain any of those tiers, the code is rejected with a clear error.
- Platform fee is calculated on the post-discount subtotal. A fully-comped order (100% off) waives the platform fee entirely.
- Deactivate hides a code from new buyers but keeps it in your records. Existing orders that already used the code are unaffected.
- Delete is only allowed for codes that have zero uses. Once a code has been redeemed, deactivate it instead so the order history stays intact.
- Each order's receipt (and the buyer-side order confirmation page) shows the code used and the dollars off, so you have a clean audit trail.
5. Publish & share
Once you have at least one active tier, head back to Edit event and set the status to Published. Save.
You now have a public sales page at:
https://buzzhive.info/e/your-event-slug
Click View public page on the edit screen to see exactly what buyers see. Share that URL anywhere — Instagram bio, Facebook event, text blast, your own website.
Summer Block Party · Aug 12
becomes summer-block-party-aug-12). To change it, edit the event, change the
title, and save — or contact support to set a custom slug.
6. Customize the look of your event page
Your event page can take on one of nine completely different visual identities — we call them vibes. Pick a vibe to set the whole feel of the page (colors, typography, layout, hover effects). Then fine-tune with the per-event fields below (accent color, flyer style, button text, etc.). Every customization field is optional — leave it blank to use the vibe's defaults.
Vibes (the big choice)
On the event edit page, the very first card is the Vibe picker — a grid of nine visual templates, each tuned for a specific scene. Click one card and save. That's it. The page is instantly transformed. You can change the vibe any time without losing any content; only the look changes.
- Standard — clean, dark, neutral. The BuzzHive default. Works for any event.
- The Substation — industrial basement club. Brutalist sans, single neon accent, lineup-heavy layout. Built for venue-anchored DJ nights and warehouse rooms.
- Sub Bass — deep bass / dubstep. Purple + cyan glitch type, heavy condensed display, cyberpunk-adjacent. Built for dubstep / deep bass / trap nights.
- Berlin — Berghain-style techno. Stark pure-black + white, lowercase Helvetica, hairline dividers, zero decoration. The most refined aesthetic on the platform.
- Junglist — drum & bass / 90s rave revival. Neon green + cyan, hard offset shadows like a flyer stapled to a wall, lightning-bolt accents. Built for warehouse parties.
- House — classic Chicago / Detroit house. Warm 70s-80s palette (burgundy + amber), vinyl-record visual in the hero. Built for boogie / disco-house nights.
- Headliner — multi-day festival. Photo-forward, premium, gold-foil gradient title, starfield background, lineup formatted as a poster hierarchy (first act gets headliner treatment). Built for festivals and premium-ticketed shows.
- Forest — boutique outdoor festival. Moss green + warm gold + sage, sacred-geometry mandala behind the hero, organic rounded corners. Built for Cascadia / APOG / forest-flavored events.
- Playa — Burning Man / regional burn aesthetic. Desert dust palette, sand-grain texture, stenciled type with deep shadow, asymmetric hand-drawn borders. Built for regional burns, theme-camp fundraisers, decompression parties.
Accent color
Tints the buy button, the "MAY 30 · 10PM" eyebrow text above your title, and links on the
event page. Pick a hex color with the swatch picker, or type it in the box (e.g. #ec6b1c
for the BuzzHive orange, #10b981 for green, #ec4899 for pink). Leave
blank to use the default orange.
Flyer display style
Two modes you can switch between any time:
- Clean — just the image (default): shows your flyer at its natural aspect ratio with a subtle rounded border and drop shadow. Works great for portrait or square flyers.
- Framed — 4:5 box with blurred backdrop: forces your flyer into a 4:5 portrait frame. If the flyer doesn't fill the box, a blurred copy of itself fills the leftover space. Useful for landscape flyers when you want to preserve the column proportions on the page.
Buy button text
Override the default "Continue to checkout" label with anything you want (up to 80 characters). Good for vibes: "Cop tickets", "RSVP", "Reserve your spot", "Lock it in". Keep it short or it'll wrap on mobile.
Promoter blurb
Optional short message (up to 1000 characters) that appears above the ticket form, styled with a left border in your accent color. Use it to welcome buyers, plug your next show, set vibe expectations, mention the dress code, anything. Line breaks are preserved.
Custom CSS (power user)
For promoters who know CSS. Lets you write your own styles to override the defaults — change fonts, layouts, colors, anything. By default, this field is hidden on your account. To unlock it, email our contact form with your promoter name and we'll enable it.
- Always wrap your selectors under
.event-customto scope them to just this event page (e.g..event-custom h1 { ... }) so they don't accidentally break the rest of the platform. - Test your CSS in an incognito window before publishing — bad CSS won't crash the page but might make it look broken.
- Available CSS variables you can use:
--event-accent(your chosen accent color),--evt-bg,--evt-surface,--evt-text,--evt-text-muted,--evt-text-soft.
Where to see your changes
After saving the edit form, click View public page at the top of the edit screen (it only appears for published events). What you see there is exactly what buyers see. Test on mobile too — most ticket buyers are on phones.
7. Add team members
You can give people access to your account at three different permission levels. Only the owner can manage the team.
Roles
- Owner — full access. Can manage events, team, billing, see payouts. Every account has at least one owner.
- Admin — can manage events, view orders, issue refunds. Cannot manage the team or billing.
- Scanner — can only sign in to the door scanner. Cannot see orders, sales, or anything else. Perfect for door staff you don't want poking around your numbers.
Invite someone
| 1 | Go to Team in the sidebar. |
| 2 | In the Invite a team member form, enter their name, email, and pick a role. |
| 3 | Click Send invite. The page will show a one-time password. |
| 4 | Copy that password right away — it's only shown once. Send it to your team member along with the login URL. |
| 5 | They log in at /promoter/login with their email and that temp password, then change it from Settings. |
Changing roles, deactivating
On the Team page, each row has options to change role or deactivate the user. Notes:
- You can't demote yourself if you're the only owner. Promote someone else first.
- You can't deactivate the only active owner — the account would be locked out.
- Deactivated users keep their data; their access just turns off. Re-activate any time.
8. Scan tickets at the door
The scanner runs in any modern phone browser — Safari on iPhone, Chrome on Android. It uses the camera to read QR codes off attendees' phones (or printed tickets). No app to install.
| 1 | On show night, have door staff open buzzhive.info/promoter/scan on their phone. |
| 2 | They sign in with their account (owner, admin, or scanner role all work). |
| 3 | Pick the event from the list. |
| 4 | Tap Allow when the browser asks for camera permission. |
| 5 | Point the camera at the QR code. The screen flashes green for Valid, orange for Already scanned, red for Invalid. The scanner auto-resumes after 1.5 seconds so you can keep moving guests through. |
Manual entry
If a QR won't scan (cracked screen, glare, etc.), tap the Manual entry field below the camera and type the ticket code (it's printed under the QR on every ticket).
Walk-up sales: print a QR for the door
For people who show up without a ticket, you can print a QR code that links straight to your event's sales page. Tape it at the entrance — walk-ups scan it with their phone camera, land on the event page, pick a "Day of event" ticket type, pay through Stripe, and you scan them in like any other buyer.
| 1 | Open your event in the promoter dashboard and click Print door QR in the toolbar (next to View public page). |
| 2 | A pop-up shows a big QR code with the event title and URL. Click Print — your browser's print dialog opens with the QR centered on a clean page. |
| 3 | Print, cut it out, and tape it at the entrance. Walk-ups scan, buy, walk in. |
Sales velocity & sellout projection
Every event's manage page shows a live Sales velocity card up top with momentum stats and a cumulative-sales chart. No setup required — it appears automatically once you have at least one paid order.
What the card shows
- Tickets sold — running count across all your active tiers.
- Capacity — sum of your tier quantities (or the event-level Max capacity if you set one). Shows
∞if any tier is unlimited. - Tickets / day (7d avg) — your average daily sales over the last 7 days that had orders. The momentum number.
- Projected sellout date — when, at your current 7-day pace, you'll hit capacity. Color-coded:
- Green — you're on pace to sell out before doors
- Amber — at this pace you'll have empty seats day-of
- Status badge in the top corner: ON PACE, SLOW, SOLD OUT, UNCAPPED, or EARLY.
The chart
A cumulative line chart showing tickets sold over time, with a green dashed capacity reference line and an orange dashed projection line extending from today to your projected sellout date. The further your live line tracks toward capacity, the closer you are to a sellout. If the projection line never hits capacity before the event date, that's your cue to spend on promotion (Run Up is a good fit there).
Artist referrals & leaderboard
When you book a five-artist bill, you're really booking five promoters. Each artist has their own audience, but they can't promote your show effectively if you can't show them how much they're moving the needle. Artist referrals give each performer (or street-team member) a personal share link. Sales through their link show up on a leaderboard you and they can both watch in real time.
Setting up referrers
- From an event's manage page, click Referrers in the top action bar.
- Add each artist on the bill — name + optional reward notes ("5 tickets = $25 venmo, 10 = comp next show").
- BuzzHive auto-generates a url-safe slug and gives you a copy-able share link like
buzzhive.info/e/your-event?r=maya. - Send each artist their personal link via DM. Tell them to drop it in their stories, link in bio, and any group chats.
What the artist sees
Every referrer gets a public stats page at buzzhive.info/r/{event-slug}/{artist-slug}.
It shows them — and only them — their tickets-sold count, orders, leaderboard rank, and the
reward notes you set up. There's a big Copy link button so they can re-share
without bothering you. No customer PII is exposed; just their own numbers.
The leaderboard
Back on your Referrers page you see a ranked list of every referrer with tickets attributed, orders, and revenue. Plus a summary row at the top: total referrers, attributed tickets, attributed orders, attributed revenue. Use this to:
- Reward your top movers. Pay out comps, Venmo bonuses, or guest list spots based on real performance numbers.
- Plan your next bill. If Maya brought 30 tickets last show, book her again. If someone brought zero despite three weeks of "I'll share it!", that's data.
- Compare across shows. Track which artists consistently mobilize their audience and which don't.
How attribution works
When a buyer clicks an artist's link, the referrer slug is stored in their browser session. When they complete checkout — within minutes or days, on the same device — the order is tagged to that referrer. If a buyer comes in via multiple links, the most recent one wins. If they come in via no link at all, the order is unattributed (NULL) and just doesn't appear on the leaderboard.
Email your buyers
BuzzHive ships three email tools for promoters — all free, all included:
- Per-event Email buyers — fast path for "send to everyone who paid for THIS show." Linked from each event's edit page.
- Outreach (sidebar link) — full audience control: pick paid buyers, abandoned-cart contacts, your full contact list, an uploaded email list, or any addresses you type by hand. Sends can scope across all your events.
- Email lists (sidebar link) — bring your own audience. Upload CSV exports from Eventbrite, mailing list signups, door-cash leads, anyone whose email you already legally have, and turn them into a campaign that points at your BuzzHive event pages.
Per-event "Email buyers"
From any event's edit page, click Email buyers in the top action bar. You'll land on a composer where you write a subject + message and send to every confirmed (paid) buyer for that single event. Best for day-of-show reminders, lineup changes, "see you tonight" hype, post-event thank-yous. Max 3 sends per event per 24h.
Outreach (the full toolkit)
Open Outreach from the sidebar. Pick one of five audiences:
- Paid buyers — everyone who completed checkout, across all your shows or scoped to one. The headline broadcast tool: new show announcements, year-end recaps, free comp invites for VIPs.
- Didn't follow through — buyers who started checkout but never paid (their order is in pending or failed). Use this for win-backs ("hey, ticket still available, here's a 15% code"). People who later DID pay are automatically excluded so they don't get a "you forgot to pay" message after paying.
- Pick from list — searchable list of every contact who's ever placed an order with you (paid + abandoned). Click-to-select individuals. Great for "I want to invite these 5 friends-of-friends to a guest list" or curated VIP outreach.
- Email list — send to one of your uploaded email lists (Eventbrite exports, door-cash leads, mailing list signups). This is how you market your BuzzHive show to your existing audience that has never bought through BuzzHive before.
- Type emails — paste or type any addresses (comma, semicolon, space, or newline separated). Useful for offline contacts (flyer leads, DM follow-ups) where the buyer isn't in your system yet.
Email lists (bring your own audience)
You've already got an audience — people who came to past shows but bought through Eventbrite, friends from the door, mailing-list signups from your Linktree. BuzzHive lets you upload those contacts as a named email list, then send campaigns to that list pointing at your BuzzHive event pages. This is the single most important free marketing tool in the platform.
Creating a list
- Open Email lists in the sidebar.
- Click New list, give it a name (e.g. "House Heads", "2024 Past Buyers", "Newsletter").
- Open the list. You can add contacts two ways:
- Upload CSV — drop in an export from Eventbrite, Mailchimp, Google Sheets, anywhere. BuzzHive auto-detects the email and name columns (looks for headers like
email,Email Address,first name, etc.). - Paste — paste a block of
email,namelines, or just plain emails one per line, or even Outlook-style"Jane Smith" <jane@example.com>.
- Upload CSV — drop in an export from Eventbrite, Mailchimp, Google Sheets, anywhere. BuzzHive auto-detects the email and name columns (looks for headers like
- Tick the I have permission to email these contacts box. This is a CAN-SPAM requirement and BuzzHive logs the attestation against your account.
- Submit. Invalid addresses are skipped with a warning; duplicates are silently deduped.
Sending to a list
From a list's detail page, click Send a campaign → and you'll land in Outreach with that list preselected. Write your subject + message, optionally scope it to one event (Outreach prepends the event context block automatically), and send. Every send is logged in Past campaigns.
Unsubscribes (this is important)
Every email you send via BuzzHive — including list campaigns — has a one-click unsubscribe link. When someone unsubscribes:
- They're marked unsubscribed in every list you own that contains their email.
- They're added to BuzzHive's global suppression list, so they're also filtered out of Paid buyers / Didn't follow through / Pick from list audiences across all your future sends.
- You can still see them in the list (status shows as unsubscribed), you just can't re-mail them. Don't try to work around this — it's federal law (CAN-SPAM in the US, CASL in Canada, similar elsewhere).
Permission — what counts
Examples of audiences you can upload:
- People who bought a ticket to your past shows on Eventbrite / Dice / your old door system
- People who signed up to your mailing list at a show or on your Linktree
- People who said "yes please" when you asked if you could put them on your list
Examples of audiences you cannot upload:
- Scraped emails from other promoters' Facebook events
- Lists you bought from a vendor
- Random Instagram followers who never gave you their email
BuzzHive is the messenger here — if your audience reports your sends as spam, your sender reputation tanks and so does every other promoter's. Be honest about who opted in.
BuzzHive can promote your show too
When you buy a Run Up campaign for an event, the BuzzHive admin team can send a curator-framed recommendation ("Upcoming shows in [your state] we think you'd like") from BuzzHive to every past buyer on the platform whose attended-events state matches your show's state. That gets your event in front of people who:
- Have bought tickets through BuzzHive before in your state (so they're already on the platform + already going to shows there)
- Aren't already buying a ticket to your event (no one gets a "go to this show!" email about a show they're already going to)
- Aren't globally unsubscribed
You don't need to do anything — when you launch a Run Up campaign for an OR event, the admin sees a Promote to matching audience button on your campaign and decides which sends fire. The recommendation is from BuzzHive (not you), so your sender reputation isn't on the line, and recipients have a clear unsubscribe path through the global suppression list they always control.
Click + conversion tracking
Every Use my event page as the email send is automatically tracked end-to-end. The "Get Tickets" button in each email is wrapped with a one-use link that:
- Records a click the moment the recipient taps it (and a second time if they come back — we count repeat clicks separately).
- Drops a 7-day attribution cookie in the recipient's browser. If they complete checkout within that window — on any device tied to the same session — the resulting order is tagged with the campaign that drove the click.
- Surfaces all of it on the Campaigns monitor as a clicks → orders → revenue funnel below each card. Card stays clean (delivery stats only) until there's something real to show.
Bottom line: you can finally see which sends actually moved tickets, not just which sends were "delivered." Plain custom-message sends aren't tracked yet (they don't have a dedicated CTA link to wrap) — use the event-page mode whenever you want to measure the marketing.
"Last sent" on your lists
The Email lists index now shows a Last sent tag on every list — "3d ago" / "12h ago" / "Never sent" — so you can tell at a glance which lists are stale and worth re-engaging. Updates automatically every time you send a campaign that targets the list.
Two ways to compose any email
Both Outreach and the per-event Email buyers tool let you pick HOW the email looks. The toggle at the top of the composer offers two modes:
- Write a custom message — the classic flow. Type your subject and body. Best when you need to say something specific (lineup change, doors update, post-event thank-you).
- Use my event page as the email — BuzzHive renders the chosen event AS the email: cover image, title, date, venue, lineup, a "Get Tickets" button, and a "From $X" price tag. You don't write a subject or body. You CAN add an optional one-line personal note (up to 500 chars) that appears in an orange call-out above the event card. Best when you want to send your audience an inbox-ready version of your event page with two clicks instead of writing copy.
Use the event-page mode for any "go look at this show" send. Use the custom-message mode for anything that's about the show but not the show itself (logistics, reminders, follow-ups).
How sends work (both tools)
- Subject up to 200 chars, body up to 10,000 chars, plain text with preserved line breaks.
- BuzzHive prepends an event context block when a send is scoped to an event (auto-skipped when it's a cross-event broadcast).
- The send goes via BuzzHive's mail infrastructure — branded, authenticated, and unlikely to land in spam the way a bulk send from your personal Gmail might.
- Every email includes a one-click unsubscribe link. Unsubscribed contacts are silently filtered out of all future sends across both tools.
- Each send is logged in the Past campaigns sidebar so you can see exactly what you've sent and when.
- Don't like an old entry cluttering the monitor? Hover any campaign card and click Delete — it only removes the history row, emails already delivered stay delivered. There's also a small × on the per-event "Past sends" sidebar for the same purpose.
Limits + etiquette
- Per-event tool: max 3 sends per event per 24 hours.
- Outreach tool: max 5 outreach sends per 24 hours total (separate counter from the per-event limit).
- Mass emails should feel valuable to the recipient. "Doors at 9pm, parking out front" = valuable. "We sell t-shirts btw" = unsubscribes.
- The "From" name is BuzzHive, but the message body identifies your promoter brand, and reply-to is set to your contact email so buyers can respond directly to you.
- Invalid addresses you type into the manual mode are skipped with a warning — your send still goes through to the valid ones.
9. View orders & refunds
The Orders page in the sidebar shows every order across every event you've ever run — paid, refunded, pending, the lot. Each row gives you:
- Order # and order token (e.g.
TIX-9A79-QK3R) — click either to open the order detail page - Buyer's name, email, and phone
- The event the order is for
- How many tickets were sold in that order
- Total paid
- Status (Paid, Pending, Refunded, Failed, etc.)
- When it was paid, and when the ticket email was last sent
- Per-row action button: Resend (paid orders), Remove (pending or failed), or nothing (refunded)
Use the search box up top to find a buyer by name, email, or order token. Filter dropdowns let you narrow to a specific event or status. Orders are paginated 50 per page.
The dashboard's Recent orders card still shows your 8 most recent paid orders for a quick glance — click All orders → to jump to the full list.
Order detail page
Clicking any order # in the listing opens its detail page at
/promoter/orders?id=N. It mirrors the admin view and shows everything in one
place: event, buyer info, the full list of tickets in the order (with their codes and
scan status), payment status, full receipt breakdown including your payout, and any
paid/refunded/email-sent timestamps. The action button at the top-right is status-aware
— Resend tickets on paid, Remove order on failed
or pending, nothing on refunded.
What "pending" orders are (and how they get cleaned up)
When a buyer clicks "Continue to checkout" on your event page, the system creates a pending order and reserves their tickets immediately so two people can't grab the last seat at the same time. The buyer is then sent to Stripe to actually pay.
If they finish paying → status flips to Paid and they get their ticket email.
But sometimes buyers close the tab, get their card declined, change their mind, or just time out mid-checkout. When that happens, the order would otherwise sit in Pending status with its tickets held — meaning that inventory is "held" even though no money came in. There are three layers that resolve this for you:
Heads up: if a buyer is still mid-checkout on Stripe's page when you hit Remove on their pending order, their payment will fail. Only use Remove on pending orders you're confident are abandoned.
All three paths are safe by design — they only touch pending or failed orders and never touch a paid order. Inventory math uses a floor at zero so you can't accidentally go negative. Refunded orders cannot be removed (real revenue + Stripe history must stay in the books).
Win-back emails for abandoned checkouts
Whenever the 5-minute cleanup cron auto-fails a pending order (path #1 above), the platform automatically emails the buyer a friendly "Didn't finish checking out?" reminder with the event details and a button back to the event page. This is a cart-recovery tool — some buyers really did just get distracted and will complete the purchase once reminded. It runs on every event by default; you don't need to enable anything.
- The order was just failed by the cron (not by you manually clicking Remove — that's an intentional removal, not an abandonment)
- The event hasn't happened yet and its sales window is still open
- At least one of the originally-requested ticket types still has inventory
- The buyer hasn't received a win-back for this event in the last 24 hours
- The buyer hasn't unsubscribed from win-back emails
You'll see a winback_sent_at timestamp on a failed order in the database if a
reminder was sent for it. If you're curious why a particular buyer didn't get a reminder,
check the server's PHP error log for entries starting with winback skip order=...
reason=... — the reason will be there (event past, sold out, rate-limited,
buyer unsubscribed, etc.).
Issuing a refund
Open the order detail page (click any paid order from your Orders list) and click the red Refund button at the top. You'll see a confirmation dialog showing the buyer's name, email, and the amount that will be refunded. Click OK and the refund fires immediately through Stripe.
The refund happens in real time. Within a few seconds (via Stripe webhook) the order's status flips to Refunded, and within 5–10 business days the money lands back on the buyer's card.
Refunding an order automatically:
- Marks the order as refunded
- Voids the associated tickets (they can't be scanned at the door)
- Returns the inventory to the tier so someone else can buy the spot
- Sends the buyer a refund confirmation email
10. Get paid
Stripe handles your payouts on whatever schedule you set in your Stripe dashboard — daily, weekly, or monthly. Default is 2 business days after each sale, but new accounts may have a longer hold while Stripe verifies.
The Payouts page shows:
- Your lifetime gross sales, earnings, and platform fees
- A log of every payout Stripe has sent
- A direct link to your Stripe dashboard for the deeper view
11. Resend ticket confirmation emails
If a buyer didn't get their tickets, deleted the email by mistake, or can't find the QR codes on show day, you can resend the original email yourself in one click.
| 1 | Open Orders from the sidebar. |
| 2 | Find the buyer's order — use the search box (name, email, or order token like TIX-9A79-QK3R), or scroll the list. |
| 3 | Click the Resend button at the right end of that row. |
| 4 | Confirm the popup. The ticket email goes back out to the address on the order, and the row briefly highlights green to confirm. |
12. Billing & pricing
BuzzHive is built free-first. The Free account has every feature documented in this guide — webhooks, custom event pages, the door scanner, multi-user teams, refunds, CSV exports, all of it. There's an optional Pro tier that exists solely to lower your per-ticket fee for high-volume promoters; it doesn't unlock any features.
Free (the default)
- $0/month — no setup cost, no contracts, cancel anytime
- Every feature documented in this guide is included
- Unlimited events, unlimited ticket types per event
- Standard per-ticket platform fee on what you actually sell
- Stripe processing (2.9% + $0.30) is separate — same as everywhere
Pro (optional, monthly subscription)
- 50% lower per-ticket platform fee
- Priority support from a real person
- No unique features. Every Pro-account perk other than the fee discount is already free
The Billing page has a live break-even calculator. Rough rule: Pro starts paying for itself somewhere around 100–200 tickets/month, depending on your ticket price. Most promoters never need to upgrade — the free tier is built to handle real shows without nickel-and-diming you.
13. Settings
The Settings page is where you change:
- Your promoter display name (what buyers see)
- Public contact email (shown on your promoter page and ticket emails)
- Your password
14. Webhooks
Webhooks let your event activity flow into your own tools in real time — no manual checking, no exports, no waiting. Every time a buyer pays, gets refunded, or a ticket is scanned at the door, we POST a signed JSON payload to a URL of your choosing. You can wire that into:
- Discord — get a channel ping every time someone buys a ticket
- Zapier / Make / n8n — pipe into Google Sheets, Notion, Airtable, your CRM, anywhere
- Your own server — sync into your existing tools
Setting up a webhook
| 1 | Go to Webhooks in your sidebar. |
| 2 | Scroll to Add a webhook. Enter the URL where you want us to POST event payloads. |
| 3 | Add an optional description (so you remember what this hook is for) and pick which events to subscribe to. |
| 4 | Click Create webhook. You'll see a signing secret on the next page — copy it now. After you leave the page, only a fingerprint shows; you'd need to rotate to a new secret if you lose it. |
| 5 | Click Send test event at the top right of the webhook page. Check your endpoint received a webhook.test payload. If it did, you're live. |
Event types you can subscribe to
order.paid— when a buyer completes checkout and payment is captured. The payload includes order id, token, buyer info, totals, and your payout amount.order.refunded— when an order is refunded (full or partial). Payload includes the refund amount and the order's new status.ticket.scanned— when someone's QR is scanned at the door. Payload includes the ticket code, the event, the attendee name, and the timestamp.event.published— when you flip an event from draft to published. Useful for auto-posting "show on sale" announcements.event.cancelled— when you cancel an event. Useful for auto-removing it from external listings.
Payload format
Every payload is a JSON object with this shape:
{
"event": "order.paid",
"data": { ...event-specific fields... },
"promoter_id": 5,
"timestamp": "2026-05-20T18:30:00+00:00"
}
And these HTTP headers:
Content-Type: application/jsonX-Webhook-Event: order.paid(the event type, same as the JSONeventfield)X-Webhook-Signature: sha256=<hex>(HMAC-SHA256 of the raw body, signed with your secret)X-Webhook-Delivery: 12345(delivery row id — useful for idempotency)User-Agent: BuzzHive-Webhook/1.0
Verifying the signature (recommended)
Anyone could POST to your URL pretending to be us. To check it's really
from BuzzHive, recompute the HMAC on your end using your secret and
compare to the X-Webhook-Signature header. Here's how:
PHP:
$body = file_get_contents('php://input');
$sigHeader = $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'] ?? '';
$expected = 'sha256=' . hash_hmac('sha256', $body, $YOUR_SECRET);
if (!hash_equals($expected, $sigHeader)) {
http_response_code(401);
exit('bad signature');
}
Node.js:
const crypto = require('crypto');
const expected = 'sha256=' + crypto
.createHmac('sha256', YOUR_SECRET)
.update(req.rawBody)
.digest('hex');
if (expected !== req.headers['x-webhook-signature']) {
return res.status(401).send('bad signature');
}
Retry policy
If your endpoint returns anything outside the 2xx range, or doesn't respond within 15 seconds, we retry with exponential backoff: 1 min → 5 min → 15 min → 1 hr. After 5 failed attempts the delivery is marked Abandoned. You can always retry a failed/abandoned delivery manually from the Deliveries tab on the webhook page.
Discord example (quickest win)
Want a Discord ping every time someone buys a ticket? Easiest path:
| 1 | In Discord: Server Settings → Integrations → Webhooks → New Webhook. Name it something like "BuzzHive Orders", pick a channel, copy the webhook URL. |
| 2 | Note: Discord webhooks expect a specific payload shape, so you'll likely want to pipe through Zapier / Make / n8n to format the message. Or set up a tiny script (Cloudflare Worker, Vercel function, etc.) that receives our payload and forwards a formatted message to Discord. |
| 3 | For a no-code option: use Zapier's "Webhooks by Zapier" trigger with our URL → "Discord" action to post the formatted message. Free tier works for low volume. |
Managing webhooks
- Pause: uncheck "Active" on the edit page. Stops new deliveries without deleting the config.
- Rotate secret: generate a new signing secret. Your receiver must update to the new secret immediately or signatures will start failing.
- Delete: removes the webhook and all queued/historical deliveries. Cannot be undone.
- Test: fires a sample
webhook.testpayload right now so you can verify your endpoint is reachable + signature checks pass. - Delivery log: every send attempt is logged with the response status, error (if any), and attempt count. Failed deliveries have a Retry button.
15. Troubleshooting
Buyer says their QR code doesn't work
- Ask which event and what the order number or buyer email is.
- Open Orders, search for them, confirm the order has a green Paid badge.
- Click Resend on their row to send the email again.
- If the buyer still can't open the email, ask them to go to
buzzhive.info/order.php?token={order_token}directly — you can copy the token straight from the row.
The scanner says "Camera not supported"
- Make sure the browser is on
https://— cameras don't work on plain http. - iPhone: must use Safari (Chrome on iOS can't access the camera). Android: Chrome works fine.
- Check that the browser has camera permission. iPhone: Settings → Safari → Camera → Allow.
An event is published but the buy button is missing
- Check that Enable ticket sales is checked on the event edit page.
- Check that at least one ticket tier is marked Active.
- Check the sales window: if Sales start is in the future, the buy button won't appear until then.
- Check that you've completed Stripe onboarding — without it, no payment can be processed.
I never got the Stripe payout notification
- Check the Payouts page first — it shows payouts Stripe has confirmed.
- Log into your Stripe dashboard for the most up-to-date status. Stripe sometimes holds funds while verifying.
- Make sure the bank account on your Stripe profile is still valid — closed accounts will pause payouts.
16. Contact support
For anything not covered above — broken pages, refund requests, weird payout questions, feature requests — reach out via the contact form. Include your promoter name and the relevant event or order number and we'll get back to you within one business day.
Last updated June 3, 2026. Spotted something out of date? Email our contact form.