E-ticaret sitende e-arşiv faturayı otomatikleştirmek
Sipariş geldiği anda faturanın kesilip müşteriye ulaşması için gereken adımlar: doğru belge türü, entegratör seçimi ve sipariş akışına bağlanma.
Bir e-ticaret sitesinde siparişler artmaya başladığında faturayı tek tek elle kesmek hızla bir darboğaza dönüşür. İyi haber şu: doğru kurulduğunda fatura, ödeme onaylandığı anda kendiliğinden kesilip müşterinin e-postasına gidebilir.
1. Hangi belgeyi kesmen gerektiğini netleştir
Kural basit: alıcı e-fatura mükellefiyse e-fatura, değilse e-arşiv fatura düzenlenir. Bireysel müşterilere yaptığın satışların neredeyse tamamı e-arşiv olur. Kurumsal müşteri vergi numarası girdiğinde ise önce mükellefiyet sorgusu yapılır.
2026 itibarıyla elektronik fatura genel kural hâline geldi. Hangi tarihten ve hangi tutardan itibaren zorunlu olduğun ise şirket türüne ve defter tipine göre değişiyor.
2. Bir özel entegratör seç
GİB'in ücretsiz e-Arşiv Portalı küçük hacimde iş görür ama otomasyon için bir API sunmaz. Siparişlerden otomatik fatura kesmek için bir özel entegratörün API'sine ihtiyacın var. Seçerken şunlara bak:
- Belgelenmiş bir REST API ve test (sandbox) ortamı
- E-fatura mükellef sorgusu yapabilmesi
- Fatura PDF'ini ve numarasını yanıt olarak dönmesi
- Kontör ya da belge başı fiyatlandırmanın hacmine uygun olması
3. Siparişten faturaya akışı kur
Akışın kendisi beş adımdan oluşur:
- Ödeme onaylandığında bir olay (event) tetiklenir.
- Müşteri vergi numarası girdiyse mükellefiyet sorgulanır.
- Sonuca göre e-fatura ya da e-arşiv isteği entegratöre gönderilir.
- Dönen fatura numarası ve PDF bağlantısı siparişe kaydedilir.
- Müşteriye faturalı sipariş onayı e-postası gider.
Medusa v2 kullanıyorsan bu akışı bir subscriber ile kurabilirsin:
// src/subscribers/order-invoice.ts (basitleştirilmiş örnek)
import type { SubscriberArgs, SubscriberConfig } from "@medusajs/framework"
import { Modules } from "@medusajs/framework/utils"
import { createInvoice } from "../lib/e-invoice" // entegratör istemcisi
export default async function orderInvoice({ event, container }: SubscriberArgs<{ id: string }>) {
const orders = container.resolve(Modules.ORDER)
const order = await orders.retrieveOrder(event.data.id, { relations: ["items", "billing_address"] })
const invoice = await createInvoice(order) // e-fatura mı e-arşiv mi, burada karar verilir
await orders.updateOrders(order.id, {
metadata: { ...order.metadata, invoice_no: invoice.number, invoice_pdf: invoice.pdfUrl },
})
}
export const config: SubscriberConfig = { event: "order.placed" }
4. Hataları ve iadeleri unutma
Entegratörün API'si anlık olarak yanıt vermeyebilir. Fatura isteklerini bir kuyruğa alıp başarısız olanları yeniden denemek, siparişlerin faturasız kalmasını önler. İade ve iptallerde de karşılık gelen belgenin otomatik oluşturulması için aynı akışa bir dal eklemen gerekir.
Sonuç
Doğru kurulduğunda fatura süreci operasyonunun görünmeyen bir parçası olur. Sen satışa odaklanırsın, faturalar arka planda kesilir.