--- title: "Prebuilt Modules" slug: "prebuilt-modules-2" updated: 2026-04-13T23:24:11Z published: 2026-04-13T23:24:11Z canonical: "ignite.ticketmaster.com/prebuilt-modules-2" --- > ## Documentation Index > Fetch the complete documentation index at: https://ignite.ticketmaster.com/llms.txt > Use this file to discover all available pages before exploring further. # Prebuilt Modules The Tickets SDK includes five prebuilt modules you can add to your event detail screen. Each module renders a standard UI component without requiring you to build it from scratch. This guide shows you how to add them, handle their callbacks and customize their appearance. --- ## Available modules ### Share Attendance Renders a social sharing banner ("I Got In") that displays a branded preview card event details, and a "YOU GOT TICKETS!" headline. Includes a "Share You're Going" button that opens a share screen where the user can share a branded image card to social media. **Requires:** Host or Microflex events. This module does not render for Archtics, TM1, or other event source types. ![](https://cdn.document360.io/995f0bfa-740b-4247-b341-fde1e5326a96/Images/Documentation/Screenshot 2026-04-13 at 4.21.15 PM.png) ![](https://cdn.document360.io/995f0bfa-740b-4247-b341-fde1e5326a96/Images/Documentation/Screenshot 2026-04-13 at 4.21.49 PM.png) --- ### More Ticket Actions Renders a "More Ticket Actions" button that opens the NAM Manage Tickets webpage. This module may surface options such as Donate depending on the event configuration. **Requires:** Archtics Season Tickets. This module does not render for Host or Single Game tickets. ![](https://cdn.document360.io/995f0bfa-740b-4247-b341-fde1e5326a96/Images/Documentation/moreticketactions1.png)![](https://cdn.document360.io/995f0bfa-740b-4247-b341-fde1e5326a96/Images/Documentation/moreticketactions2.png) --- ### Venue Directions Renders a non-interactive map with a "Get Directions" button. Tapping the button opens Apple Maps (iOS) or Google Maps (Android) with the venue as the destination. **Requires:** A venue street address in the Ticketmaster database. ![](https://cdn.document360.io/995f0bfa-740b-4247-b341-fde1e5326a96/Images/Documentation/venueDirections1.png) ![](https://cdn.document360.io/995f0bfa-740b-4247-b341-fde1e5326a96/Images/Documentation/Screenshot 2026-04-13 at 3.17.01 PM.png) --- ### Seat Upgrades Renders a generic seat image with an "Upgrade Options" button that opens the NAM Upgrade Tickets webpage. **Requires:** Archtics Season Tickets. ![](https://cdn.document360.io/995f0bfa-740b-4247-b341-fde1e5326a96/Images/Documentation/Screenshot 2026-04-13 at 3.31.49 PM(1).png) ![](https://cdn.document360.io/995f0bfa-740b-4247-b341-fde1e5326a96/Images/Documentation/Screenshot 2026-04-13 at 3.27.50 PM(1).png) --- ### Venue Concessions Renders a generic food image with "Order" and optional "Wallet" buttons. Tapping either button fires a callback into your app — the SDK does not provide a built-in concessions UI. You are responsible for presenting your own concessions experience. ![](https://cdn.document360.io/995f0bfa-740b-4247-b341-fde1e5326a96/Images/Documentation/Screenshot 2026-04-13 at 3.34.00 PM.png) --- ### Invoice Renders a "View Invoice" button that opens the NAM Invoice webpage. **Requires:** Archtics Season Tickets. ![](https://cdn.document360.io/995f0bfa-740b-4247-b341-fde1e5326a96/Images/Documentation/Screenshot 2026-04-13 at 3.35.49 PM.png) --- ## Add prebuilt modules #### Step 1: Set the module delegate **iOS** Assign `TMTicketsModuleDelegate` to the object that will supply and respond to modules. ```swift TMTickets.shared.moduleDelegate = myClass ``` **Android** Assign a `TicketsModuleDelegate` to the singleton before presenting the Tickets UI. ```kotlin TicketsSDKSingleton.moduleDelegate = object : TicketsModuleDelegate {    // implement required methods } ``` Your delegate class must conform to `TMTicketsModuleDelegate` and implement two methods: `addCustomModules` and `handleModuleActionButton`. #### Step 2: Supply modules for an event **iOS** Return the modules you want to display inside `addCustomModules`. The SDK calls this method once per event load. ```swift extension MyClass: TMTicketsModuleDelegate {    func addCustomModules(event: TMPurchasedEvent, completion: @escaping ([TMTicketsModule]?) -> Void) {        completion(prebuiltModules(for: event))    }    private func prebuiltModules(for event: TMPurchasedEvent) -> [TMTicketsModule] {        var modules: [TMTicketsModule] = []        if let module = TMTicketsPrebuiltModule.accountManagerMoreTicketActions(event: event) {            modules.append(module)        }        if let module = TMTicketsPrebuiltModule.accountManagerInvoiceAction(event: event) {            modules.append(module)        }        if let module = TMTicketsPrebuiltModule.venueDirectionsViaAppleMaps(event: event) {            modules.append(module)        }        if let module = TMTicketsPrebuiltModule.accountManagerSeatUpgrades(event: event) {            modules.append(module)        }        if let module = TMTicketsPrebuiltModule.venueConcessions(event: event, showWalletButton: true) {            modules.append(module)        }        return modules    } } ``` Each factory method returns `nil` when the module's requirements are not met (for example, `accountManagerMoreTicketActions` returns `nil` for non-Archtics events). The module simply won't appear. **Android** Return your modules from `getCustomModulesLiveData`. The SDK observes this `LiveData` and renders the list on update. ```kotlin override fun getCustomModulesLiveData(order: Order): LiveData> {    val modules = ArrayList()    modules.add(MoreTicketActionsModule(order.eventId))    modules.add(        DirectionsModule(activity, latitude = order.latitude, longitude = order.longitude).build()    )    val eventSource = order.tickets.firstOrNull()?.source    if (eventSource != null) {        modules.add(            SeatUpgradesModule(                activity,                NAMWebPageSettings(activity, eventSource),                order.eventId            )        )    }    val venueNextModule = VenueNextModule.Builder(order.venueId).build()    modules.add(venueNextModule.createVenueNextView(context) { click ->        // Handle VenueNext tap events here    })    modules.add(InvoiceModule())    return MutableLiveData(modules) } ``` #### Step 3: Handle callbacks **iOS** Venue Concessions fires callbacks instead of opening a webpage. Implement `handleModuleActionButton` to respond. ```swift extension MyClass: TMTicketsModuleDelegate {    func handleModuleActionButton(        event: TMPurchasedEvent,        module: TMTicketsModule,        button: TMTicketsModule.ActionButton,        completion: @escaping (TMTicketsModule.WebpageSettings?) -> Void    ) {        guard module.identifier == TMTicketsPrebuiltModule.ModuleName.venueConcessions.rawValue else {            return        }        switch button.callbackValue {        case TMTicketsPrebuiltModule.ButtonCallbackName.order.rawValue:            completion(nil)            // Present your concessions Order UI        case TMTicketsPrebuiltModule.ButtonCallbackName.wallet.rawValue:            completion(nil)            // Present your concessions Wallet UI        default:            break        }    } } ``` Call `completion(nil)` to dismiss any SDK-managed loading state before you present your own UI. Pass a `WebpageSettings` value instead if you want the SDK to open a webpage. **Android** Implement `userDidPressActionButton` on your delegate to respond to module button taps. ```kotlin override fun userDidPressActionButton(    buttonTitle: String?,    callbackValue: String?,    eventOrders: EventOrders? ) {    // Inspect callbackValue to determine which button was tapped    // and present the appropriate UI } ``` --- ## Customize module headers You can override the default header image and label text for Seat Upgrades and Venue Concessions. ![Default prebuilt module header](https://cdn.document360.io/995f0bfa-740b-4247-b341-fde1e5326a96/Images/Documentation/DefaultPrebuiltModules.jpg) ![Custom override header](https://cdn.document360.io/995f0bfa-740b-4247-b341-fde1e5326a96/Images/Documentation/OverridePrebuiltModules.jpg) **iOS** Pass a `HeaderOverride` when constructing a prebuilt module. You can set label text, text alignment and a custom background image. ```swift // Custom Seat Upgrades header let seatUpgradesHeader = TMTicketsPrebuiltModule.HeaderOverride(    topLabelText: "Get Great Seats!",    topLabelTextAlignment: .left,    gradientAlpha: 1.0,    backgroundImage: .daytonaSeats ) if let module = TMTicketsPrebuiltModule.accountManagerSeatUpgrades(    event: event,    headerOverride: seatUpgradesHeader ) {    modules.append(module) } // Custom Venue Concessions header let concessionsHeader = TMTicketsPrebuiltModule.HeaderOverride(    bottomLabelText: "Bring the Lobby to you!",    gradientAlpha: 1.0,    backgroundImage: .lobby ) if let module = TMTicketsPrebuiltModule.venueConcessions(    event: event,    headerOverride: concessionsHeader,    showWalletButton: true ) {    modules.append(module) } ``` **Android** Call `setHeader` on any module that supports it before adding it to your list. Three overloads are available: ```kotlin // Pass a pre-built View module.setHeader(view: View) // Inflate from a layout resource module.setHeader(@LayoutRes xml: Int) // Pass an ImageView directly module.setHeader(imageView: ImageView) ``` --- ## Module analytics For analytics events fired when users interact with modules, see [Analytics documentation](/v1/docs/analytics-4#overview).