Shopify Subscriptions üzerine inşa edilmiş özel billing engine. Plan değişikliklerinde
prorated hesap, başarısız ödemelerde smart dunning, 8 para biriminde abonelik yönetimi ve Twilio SMS
bildirimi.
Uluslararası bir SaaS ürünü, Shopify mağazası üzerinden abonelik satıyordu. Shopify'ın native
subscription desteği plan geçişleri, prorate hesabı ve dunning senaryolarını yönetmek için yetersiz
kalıyordu. Shopify'ın üzerine tam özellikli bir billing engine inşa ettik; Shopify hem ödeme kapısı hem
de ürün kataloğu olarak kaldı.
2) İş Hedefleri
Hedefler
Plan upgrade/downgrade'de adil prorate hesabı
Başarısız ödemelerde akıllı retry ile revenue recovery
8 para biriminde abonelik döngüsü yönetimi
Müşteriye otomatik bildirim (email + SMS)
Başarı Kriterleri
Plan geçişinde müşteri fazla veya eksik ücretlendirilmemeli
Başarısız ödeme → otomatik retry → müşteri kaybedilmesin
Shopify webhook'ları idempotent işlenmeli, duplicate işlem sıfır
Tüm billing hareketleri audit log'da geri izlenebilir
3) Mimari
Shopify Katmanı
Ürün/fiyat kataloğu, native ödeme ve checkout deneyimi. Özelleştirmemiz yok, sadece
API kullanımı.
Billing Engine
Plan lifecycle yönetimi, prorate hesabı, dunning koordinasyonu, state machine.
Redis erişilemez olduğunda hiçbir faturalama veya abonelik
işlemi durmaz.
Idempotency fallback: Redis miss → DB idempotency_keys tablosu,
UNIQUE(key) constraint. İki eşzamanlı webhook gelirse biri
UniqueConstraintError alır, retry cached sonucu döner.
Plan geçiş kilidi fallback: Redis SET NX başarısız → PostgreSQL
SELECT FOR UPDATE. Performans düşer, concurrent double-charge imkânsız kalır.
Subscription cache: Redis miss → DB'den okuma; ~20ms ek gecikme, kullanıcı fark
etmez.
BullMQ persistent mode: Redis cluster down → BullMQ, DB-backed fallback queue'a
geçer. Dunning zamanlaması gecikmeli ama kayıpsız devam eder.
Rate limit soft-disable: Redis down → rate limiting geçici devre dışı,
WARN: rate_limit_degraded log, PagerDuty P3 alert. Servis kesilmez.
Prorate kesinlik: Tüm hesaplar decimal.js ile yapıldı, Redis'e
bağımlı değil. Redis down hiçbir şekilde hesap hassasiyetini etkilemez.
16) Billing Platform Production Proof
Bu sistem production'da çalıştırılmış, aşağıdaki maddeler
gözlemlenmiş veya test edilmiş davranışlardır.
Idempotency Yaklaşımı
Her Shopify webhook event ID normalize edilip Redis'e yazılır
Redis SET NX EX 86400 — ilk yazma atomik
Duplicate gelirse process atlanır, HTTP 200 döner
Redis down → DB UNIQUE constraint, race condition yok
8.200 abonelik faturasında sıfır duplicate charge
Prorate Güvenilirliği
Tüm hesaplar decimal.js ile kuruşa kadar doğru
Plan değişikliği anında server-side hesaplanır
Müşteriden gelen tutar hiçbir zaman kabul edilmez
Concurrent plan değişikliği → distributed lock korur
Devreye girdiğinden bu yana prorate şikâyeti: 0
Dunning Davranışı
State machine deterministik — izinsiz geçiş imkânsız
4 aşamalı retry: 0 / 3 / 5 / 7. gün
Her retry BullMQ delayed job, idempotent çalışır
Başarısız ödemelerin %38'i dunning ile kurtarıldı
Her geçiş audit log'a: önceki state, yeni state, timestamp
SLA & Devir
P1 (tüm ödemeler durdu): <1 saat müdahale, Shopify native fallback
P2 (dunning çalışmıyor, SMS gelmiyor): <4 saat
Tüm runbook'lar Notion'da, bağımsız okunabilir
Infrastructure as Code (Terraform), ortam yeniden kurulabilir
Testler: kritik billing yolları %100 coverage
17) Architecture Topology Overview
Trafik soldan sağa katmanlar üzerinden akar. Shopify hem ödeme
kapısı hem ürün kataloğu olarak kalır.
Shopify
Checkout + ödeme Ürün
kataloğu HMAC webhook gönderir
→
API Pods ×2
Node.js stateless JWT
auth Webhook doğrulama
→
Billing Engine
State machine Prorate
hesabı Dunning koordinasyonu
Bu projeye ait kaynak kodlar, müşteri ile imzalanan gizlilik
sözleşmesi (NDA) kapsamında paylaşılamamaktadır. Teknik yapı, mimari kararlar ve
implementasyon detayları hakkında sorularınızı doğrudan iletebilirsiniz; müsait olanı kapsamında
yanıtlayırız.