---
title: "How We Built The Deals Tab in Swift UI"
description: "Etsy’s App Updates team rebuilt the long-standing Updates tab as Deals, a destination for coupons and sales, while targeting an October launch ahead of Cyber Week 2023. The team chose Swift UI and Tuist to create a modular, preview-driven implementation rather than extend legacy Objective-C and server-driven layout code. The screen is assembled from typed API modules, parsed with Decodable, and rendered in a Swift UI List using reusable components such as buttons, headers, footers, and listing cards. To bridge incompatible legacy listing-card code, the module accepts a view builder from the UIKit hosting controller, allowing existing cards to be wrapped while newer cards could be implemented in Swift UI. After three months, Deals shipped ahead of deadline; new modules took one sprint or less, previews decoupled front-end work from API support, and the tab increased session conversion and app visits after its mid-October rollout."
---

# How We Built The Deals Tab in Swift UI

[Etsy](https://yomu.fyi/company/etsy) · Pierre Rodgers · Mar 5, 2024

**Type:** Problem & solution

## Summary

Etsy’s App Updates team rebuilt the long-standing Updates tab as Deals, a destination for coupons and sales, while targeting an October launch ahead of Cyber Week 2023. The team chose Swift UI and Tuist to create a modular, preview-driven implementation rather than extend legacy Objective-C and server-driven layout code. The screen is assembled from typed API modules, parsed with Decodable, and rendered in a Swift UI List using reusable components such as buttons, headers, footers, and listing cards. To bridge incompatible legacy listing-card code, the module accepts a view builder from the UIKit hosting controller, allowing existing cards to be wrapped while newer cards could be implemented in Swift UI. After three months, Deals shipped ahead of deadline; new modules took one sprint or less, previews decoupled front-end work from API support, and the tab increased session conversion and app visits after its mid-October rollout.

## Context

The Updates tab had accumulated multiple purposes, combining favorite-shop and listing updates with shopping journeys. Coupons for abandoned cart items were among its most acted-upon content, motivating a clearer Deals destination. The team also needed to ship before Cyber Week while avoiding scalability and performance issues associated with legacy Objective-C and server-driven layout code.

## Approach / What changed

The team built Deals as a Swift-based Tuist module using Swift UI, typed API module responses, Decodable parsing, reusable components, Swift UI previews, and a List for cell reuse. A view builder supplied by the UIKit hosting controller bridged legacy listing-card models and views into the new module, while allowing some cards to be implemented directly in Swift UI.

## Takeaways

- Moving the Deals work into a Swift-based Tuist module made Swift UI previews nearly instant and kept app recompilation fast when changes stayed within the framework.
- Typed module responses and Decodable parsing made module handling clearer, while reusable components supported additions such as optional footers without anonymous component-based models.
- A UIKit-provided listing-card view builder preserved access to legacy cards, preventing Swift UI implementation unknowns from blocking the deadline and later enabling partial migration to native Swift UI cards.

**Tags:** [Architecture](https://yomu.fyi/topic/architecture), [Swift](https://yomu.fyi/topic/swift), [Swift UI](https://yomu.fyi/topic/swift-ui), [Tuist](https://yomu.fyi/topic/tuist)

- Source: [Etsy](https://www.etsy.com/codeascraft/how-we-built-the-deals-tab-in-swift-ui)
- Source URL: https://www.etsy.com/codeascraft/how-we-built-the-deals-tab-in-swift-ui
- Ingested by Yomu: 2026-09-09T16:02:29.031Z

[Read original post](https://www.etsy.com/codeascraft/how-we-built-the-deals-tab-in-swift-ui)
