Promoter guide

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.

Reading this without an account? This guide is publicly viewable so you can see the full scope of the platform before signing up. Everything documented below is included on the free account — $0/month, no setup cost, no contracts. When you're ready, create a free account.

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).

Heads up Keep your owner email accessible — password resets go there, and so do important Stripe and payout notices.

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.

1Log in. If onboarding isn't done, you'll be sent to /promoter/onboarding.
2Click Start Stripe onboarding. You'll be taken to Stripe.
3Enter your business details, ID, and a bank account or debit card for payouts. Stripe walks you through it.
4When Stripe says "Done," you'll be redirected back here. The dashboard will show "You're in" and you can start selling.
If Stripe needs more info later Stripe sometimes asks for more documents (a tax ID, a copy of an ID, etc.) once you start taking real money. Watch your email — they'll send a link. If you don't respond, payouts will pause until you do.

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.

1From an event's edit page, click Manage ticket types →.
2Fill 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 0 for 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.
Pricing tip Buyers pay the ticket face value plus a small service fee at checkout. The fee covers the Stripe processing fee and the platform fee. You receive the face value minus the platform fee (see Billing & pricing for current rates).

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.
Managing codes after they go live
  • 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.

Custom URL? The slug is generated from your event title (e.g. 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.
Vibe ≠ accent color. The vibe sets the visual ceiling — backgrounds, typography, layout structure, hover effects. You can still override the vibe's default accent color per event using the Accent color field below (e.g. pick Substation but set a pink accent instead of neon green). Some vibes are intentionally monochrome (Berlin) — those ignore the per-event accent because color would break their identity.

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.

If custom CSS is enabled for you:
  • Always wrap your selectors under .event-custom to 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

1Go to Team in the sidebar.
2In the Invite a team member form, enter their name, email, and pick a role.
3Click Send invite. The page will show a one-time password.
4Copy that password right away — it's only shown once. Send it to your team member along with the login URL.
5They log in at /promoter/login with their email and that temp password, then change it from Settings.
If you lose the temp password Have your team member click "Forgot password?" on the login page, or deactivate and re-invite them from the Team page.

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.

1On show night, have door staff open buzzhive.info/promoter/scan on their phone.
2They sign in with their account (owner, admin, or scanner role all work).
3Pick the event from the list.
4Tap Allow when the browser asks for camera permission.
5Point 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).

Recommended setup Use one phone per door person, plug them into a power bank, and put them in a phone-mount lanyard. A Wi-Fi or strong cellular signal at the venue keeps things snappy — each scan is verified against the server in real time.

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.

1Open your event in the promoter dashboard and click Print door QR in the toolbar (next to View public page).
2A 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.
3Print, cut it out, and tape it at the entrance. Walk-ups scan, buy, walk in.
Pro tip: create a "Day of event" ticket type In Ticket types, add a new tier called "Day of event" or "Door price" — usually $5–$10 above your advance price. That way walk-ups have a tier to choose. Many promoters also schedule their advance tiers to Sales end at doors time so only the day-of tier is buyable once the show starts.

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).

Use the velocity card before booking your next show. Look at past events to spot patterns — what day-of-week sells fastest, which venues have the strongest organic pull, which lineups got the steepest cumulative curve. That data makes you a smarter booker.

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

  1. From an event's manage page, click Referrers in the top action bar.
  2. Add each artist on the bill — name + optional reward notes ("5 tickets = $25 venmo, 10 = comp next show").
  3. BuzzHive auto-generates a url-safe slug and gives you a copy-able share link like buzzhive.info/e/your-event?r=maya.
  4. 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.

