Hosting guide
How to host on Offkai
Quick start. About 5 minutes to read; bookmark it.
If anything's unclear or broken, email karl@offkai.app — we're still in testing and your feedback shapes the next iteration.
On this page
Before your event
Running your event
Changes & cancellations
Fees & payment terms
Wrapping up
Before your event
Set up your profile (one-time, ~2 min)
Go to Profile.
- Preferred name — what hosts and attendees see at the door (e.g. "Karl Rojas"). Different from your username, which is your community handle.
- Payment methods — add at least one. Venmo, Zelle, PayPal, Wise, Cash, or "Other" for things like GCash, Revolut, PayPay, etc. For digital methods, paste the handle attendees need to send to. Cash means "collected at the door."
Without at least one payment method saved, you can't pick which methods your event accepts.
Create an event (~3 min)
Host → + Create.
Fill in:
- Title, description, location, date/time — standard. Drop a venue address or paste lat/lng coordinates; the form shows a live map preview. If you used coordinates, set an optional location label (“Karl's house”) so attendees see something readable instead of a number pair.
- Capacity — total seats. Counts toward the "X/Y capacity" indicator on your dashboard.
- Max guests per RSVP — set to >1 if attendees can bring a +1.
- Price & Currency — choose the currency attendees pay in (USD, EUR, GBP, JPY, AUD, CAD, KRW, CNY, INR, BRL, SGD), then enter the per-attendee price. Free is supported. Currency is locked after creation; zero-decimal currencies (JPY, KRW) take whole numbers only. Cash, Wise, and PayPal attendees pay you directly in that currency; Stripe attendees are charged in it and Stripe converts to your settlement currency at their daily rate. If you set up ticket tiers (below), this base price is ignored — attendees pick a tier instead.
- Ticket tiers (optional) — instead of one flat price, offer named tiers (e.g. General, VIP, Early bird). Each tier has its own price, an optional capacity (seats for that tier; blank = bounded only by the event capacity), and an optional max per order. Mark a tier Hidden to keep it off the public page until a promo code reveals it. When you use tiers, the base price and "Max guests per RSVP" are ignored — attendees pick a tier at checkout. Editing a tier's price later only affects future RSVPs.
- Cover image — optional but recommended; renders as the hero on the public event page.
- Accepted payment methods — pick from your saved profile methods. Greyed-out methods are ones you haven't set up yet — go back to Profile to add them. Card (Stripe) appears once you've connected Stripe on your Profile.
- Require a payment transaction / reference ID (optional) — when on, attendees paying by a manual method (Venmo, Zelle, PayPal, Wise, Other) must type the reference from their payment app alongside the screenshot, so you can ctrl-F it against your payment history or a CSV. It shows on the payment in your queue and in the guest-list CSV export. Doesn't apply to Card (Stripe).
- Check-in — how do you want attendees verified at the door? Three options, picked per event:
- QR ticket (default for paid events) — each attendee gets a QR in their confirmation email. Scan with the app or web scanner.
- Roster — no QR; tap names off a guest list at the door. Works offline.
- No check-in — attendees just show up. You see a headcount, no ticket is generated. For casual free meetups.
- List in Discover (Visibility section) — optional toggle. If on, your event shows up on offkai.app/discover (the public catalog) once you hit the minimum-RSVPs threshold. You also tag categories so attendees can filter. Off by default — link-sharing still works either way.
- Show attendees (Visibility section) — on by default. When on, signed-in visitors to your event page see a “Who's coming” panel below the RSVP box with two columns: Participants (Going) and Interested, ordered by RSVP time, capped at 12 per column with “+ N more”. Anon viewers never see it. Toggle off if you'd rather keep the guest list private — the rest of the page is unaffected.
- Require a password (Visibility section) — gate the event so only people with your password can see or RSVP to it. While the password is on, the event stays hidden from Discover and public profiles; share the link + password directly. Optionally set "Open to everyone after" a date/time — for presales: when that moment passes, the password drops automatically. Attendees sign in, then enter the password to unlock. You, your co-hosts, admins, and anyone who's already RSVP'd skip the gate.
Save → you land on the event detail page (your hosting hub for this event).
Description formatting
Event descriptions support markdown — a simple syntax for adding formatting to plain text. Plain text works too; markdown is layered on top, not required.
| You type | You get |
|---|---|
**bold** | bold |
*italics* | italics |
- bullet (one per line) | bullet point |
1. numbered (one per line) | numbered list |
[click](https://example.com) | click |
### Heading | section heading |
> quoted text | indented quote |
Example:
**What to bring**: - ID - Cash for drinks Address is **123 Main St** — look for the red door. RSVP closes 48 hours before the event.
The textarea handles line breaks automatically — hit enter twice to start a new paragraph. External links open in a new tab. Image embeds, scripts, and raw HTML are stripped for safety; if you want to share an external resource, use a link.
Ticket tiers, hidden items, and promo codes
Tiers and add-ons can be hidden and revealed with a promo code — useful for member rates, early-bird pricing, or a secret VIP tier, and for discounts.
Promo codes are managed on the event's hosting page (not the create form). Open your event → Promo codes → + Add promo code. Each code can:
- Reveal hidden tiers / add-ons — tick which hidden items the code unlocks. (Saving a code that reveals an item automatically marks that item hidden — a reveal only makes sense for something hidden by default.)
- Apply a discount — none, a percent (1–100%), or a fixed amount off the order.
- Cap total redemptions — "Max redemptions" (blank = unlimited). Each attendee can use a given code once (the per-person limit is fixed at one).
- Active toggle — flip a code off without deleting it.
Attendees enter codes in the "Have a code?" box on the event page (they need to be signed in). A valid code reveals any hidden tiers/add-ons and shows the discount on the order total before they pay. The applied code and discounted amount are frozen onto the RSVP, so later edits to the code don't change what someone already paid.
Caps are enforced atomically at confirmation. If two people race for the last seat of a tier, the last unit of an add-on, or the last use of a one-time code, exactly one wins — the other sees a "sold out" / "this code has reached its limit" message. A started-but-unpaid checkout doesn't reserve the slot; it's first to confirm that wins.
Fundraisers
A fundraiser is an event built around raising money rather than selling seats — flower stands, group gifts, equipment funds, a guest's travel costs, anything anchored to your event. Attendees donate instead of RSVP, you get a live progress bar toward a goal, and a public donor wall shows who chipped in. Everything else (check-in, payments, your hosting hub) works the same as a standard event.
Fundraisers must have Stripe enabled. Connect Stripe and finish onboarding (identity verification) in your Profile before you can create one — if Stripe isn't connected, picking "Fundraiser" shows a warning and you can't publish until it is. You can still offer Venmo, Zelle, and other methods alongside it; Stripe just has to be on too. It's required so the organizer is identity-verified (KYC / AML) with a path for chargeback / fraud handling — and because Stripe is what enables anonymous donations.
Setting up a fundraiser
At the top of event creation there's a "What are you creating?" selector — pick Fundraiser instead of Standard event. Fundraisers swap RSVP language for donation language across the public page, and when you list the event in Discover they're auto-tagged under the Fundraising category so supporters can find them.
The rest of the create form is the same. A fundraiser ignores the base Price field — money comes from your fundraising buckets (below) or the simple donation amount.
Fundraising buckets (tiers & add-ons)
Each ticket tier and add-on doubles as a fundraising bucket. Beyond the usual price, a fundraiser bucket gets three extra controls:
- What this funds — a short description that labels the project (e.g. “Covers venue rental for the night”). It's the name shown on the donate form, the progress bar, and the donor wall. If you leave it blank the bucket name is used.
- Goal — a per-bucket target. Setting one draws a progress bar that fills as donations come in. No goal = no bar for that bucket (it still collects toward the overall total raised).
- Accept custom amount (fill-in) — instead of a fixed price, let donors name their own amount. You can set an optional Min and Max to keep amounts sensible; leave them blank for no floor/ceiling.
Use fixed-price buckets for set tiers (“$25 — name on the banner”) and fill-in buckets for open-ended giving.
Simple fundraiser (no tiers)
If you don't want tiers or add-ons, just turn on "Let donors choose how much to give" in the price area — a single name-your-amount Donation amount with optional Min/Max and a Goal. Donors type what they want to give and that's the whole flow. Add a tier or add-on later and this hides, with pricing coming from those instead.
Stop accepting at goal (hard cap)
Each bucket with a goal has a "Stop accepting at goal" toggle. Leave it off (the default) and the bucket keeps accepting past its goal — overfunding is fine. Turn it on and the bucket closes once verified donations reach the goal; the public page shows a “Goal reached · closed” badge and no one can donate to it further.
What donors see
- Fundraising progress — a headline “$X raised” plus, for each bucket with a goal, a two-segment bar: emerald for verified donations and grey for pending (donations awaiting your approval or a Stripe confirmation). The bar caps at the goal so it never overflows; the headline percentage can read past 100% when overfunded.
- Donor wall — a Donors list of every verified donation with the donor's name, amount, an optional message, and a relative timestamp (“2d ago”). Signed-in attendees see it (it follows the same “Show attendees” visibility rule as the guest list).
- Words of support — donors can leave a short message (up to 280 characters) with their donation; it shows on the wall.
- Anonymous donations — donors can tick Donate anonymously to keep their name and amount off the public wall and hidden from you. This is card-only (Stripe) — manual methods need a visible name to match the payment, so the option is greyed out for them.
Moderating donor messages
You and your co-hosts can hide an inappropriate message from the public wall — open the donor wall, find the row, and click Hide message. The donation still counts toward your total; only the message is pulled. Hidden messages show to you greyed-out with a “Hidden from the public wall” note and an Unhide message button to reverse it.
Donation receipts
Donors get an itemized receipt (donation amount + any processing fee + total) by email and on their /my-rsvps page, the same as a paid ticket — except it's framed as a donation, not a QR ticket. The receipt clearly states the contribution is a payment receipt, not a charitable tax receipt: it is not tax-deductible and does not qualify as a 501(c)(3) donation. Offkai is a platform, not a registered charity — if you're running a true charitable drive, handle tax documentation yourself.
Co-hosts & roles
Add helpers from Host → your event → Co-hosts (or in the create/edit form). Invite by email or @username. Invites are two-step: the person gets an invitation they must accept from their Invitations page before they can act on the event — nothing happens until they say yes.
Each co-host has one of two roles:
- Editor — full helper access: edit event details, manage the guest list and waitlist, approve payments, send broadcasts, and run check-in. Editors can't delete or cancel the event or change the organizer's payout setup.
- Scanner — door-only: look up the guest list and check people in. No access to editing, finances, refunds, or attendee contact details.
Each co-host picks which of their own saved payment methods apply to the event, so a shared event can list several hosts' handles. Change a role or remove a co-host any time from the Co-hosts panel.
Schedule when RSVPs open & close
By default RSVPs are open the moment the event is live. To run a timed drop, set an RSVPs open at and/or RSVPs close at time in the event form:
- Open at — the event page is visible but the RSVP button stays locked with a countdown until your chosen time. Attendees can mark Interested beforehand and we email them the moment RSVPs open.
- Close at — RSVPs stop at this time even if seats remain (useful for catering or printing cutoffs). The event page stays up.
Times use the event's timezone. A password-gated presale has its own separate expiry (see Create an event) — the two controls are independent.
Drafts & publishing
Save as draft keeps an event private while you finish it: it never appears on Discover, has no public link, and accepts no RSVPs. Your Host list has a Drafts filter with a count so you don't lose track of one.
- Publish when you're ready — the event goes live and (if you marked it discoverable) starts showing on Discover.
- Delete draft removes it permanently. Delete is only offered while an event is still a draft with no activity.
Running your event
While RSVPs come in
Your event detail page shows everything live:
- Status tiles — confirmed / pending payment / waitlist / checked in
- Revenue tiles — expected, pending review, verified, plus a cash collected/owed split
- Manage section links to:
- Guest list — see everyone, search, mark verified/checked-in, add walk-ins, cancel RSVPs, export CSV
- Add walk-in guest — for people who join late
- Screenshots & cash awaiting your review — your queue of payments to approve
- Attendees who haven't uploaded a screenshot — gentle nudge list
Free + No check-in events skip the payment flow entirely. Attendees see a lightweight “I'm going” / “I'm interested” toggle instead. “Going” counts toward capacity; “Interested” doesn't. There's no QR ticket, no screenshot, no approval queue — you just get a headcount on the dashboard. The rest of this section applies to events that take a payment.
“Interested” is collected on every event, not just free ones. Any attendee can mark themselves Interested next to the main RSVP button — it's a soft signal, doesn't reserve a seat, and doesn't enter your approval queue. On paid + capacity-capped events, if a confirmed attendee cancels and there's no one on the waitlist to auto-promote, the oldest Interested user gets a “spot opened” email pointing them back at the event. It's first-come-first-served from there — Offkai doesn't hold the seat. Going → Interested on a paid event is blocked; the attendee has to cancel first so the refund path runs.
Approving payments
Every paid RSVP — digital and cash — needs your approval before the QR ticket goes out (for QR-mode events) or the seat is finalized (for roster-mode events). Cash isn't paid in advance (you collect it at the door), but approval is your way of saying “yes, I want this person at the event.” Card (Stripe) attendees skip this step entirely — the payment is auto-verified by webhook and their ticket emails immediately.
The Payments page shows three tabs:
- Pending review — screenshots waiting on you (digital, attendee already uploaded)
- Pending screenshot upload — digital RSVPs that haven't uploaded yet plus all cash RSVPs. Per-row Remind button on digital rows nudges them to upload. Cash rows show “approve in modal” — open them to send the ticket. Multi-select checkboxes let you bulk-remind digital uploaders (24h cooldown per attendee, capped at 50 per click).
- History — anything previously submitted, including verified ones
Click into a row to see details. Actions:
- Approve & send ticket — emails the attendee a QR code ticket. For digital, also flips payment to verified. For cash, status moves to confirmed but payment stays “pending” (you collect at the door).
- Reject — adds your optional note to the email asking them to resend (digital only).
Walk-ins
On the guest list, click + Add walk-in. Name + (optional) email + payment method. Walk-ins skip the approval queue — when you add them, you're implicitly approving them, so they go straight to confirmed. If you tick "Already paid" on a digital walk-in, payment is also marked verified. If you give them an email, they get a receipt; otherwise the row just appears in your list.
Check-in
Depends on the check-in mode you picked when you created the event.
QR ticket mode
Two ways to scan, pick whichever your phone supports:
- Mobile app (sideloaded APK or TestFlight, same login): tap the event → Scanner. Native camera, fastest.
- Web scanner on any phone browser (iPhone Safari, Android Chrome): go to your event in Host → Scan QR codes at the door. Uses your phone's camera through the browser. No app install needed — works for hosts on iPhone without TestFlight.
Both behave the same way:
- For cash payers, the scanner shows a "Collect $X" prompt before checking them in.
- For walk-ins, search by name in the guest list and tap to mark them checked in (no QR needed).
- If someone shows up whose RSVP was cancelled, the scanner blocks check-in with "RSVP Cancelled". Same for tickets from a different event ("wrong event").
- Notes the attendee or you added show up on the result card so you can act on them (vegetarian, plus-one, allergy, etc.).
Roster mode
Go to your event → Open check-in roster. You see every confirmed attendee as a tappable row.
- Tap a name to mark them checked in. Tap again to undo.
- + Walk-in at the top adds someone who didn't RSVP — name + (optional) email + payment method. Counts as confirmed + checked-in in one action.
- Works offline-friendly — the page loads once, taps queue up; reload if you need fresh state.
No QR is generated for roster-mode events — attendees see "You're on the guest list" on their /my-rsvps page instead of a ticket.
No-check-in mode
Nothing to do at the door. Attendees just show up. The dashboard still shows a headcount (Going vs Interested for free events; confirmed RSVP count for paid).
Switching modes mid-event
You can change the check-in mode on the edit form at any time. If you flip it on an event that already has confirmed attendees within 7 days, you'll see a "Save check-in change?" sheet asking whether to notify attendees:
- QR → anything else: defaults to Skip — include in next reminder (attendees already have their QR; the change is low-urgency).
- Anything → QR: defaults to Email N attendees their QR now (they need the new ticket).
Waitlist & seat offers
When a capped event fills up, new sign-ups join a waitlist in order. From Host → your event → Waitlist you can:
- Send an offer when a seat frees up. The attendee gets an email with a claim link and a time limit; if they don't claim in time, the seat is released for the next person.
- Auto-promote — turn this on and the next person is offered a seat automatically whenever one opens, so you don't have to watch the list.
Need to stop new RSVPs without cancelling? Use Pause RSVPs on the event — the page stays up and existing seats are held, but the RSVP button is disabled until you resume.
Message your attendees
Send a one-off update — venue change, parking, what to bring — from the Broadcast button on your event. Choose who receives it: Confirmed, Pending payment, Active (both of those), Interested, or everyone.
Each send is rate-limited so you can't accidentally hit the same group twice in quick succession, and the event keeps a history of what you sent and how many it reached. Every message carries a one-click unsubscribe link — anyone who opts out stops receiving host emails for that event.
Random giveaway picker
Running a door prize or raffle? Open Pick winners on your event to draw attendees at random. You choose how many winners and the pool to draw from — all eligible, checked-in only, a specific ticket tier, or buyers of a specific add-on. The winners animate in and you can copy the list to share.
Insights
Insights on your event gives an at-a-glance read on how it's tracking: RSVPs and revenue over time, a status breakdown (confirmed / pending / waitlisted / interested), the payment-method split, add-on sales, refunds, and capacity used. Good for catching a slow week early or seeing which add-on is carrying the event.
Changes & cancellations
Cancellations
- Cancel a single RSVP — guest list → click the row → Cancel. Sends them a cancellation email; you can restore later from the Cancelled filter, which re-issues the QR ticket if they were verified.
- Cancel the whole event — event detail page → bottom → Cancel event. Emails every active attendee with a refund instruction. Reopen later if plans change.
Card (Stripe) refunds
If you accept Card (Stripe), attendees who paid by card can be refunded directly through Stripe — Offkai's app handles the API call for you.
Cancellation policy (set per event when creating/editing):
- Flexible — full refund up to 7 days before the event. Attendees who cancel within that window get an auto-refund; the system fires the Stripe API call and emails them when it clears.
- Standard (default) — same as Flexible but with a 48-hour window.
- Non-refundable — attendees can't self-cancel for a refund. You can still issue manual refunds from your event's Payments page.
- Custom — describe your own terms. Attendees see your custom text on the event page and are routed to message you for refunds.
To refund a Card attendee manually — open the event's Payments page → Stripe payments panel at the top → Refund button next to the attendee. Confirms the amount, then issues the refund via Stripe.
What gets refunded (industry standard — matches Eventbrite/Ticketmaster):
- The face value of the ticket → returned to the attendee.
- Stripe's processing fees the attendee paid as a buffer → not refunded (non-refundable, per industry norm).
- The $0.35 platform service fee → not refunded (covers Offkai's costs for the platform service).
- Stripe's actual processing fee on the original charge (2.9% + 30¢) → not refunded by Stripe; that's a cost the host absorbs per Stripe's policy.
So a $20 ticket purchase on Card with the default +1% buffer:
- Attendee paid $21.55 ($20 face value + $0.35 platform service + $1.20 Stripe processing buffer).
- On refund, attendee receives $20.00 back (face value only).
- Your Stripe balance: net loss of ~$0.60 (Stripe's actual processing fee on the original charge, not refunded).
- Offkai keeps the $0.35 platform service fee.
Attendees see this disclosure on the event detail page (Cancellation policy section) and on their /my-rsvps confirmation before they click Cancel, so there are no surprises.
Adjusting an RSVP after it's confirmed
Things change after an attendee RSVPs — someone wants to add a side dish, drop a +1, or you typed the wrong guest count. Adjust order lets you edit a confirmed RSVP's add-ons and guest count without cancelling and starting over. Available on confirmed and pending-payment RSVPs across every payment rail (Stripe, cash, Venmo, Zelle, PayPal, Wise). Not available on cancelled, waitlisted, or interested rows.
You'll find the Adjust order link in two places:
- The event's Payments page — on each screenshot-flow row, and on each Stripe row inside the refunds panel.
- The event's Guests page — inside each guest's detail modal, alongside Restore / Verify payment / Check in / Refund.
The modal lets you change add-on quantities and guest count. Capacity is re-checked on save; if your change would oversell the event, you'll see a warning with an override checkbox so you can push through deliberately. Every save writes a row to the attendee-visible audit log (see below) — there's no silent edit even if you skip the email.
Topping up the charge when you add items
For Stripe-verified RSVPs, the modal shows the original charge amount and doesn't auto-modify what was charged. If you adjust the order in a way that increases the total (added a paid add-on, bumped guest count on a paid event), Offkai handles the delta as a separate top-up charge:
- The “Don't email or charge” checkbox at the bottom of the modal starts unchecked by default for verified-Stripe + positive delta — saving creates a Stripe Checkout Session for the difference and emails the attendee a “Pay $X.XX now” button.
- The same payment link surfaces as a Payment due banner on the attendee's /my-rsvps page in case they lose the email.
- When the attendee pays, the webhook updates the RSVP's recorded charge total.
- Top-ups go 100% to you — Offkai doesn't take a platform cut on the delta charge.
For non-Stripe rails with a positive delta (cash, Venmo, Zelle, PayPal, Wise), Offkai emails the attendee a notification with the amount owed; you collect via the original method out of band.
For negative deltas (you removed items or reduced guests), the attendee just gets a notification email. There's no automatic refund — if you want to refund the difference on a Stripe RSVP, use the Refund button on the Payments page separately.
Silent corrections (data-entry fixes)
For every other case — no charge change, removed items, non-Stripe rails — the “Don't email or charge” checkbox starts checked by default. Save and the change is recorded in the audit log only; no email, no payment link. Use this when you're fixing your own typo and don't want to bother the attendee. The checkbox is always overridable in either direction; whatever you click sticks for that save.
Audit log (what the attendee sees)
Every adjustment writes a row to an Order history card on the attendee's /my-rsvps page. It's collapsible and shows the timestamp, your name, a before→after diff (guest count + each add-on change), the total delta, and your optional reason. Attendees can re-open this at any time, so be candid in the reason field if you add one.
When to reach for this
- “Can I add a side dish?” — open Adjust order, bump the add-on quantity, leave the checkbox unchecked, save. Attendee gets a payment link, pays, done.
- “I entered their guest count as 1 but they brought 2.” — same flow; if the event is paid and the delta is positive, the attendee pays the difference via the link.
- “I made a data-entry mistake — wrong add-on, right person.” — tick the checkbox so it's silent, save, only the audit log records the change.
- “Attendee wants to drop a guest.” — reduce guest count, save (notification email goes out). Issue a partial refund manually from the Stripe Dashboard if needed.
Limitation: refunds on RSVPs with a paid top-up
If a Stripe RSVP has a paid top-up attached, the Refund button currently blocks with an error directing you to refund the top-up charge separately via the Stripe Dashboard first. Multi-charge refund through Offkai is a planned follow-up.
Fees & payment terms
Fees and payment terms
Offkai platform fee
Offkai charges a flat platform fee on each paid Stripe ticket sold through the platform:
- Paid tickets (Stripe) — ~$0.35 USD equivalent per ticket, billed in the event's currency (USD $0.35 · JPY ¥60 · SGD S$0.50 · AUD A$0.50)
- Free tickets ($0.00) — no fee
- Cash / Venmo / Zelle / PayPal / Wise — no platform fee (payments external to Offkai)
No monthly fees or setup costs
No subscription fees, setup fees, annual fees, or recurring charges. You pay only when you sell paid Stripe tickets.
Stripe payment processing fees
Stripe charges separate processing fees for each card transaction. Stripe fees are independent of the Offkai platform fee, are charged by Stripe (not Offkai), and Offkai has no control over Stripe's pricing. Current Stripe pricing: stripe.com/pricing.
If your organization is a registered 501(c)(3) nonprofit, you may qualify for Stripe's discounted nonprofit processing rate — apply directly through Stripe. If approved, the lower rate applies to your Stripe account automatically; Offkai does not need to be involved.
Fee collection
Offkai's platform fee is automatically deducted from each Stripe transaction before funds land in your connected Stripe account. Stripe's processing fee is deducted by Stripe during processing. Neither flows through Offkai's bank account — funds go host ↔ Stripe ↔ attendee directly.
Fee absorption or pass-through
When you accept Card (Stripe), you choose one of two fee models per event:
- Pass-through (default) — Fees ride on top of the ticket price. Attendee sees an itemized breakdown at checkout (ticket + service fee + processing fee).
- Absorb fees — Ticket price is the flat total. You absorb the fees from your payout.
You can also set a processing-fee buffer (0, +1%, or +2%) on top of Stripe's base rate to flatten payout variance across card types. International cards and currency-converted cards carry higher Stripe fees than US cards, and the buffer absorbs that variance.
Non-refundable fees
The Offkai platform fee and Stripe processing fees are non-refundable once a ticket has been sold, regardless of whether you (or the attendee) subsequently issue a refund, the event is cancelled, or a chargeback occurs — except where required by applicable law. This matches industry standard (Eventbrite, Ticketmaster, StubHub). The platform fee covers the service rendered up to the point of sale; the processing fees are charged by Stripe at the moment of payment and aren't reversed.
Taxes
All fees shown above are exclusive of applicable taxes. You are solely responsible for determining and collecting any sales tax, VAT, GST, or other taxes applicable to your ticket sales in your jurisdiction. Offkai does not calculate, collect, or remit taxes on your behalf.
If you operate in a jurisdiction that requires tax collection on event tickets (e.g. some US states, EU member states), consult an accountant. We may add per-event Stripe Tax integration in the future for hosts who want automated calculation — reach out if this is blocking you.
Fee changes
Offkai reserves the right to modify the platform fee structure with thirty (30) days' written notice. Fee changes won't apply retroactively to tickets already sold before the effective date.
Bank statement descriptor
With Stripe Connect Direct Charges, you are the merchant of record — your Stripe account's statement descriptor is what attendees see on their credit card / bank statement. Offkai appends a fixed suffix to every charge so attendees recognize the purchase:
<YOUR ACCOUNT DESCRIPTOR>* Offkai App
Examples (card networks display the full descriptor in uppercase regardless):
JOHN DOE EVENTS* OFFKAI APPOFFKAI EVENTS* OFFKAI APP(if your descriptor is already "OFFKAI EVENTS")
Your descriptor comes from Stripe's "Statement descriptor" field on your account (Stripe dashboard → Settings → Public details → Statement descriptor). If your current descriptor is your business or legal name and you'd prefer something more recognizable to attendees — e.g. your event brand — you can change it in Stripe. Changes apply to new charges going forward; settled charges keep their original descriptor.
The * Offkai App suffix isn't configurable per-host — it's a platform default to make it consistent across all events. If you want a specific event name in the descriptor instead, message us; in the future we may surface a per-event suffix override.
Wrapping up
After the event
Nothing forced — events stay in your dashboard with a "checked in / capacity" snapshot. Payment screenshots auto-delete 30 days after the event ends so we're not sitting on attendee PII.
Common questions
An attendee can't sign up — they say they didn't get a confirmation code.
Have them check spam. If still missing, the "Resend code" button on the verify screen sends a new one. Codes expire after 1 hour.
An attendee paid via a method I don't have set up.
Edit the event → uncheck the missing method, add the right one in your Profile, edit again to enable it. The attendee can then send a screenshot via that method.
I added a co-host but they can't see the event.
Co-host invites are two-step — the person has to accept from their Invitations page before the event shows up. Once accepted, they log in, use Host in the nav, and see your event alongside their own (marked with a co-host pill). See Co-hosts & roles for editor vs. scanner access.
I want to test cash and digital flows on the same event.
Tick both methods on event creation. Each attendee picks one when they RSVP.
Which check-in mode should I pick?
Use QR ticket for paid events where you want a clean, scan-and-go door experience. Use Roster for free or paid events where attendees know each other and the door host can recognize them — also good if the venue has poor cell reception (no QR scanning). Use No check-in for casual free meetups where attendance is loose and you just want a headcount. Attendees on these events see "I'm going / I'm interested" instead of a payment flow.
My event isn't showing up on Discover even though I turned it on.
Discover requires a minimum number of confirmed RSVPs before the event appears (currently 10, admin-configurable). This is a quality bar — events without any traction stay hidden so the catalog doesn't look empty. Once you cross the threshold, your event shows up on the next page load.
Where do I report a bug or weird behavior?
Email karl@offkai.app with the event ID (visible in the URL: /host/events/<id>) and what you saw. Screenshots help.