Cepte Perakende
An e-commerce app I built end to end, where we sold our own inventory at wholesale prices.
- iOS
- Android
- 2025
- My own product
Screenshots
Click any image to enlarge it.
About the app
Cepte Perakende was not a marketplace. It was an e-commerce app selling products we had found cheaply or could source ourselves at wholesale prices, where the entire inventory belonged to us. There were no third-party sellers; that removed the burden of seller management, but in exchange it made stock accuracy entirely our responsibility.
In an e-commerce app, the most painful mistake is selling a product you do not have. So stock was read from a single source everywhere — on the product card, in the cart and at the payment step; the user could see the current stock count even inside the cart. In the same place I also showed product popularity — how many people had favourited it, how many had added it to their cart — because the second most painful thing is a user who cannot tell whether the item they want is about to sell out.
The least talked about but most time-consuming part of the job was payments and regulation. Alongside single payment there were 3, 6, 9 and 12 installment options, and the total for each plan was calculated separately including interest. On top of that came the preliminary information form, the distance selling contract, the right of withdrawal and the return shipping flow, all required by Turkish Consumer Protection Law no. 6502 and the Distance Selling Regulation. It does not look flashy in a portfolio, but this layer is exactly what separates a real commerce app from a toy.
I also put separate effort into reducing pre-purchase questions: per-product FAQs, a user question-and-answer section, ratings and reviews, fast delivery and free shipping badges, and recommendations from the same category. Whatever question comes to mind before buying a product, the answer had to be findable without leaving the page.
To be honest, the commercial side of the product — sourcing, operations, marketing — never got where I wanted it. But the app itself stood up from end to end: from catalogue to cart, from installment payments to order tracking and returns, I built the entire shopping journey on my own. It was the most comprehensive flow I had written to date.
The app is not live today. The reason was not a technical problem or the app itself — I shifted my focus to other projects and running an e-commerce business at this scale at the same time was not possible. A product with inventory, sourcing and operations needs daily attention long after the code is finished. Cepte Perakende showed me that an app being technically ready and a business standing on its own feet are two completely different things.
Key features
- Own inventory: no third-party sellers — every product in the catalogue belongs to us
- Category tree: clothing, electronics, home, cosmetics, decoration, jewellery and gifts
- Live stock tracking: current stock count on the product card, the detail page and in the cart
- Product popularity: showing how many people favourited it or added it to their cart
- Product-specific FAQs and a user question-and-answer section
- Ratings and reviews — with average score and review count
- Badges: fast delivery, free shipping and best-seller labels
- Discounted price display — with the old price struck through
- Cart: quantity editing, shipping fee and total amount calculation
- Installment payments: single payment and 3, 6, 9, 12 installments — with interest already calculated
- Distance selling compliance: preliminary information form, sales contract and right of withdrawal
- Order tracking and returns flow: starting a return from the order detail, plus the shipping code
- Favourites, notifications and in-app messaging
Technologies used
103 technologies · 12 categoriesLanguages and Platform
- Swift
- Java
- Kotlin
- iOS SDK
- Android SDK
- Native development
UI and Application Layer
- UIKit / SwiftUI
- Android View / Compose
- UICollectionView (iOS)
- RecyclerView (Android)
- Auto Layout (iOS)
- ConstraintLayout (Android)
- Image caching
- Navigation flows
Backend and Data
- Firebase Firestore
- Firebase Storage
- Cloud Functions
- Firebase Authentication
- Firestore security rules
- NoSQL data modelling
- Querying and pagination
- Stock updates via transactions
- Firestore offline cache
- Batch writes
- Cursor-based pagination
- Denormalization
- Counter fields
- Cloud Functions triggers
- Scheduled jobs
- Data migration
Real Time and Notifications
- Firestore snapshot listeners
- Live stock synchronization
- In-app messaging
- Firebase Cloud Messaging
- APNs (iOS)
- Notification permissions
Payments and Revenue
- Virtual POS integration
- 3D Secure flow
- WKWebView / WebView (3DS)
- Installments and interest
- Server-side payment verification
- Order state management
Commerce and Regulation
- Distance selling contract
- Preliminary information form
- Right of withdrawal flow
- Consumer law no. 6502
- Returns process flow
- Shipment tracking code
Architecture and Patterns
- MVVM / MVC
- Kotlin Coroutines
- GCD / async-await
- URLSession (iOS)
- HTTP client (Android)
- UserDefaults / SharedPreferences
- Lifecycle management
Networking and Data Transfer
- JSON parsing (Codable)
- Retry and timeout handling
- Offline state management
- Download and upload queue
- Multipart file upload
- Bandwidth-based quality
Security and Privacy
- Keychain (iOS)
- EncryptedSharedPreferences (Android)
- HTTPS and ATS
- Authentication token management
- Session refresh
- Permission rationale copy
- Account deletion flow
- Server-side authorization checks
- Sensitive data masking
UI States and Accessibility
- Dark theme support
- Dynamic Type
- Safe area handling
- Empty / loading / error states
- Skeleton loading
- Pull to refresh
- Keyboard and focus management
- Deep linking (Universal Links)
- VoiceOver / TalkBack labels
Testing, Debugging and Profiling
- Xcode Instruments
- Android Profiler
- LLDB
- Logcat
- Memory leak tracking
- Network traffic inspection
- Crash report analysis
- Testing on real devices
- Testing across screen sizes
Tools and Release Process
- Xcode
- Android Studio
- App Store Connect
- Google Play Console
- CocoaPods
- Gradle
- Git
- TestFlight
- Play Console internal testing
- Version and build numbering
- Signing and provisioning profiles
- App Store review process
- App Privacy / Data Safety form
- Store assets and ASO copy
- App size optimization
Idea, design, UI, code, app store release and post-launch maintenance — I ran the entire process from start to finish on my own. No team, no agency, no outsourcing.
Development notes
- Languages and approachThe iOS side was written in Swift, the Android side in Java and Kotlin. No cross-platform framework was used; both apps were built with their own platform's native tooling. I have been doing mobile development since 2020.
- No AI assistanceAll of the code was written by hand. This project was built before AI coding tools like Claude Code and Codex became widespread — no such tool existed at the time.
- DependenciesMany open source GitHub libraries and CocoaPods packages were used. Dependency management was handled with CocoaPods on iOS and Gradle on Android.
- Regulatory complianceThe distance selling contract, preliminary information form, right of withdrawal and returns flow were designed according to Turkish Consumer Protection Law no. 6502 and the Distance Selling Regulation.
- Testing and debuggingTested on real devices, across different screen sizes and under poor network conditions. After launch I read the crash reports and shipped fixes release by release.
- Release processI handled the review process for both stores on my own: App Store Connect and Google Play Console setup, the privacy declaration (App Privacy / Data Safety), release notes, store assets and fixes based on rejection reasons.
- Product ownershipIdea, design, development, backend, app store release and post-launch maintenance — I ran the entire process on my own.
Let's talk about Cepte Perakende
I would be happy to walk you through the technical details, the problems I ran into and how I solved them.