Pro tip: make your reward notes specific and visible. Artists promote harder when they can see exactly what each milestone unlocks. "5 tickets = $25 Venmo, 10 tickets = comp at next show + featured spot, 25 tickets = paid slot at next headliner" reads way better than "we'll work something out."

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

  1. Open Email lists in the sidebar.
  2. Click New list, give it a name (e.g. "House Heads", "2024 Past Buyers", "Newsletter").
  3. 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,name lines, or just plain emails one per line, or even Outlook-style "Jane Smith" <jane@example.com>.
  4. Tick the I have permission to email these contacts box. This is a CAN-SPAM requirement and BuzzHive logs the attestation against your account.
  5. 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)

  1. Subject up to 200 chars, body up to 10,000 chars, plain text with preserved line breaks.
  2. BuzzHive prepends an event context block when a send is scoped to an event (auto-skipped when it's a cross-event broadcast).
  3. 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.
  4. Every email includes a one-click unsubscribe link. Unsubscribed contacts are silently filtered out of all future sends across both tools.
  5. Each send is logged in the Past campaigns sidebar so you can see exactly what you've sent and when.
  6. 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.
Common pattern: day-of show, use the per-event Email buyers tool for a "tonight!" reminder. Day after, use Outreach with "Paid buyers — All events" + a short thank-you and a tease of your next show to keep momentum across your full audience. The two tools complement each other.

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:

1. Automatic cleanup (the cron, every minute) A background job runs every minute and auto-fails any pending order that's been sitting for 5+ minutes with no activity. It voids the held tickets, releases that inventory back to the tier, and flips the order to Failed. You don't have to do anything — check your tier inventory a few minutes after an abandonment and you'll see the seats back in the pool.
2. Bulk cleanup button (manual, for older stuck orders) If somehow a pending order escapes the cron and is older than 30 minutes, a "Clean up N abandoned pending →" button appears in the Orders page header. Same outcome: void the tickets, release inventory, mark as Failed. Click, confirm, done.
3. Per-order Remove button (manual, immediate) On any pending or failed order — either from the row in the listing or from the order detail page — you'll see a red Remove button. This permanently deletes the order and its tickets. For a pending order it also releases the held inventory back to the tier first. Use this when you know the buyer abandoned the cart (e.g., they texted you that their card was declined) and you don't want to wait the 5 minutes for the cron.

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.

Guardrails that keep this from being spammy The platform only sends a win-back email if all of these are true:
  • 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
Each email carries a one-click Unsubscribe link in the footer so buyers can opt out permanently. Once unsubscribed, that email address will never receive another win-back from the platform.

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
Partial refunds (refunding part of an order, not the full amount) aren't self-serve yet — for those, contact support with the order number and the partial amount. Full refunds are one click.

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
Money flow Buyer pays $25 + service fee → Stripe charges their card → Stripe deducts its processing fee → We take the platform fee → The rest goes to your connected bank account on your payout schedule. You can see this breakdown on every paid order.

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.

1Open Orders from the sidebar.
2Find the buyer's order — use the search box (name, email, or order token like TIX-9A79-QK3R), or scroll the list.
3Click the Resend button at the right end of that row.
4Confirm the popup. The ticket email goes back out to the address on the order, and the row briefly highlights green to confirm.
If the buyer's email is wrong Resend always goes to whatever email was entered at checkout — you can't change it from this tool. If the buyer typed their address wrong, email our contact form with the order number and the correct address and we'll fix it.

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.

How to switch You can upgrade from Billing at any time. You can also downgrade back to Free at any time — no penalty, no lock-in. Your events, tickets, and buyer list stay with 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

1Go to Webhooks in your sidebar.
2Scroll to Add a webhook. Enter the URL where you want us to POST event payloads.
3Add an optional description (so you remember what this hook is for) and pick which events to subscribe to.
4Click 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.
5Click 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/json
  • X-Webhook-Event: order.paid (the event type, same as the JSON event field)
  • 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.

Tip — respond fast Your endpoint should return a 2xx response as quickly as possible (within seconds). If you need to do slow work with the payload, accept it, queue it to a background job, and return 200 immediately. Holding the request open will eventually time out from our side and trigger retries.

Discord example (quickest win)

Want a Discord ping every time someone buys a ticket? Easiest path:

1In Discord: Server Settings → Integrations → Webhooks → New Webhook. Name it something like "BuzzHive Orders", pick a channel, copy the webhook URL.
2Note: 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.
3For 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.test payload 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

  1. Ask which event and what the order number or buyer email is.
  2. Open Orders, search for them, confirm the order has a green Paid badge.
  3. Click Resend on their row to send the email again.
  4. 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.

Go to contact form →

Last updated June 3, 2026. Spotted something out of date? Email our contact form.