---
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<List<TicketsSDKModule>> {
    val modules = ArrayList<TicketsSDKModule>()
    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).
