TktPlz processes all payments through Razorpay. When you book tickets, your seats or ticket quantities are temporarily locked for 10 minutes while you review your order. You then complete payment through the Razorpay checkout modal, and once verified, your ticket is issued immediately. This page explains each part of that flow, how prices are calculated, and how organizers receive their payouts.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/Sumitbose5/tktplz/llms.txt
Use this file to discover all available pages before exploring further.
Payment flow
Review booking summary
After selecting your seats or ticket categories, you land on the Booking Summary page. Your selections are locked in Redis for 10 minutes — a countdown timer is shown on screen. If the timer expires before payment, your items are automatically released back to the pool.The summary shows:
- Event name, venue, and date
- Tickets selected (seat labels for Seating events, category and count for Open/Online events)
- Order amount, platform fee, and total payable
Create order
When you click Pay, the app calls
POST /api/payment/createOrder. The server calculates your final price, creates a Razorpay order, and returns an orderId along with the full price breakdown.Complete Razorpay checkout
The Razorpay checkout modal opens in your browser. You can pay using UPI, net banking, cards, or wallets supported by Razorpay. The modal is pre-filled with the order amount in INR (paise).
Verify payment
After you pay, Razorpay returns
razorpay_order_id, razorpay_payment_id, and razorpay_signature to the frontend. These are immediately forwarded to POST /api/payment/verifyPayment. The server verifies the HMAC-SHA256 signature and, if valid, completes your booking.Your seat or ticket lock lasts exactly 10 minutes. If the Razorpay modal is still open when the timer runs out, the lock expires and you will need to start the booking again.
Pricing
TktPlz supports three pricing modes depending on how the organizer configured the event.Flat pricing
A single price applies to every ticket regardless of seat or category. Stored as
flatPrice in the ticket_prices table.Category pricing
Different ticket tiers (for example, Regular, Executive, VIP) each have their own price. Stored as rows in the
ticket_categories table with a type and price per category.Free events
Events marked
isPaid = false skip all price calculations. totalAmount is 0 and no Razorpay order is created.Price breakdown
Your booking summary always shows three line items:| Line item | Description |
|---|---|
Order amount (totalSeatAmount) | Sum of ticket prices before any fees |
Platform fees (totalConvenienceFee) | Per-ticket convenience fee added by TktPlz |
Total payable (totalAmount) | Order amount + platform fees |
Platform fee tiers
The convenience fee is calculated per ticket based on the ticket price:| Ticket price | Convenience fee per ticket |
|---|---|
| ₹0 – ₹199 | ₹10 |
| ₹200 – ₹499 | ₹30 |
| ₹500 – ₹999 | ₹50 |
| ₹1,000 and above | ₹75 |
Coupons and referral discounts
The booking summary page displays an Available Offers section where active coupons and promotional codes are listed. Applying a valid code reduces thetotalSeatAmount before the convenience fee is calculated.
Discount and referral code management is handled separately from the payment flow. The amount sent to
createOrder already reflects any applied discounts.API reference
POST /api/payment/createOrder
Creates a Razorpay order for the selected tickets. Price calculation runs as middleware before this handler — you do not need to compute amounts yourself. Request bodyID of the event being booked.
ID of the authenticated user making the booking.
Object describing the event type and other display details. The
type field ("Seating", "Open", "Online") determines how prices are calculated.Array of seat IDs. Required when
eventDetails.type is "Seating".Array of
{ id, type, price, count } objects. Required when eventDetails.type is "Open" or "Online".true when the order was created successfully.Razorpay order ID. Pass this to the Razorpay checkout and then to
verifyPayment.Total amount in INR (not paise). This is what the user pays.
Always
"INR".POST /api/payment/verifyPayment
Verifies the Razorpay payment signature and completes the booking. Call this immediately after Razorpay calls your success handler. Request bodyOrder ID returned by Razorpay after payment.
Payment ID returned by Razorpay after payment.
HMAC-SHA256 signature from Razorpay used to verify payment authenticity.
ID of the event.
ID of the user who made the payment.
Seat IDs selected. Required for Seating events.
Ticket categories selected. Required for Open/Online events.
Total amount from the original
createOrder response.Convenience fee from the original
createOrder response.Payment failure
If your payment fails inside the Razorpay checkout (for example, due to insufficient funds or a bank decline), you are redirected to the Payment Failure page. The page shows:- The error message from Razorpay
- The Order ID (if one was created before the failure)
- Event name and details
A failed payment does not cancel your locked seats or tickets. Your lock remains active for the remainder of the 10-minute window, so you can retry immediately without re-selecting.
Payment confirmation and ticket delivery
AfterverifyPayment succeeds, your booking status is set to CONFIRMED. The Payment Successful page displays:
- Razorpay Payment ID (e.g.
pay_ABCDEF123456) - Razorpay Order ID (e.g.
order_PQR456STU789) - Amount paid in INR
- Download your ticket as a PDF (via
POST /api/ticket/downloadwith yourorderId) - Book more tickets and return to the home screen
Organizer payouts
Once an event concludes, TktPlz administrators calculate the payout for the organizer and create a payout record. As an organizer, you can view your payouts through the dashboard.Payout summary
Shows all payouts linked to your organizer account, including event name, total revenue, deductions, net payable, and current status.
Payout detail
Shows the full breakdown for a single event payout:
totalRevenue, deductions, netPayable, paymentMethod, status, and paidAt.Payout lifecycle
| Status | Meaning |
|---|---|
pending | Payout calculated, not yet initiated |
paid | Funds transferred to the organizer |
cancelled | Payout voided |
availableToOrg = true and sends you a receipt notification. Payment methods supported include UPI, Bank Transfer, and RazorpayX.
Payout fields
| Field | Type | Description |
|---|---|---|
totalRevenue | decimal | Gross ticket revenue for the event |
deductions | decimal | Platform charges deducted from revenue |
netPayable | decimal | Amount transferred to the organizer (totalRevenue - deductions) |
paymentMethod | string | "UPI", "Bank Transfer", or "RazorpayX" |
transactionReference | string | Reference number for the transfer |
paidAt | timestamp | When the payout was marked as paid |
allTicketsDetails | json | Full ticket sales breakdown for the event |
