Bölgesel Fiyatlandırma (PPP - Matrix)
Cloudflare request.cf ile ülke tespiti, Tier 1–Tier 50 mantığı, tier_prices ve pricing-engine.ts.
Coursio, öğrencinin bulunduğu ülkeye göre dinamik fiyatlandırma yapar. Bu sayfa, Cloudflare request.cf verisiyle ülke tespiti, Tier 1 – Tier 50 mantığı, tier_prices tablosunun işleyişi ve pricing-engine.ts içindeki para birimi çevrim mantığını açıklar.
Cloudflare request.cf ile Ülke Tespiti
Section titled “Cloudflare request.cf ile Ülke Tespiti”Edge’de gelen isteğin ülke kodu, Cloudflare tarafından sağlanır:
- Production (Cloudflare Workers):
request.cf.country— ISO 3166-1 alpha-2 (örn.TR,US,DE). - Context üzerinden: React Router Cloudflare adapter’da
context.cloudflare?.request?.cf?.countrykullanılır.
app/lib/pricing.ts — getCountryFromRequest
Section titled “app/lib/pricing.ts — getCountryFromRequest”export function getCountryFromRequest(request, env?, context?): string { // Öncelik: URL ?country= → env DEV_COUNTRY → context.cloudflare.request.cf.country → "US" const cfCountry = context?.cloudflare?.request?.cf?.country ?? request?.cf?.country; return cfCountry ?? "US";}- Yerel test:
?country=TRveyaDEV_COUNTRY=TRile ülke taklidi. - Varsayılan: Ülke bilinmiyorsa
USkullanılır.
Tier 1 – Tier 50 Mantığı ve tier_prices Tablosu
Section titled “Tier 1 – Tier 50 Mantığı ve tier_prices Tablosu”Fiyat Katmanları (Price Tiers)
Section titled “Fiyat Katmanları (Price Tiers)”- Her kurs veya paket tek bir fiyat katmanına bağlıdır:
courses.price_tier_id/course_bundles.price_tier_id. - Katmanlar Tier 1, Tier 2, … Tier 50 gibi isimlendirilebilir; veritabanında
price_tierstablosu ile yönetilir.
tier_prices Tablosu
Section titled “tier_prices Tablosu”tier_prices tablosu, katman + para birimi bazında sabit fiyat tutar:
| Alan | Açıklama |
|---|---|
tier_id | Hangi fiyat katmanı (FK → price_tiers) |
currency | Para birimi: usd, try, eur, gbp, aud vb. |
amount | Fiyat (decimal; örn. 19.99, 499.00) |
İşleyiş:
- Kullanıcı konumu →
request.cf.country(örn.TR). - Ülke kodu → para birimi:
TR→try,US→usd,DE→eur(aşağıdaCURRENCY_MAP). - Kursun
price_tier_id+ para birimi iletier_pricestablosundan tek satır çekilir. - Eşleşme yoksa USD fiyatı fallback olarak kullanılır.
pricing-engine.ts — Para Birimi Çevrim Mantığı
Section titled “pricing-engine.ts — Para Birimi Çevrim Mantığı”Dosya: app/lib/pricing-engine.ts
Section titled “Dosya: app/lib/pricing-engine.ts”Ülke → para birimi eşlemesi (CURRENCY_MAP):
export const CURRENCY_MAP: Record<string, string> = { TR: "try", DE: "eur", FR: "eur", US: "usd", GB: "gbp", CA: "usd", AU: "aud", JP: "jpy", KR: "krw", CN: "cny", IN: "inr", BR: "brl", MX: "mxn", ...};Ana fonksiyonlar:
-
getRegionalPrice(db, priceTierId, countryCode)
Ülke kodunu büyük harfe normalize eder,CURRENCY_MAPile currency’ye çevirir;tier_pricestablosundantier_id+currencyile fiyat satırını arar. Bulunamazsa aynı tier içinusdsatırına düşer; o da yoksa varsayılan{ amount: "0.00", currency: "usd" }döner. -
getRegionalPriceFromRequest(db, priceTierId, request)
request.cf.country(veya context üzerinden cf) ile ülke kodunu alır;getRegionalPriceçağırır.
Para birimi çevrimi: Sistem döviz kuru çevrimi yapmaz; her tier için her para biriminde ayrı sabit fiyat tanımlanır. Böylece PPP (satın alma gücü) ve yerel fiyatlandırma manuel kontrol edilir.
Kullanım Örneği (Route’larda)
Section titled “Kullanım Örneği (Route’larda)”import { getCountryFromRequest } from "~/lib/pricing";import { getRegionalPriceFromRequest } from "~/lib/pricing-engine";
// Loader içindeconst countryCode = getCountryFromRequest(request, env, context?.cloudflare);const { amount, currency } = await getRegionalPriceFromRequest(db, course.price_tier_id, request);Sepet, checkout ve liste sayfalarında fiyat gösterimi bu amount ve currency ile yapılır. Sembol için app/lib/pricing.ts içindeki getCurrencySymbol(currency) kullanılır.
| Adım | Açıklama |
|---|---|
| 1 | Cloudflare request.cf.country (veya context) ile ülke kodu alınır. |
| 2 | CURRENCY_MAP ile ülke → para birimi (try, usd, eur vb.) belirlenir. |
| 3 | Kurs/paketin price_tier_id + bu currency ile tier_prices sorgulanır. |
| 4 | Sonuç yoksa aynı tier için usd satırı, o da yoksa varsayılan fiyat kullanılır. |
Detaylı tablo yapısı için Veritabanı Şeması ve kısa özet için Bölgesel Fiyat Matrix sayfalarına bakın.
İlgili Dosyalar
Section titled “İlgili Dosyalar”app/lib/pricing-engine.ts— Bölgesel fiyat hesaplama; getCountryFromRequest, getRegionalPriceFromRequest.app/lib/pricing.ts— getCountryFromRequest, para birimi ve tier_prices yardımcıları.app/routes/payment.checkout.tsx— Checkout’ta bölgesel fiyat kullanımı.app/db/schema.ts— price_tiers, tier_prices tabloları.