Ticket building logic separated