Microsoft Dynamics 365 Business Central, özellikle Microsoft ekosistemine yatırım yapmış orta ölçekli şirketler için tercih edilen ERP’dir. WooCommerce ile entegre etmek, D365’in API manzarasını anlamayı ve senin ölçeğin ile karmaşıklığın için doğru entegrasyon kalıbını seçmeyi gerektirir. Açık konuşayım: bu tür entegrasyonlarda projeyi batıran şey neredeyse hiçbir zaman API’nin kendisi olmaz — yanlış kalıbı seçmek, yani basit bir işe fazla makine ya da ciddi bir işe kırılgan bir kurgu koymak olur. Aşağıda önce seçenekleri, sonra da ben olsam hangi durumda hangisini seçerdim, onu anlatıyorum.
D365 Business Central API Seçenekleri
OData/REST API’leri (Standart)
Business Central, OData v4 endpoint’leri aracılığıyla standart varlıkları sunar:
GET https://{tenant}.api.businesscentral.dynamics.com/v2.0/{environment}/api/v2.0/items
GET https://{tenant}.api.businesscentral.dynamics.com/v2.0/{environment}/api/v2.0/salesOrders
GET https://{tenant}.api.businesscentral.dynamics.com/v2.0/{environment}/api/v2.0/customers
Kimlik Doğrulama: Azure AD üzerinden OAuth 2.0. Azure Portal’da bir uygulama kaydet, Financials.ReadWrite.All izinlerini ver.
Özel API’ler (AL Uzantıları)
Karmaşık entegrasyonlar için, AL dili kullanarak Business Central’da özel API endpoint’leri oluştur:
page 50100 "WooCommerce Items API"
{
PageType = API;
APIPublisher = 'wpclan';
APIGroup = 'woocommerce';
APIVersion = 'v1.0';
EntityName = 'item';
EntitySetName = 'items';
SourceTable = Item;
// ... alan tanımları
}
Dataverse (Gelişmiş)
Değişiklik takibi ile çift yönlü senkronizasyon için, Business Central verileri Dataverse’e (eski adıyla Common Data Service) senkronize edebilir. Bu, webhook benzeri değişiklik bildirimleri sağlar.
Entegrasyon Kalıpları
Kalıp 1: Power Automate (Düşük Kodlu)
En uygun: Basit entegrasyonlar, günde < 100 sipariş
Microsoft Power Automate, HTTP bağlayıcıları aracılığıyla D365’i WooCommerce’e bağlayabilir:
Tetikleyici: WooCommerce siparişi oluşturulduğunda (HTTP webhook)
→ JSON Ayrıştır (sipariş verisi)
→ D365: Müşteri bul veya oluştur
→ D365: Satış siparişi oluştur
→ D365: Satır öğeleri ekle
→ WooCommerce: Sipariş meta'sını D365 referansıyla güncelle
Artıları: Kod yok, görsel iş akışı, yerleşik hata işleme
Eksileri: API çağrı sınırları (Performance planı gerekli), daha yavaş yürütme, sınırlı dönüşüm mantığı
Kalıp 2: Azure Functions + Service Bus (Bulut-Yerel)
En uygun: Orta-yüksek hacim, Microsoft-yığın ekipleri
WooCommerce Webhook → Azure Function → Service Bus Queue → Azure Function → D365 API
D365 Change Feed → Azure Function → Service Bus Queue → Azure Function → WooCommerce API
Azure Functions, API çağrılarını ve veri dönüşümünü işler. Service Bus, dead-letter desteği ile güvenilir mesaj kuyruğu sağlar.
Kalıp 3: Özel Node.js Middleware (Tam Kontrol)
En uygun: Karmaşık gereksinimler, özel iş mantığı
// D365 Business Central istemcisi
class D365Client {
constructor(tenantId, clientId, clientSecret, environment) {
this.baseUrl = https://api.businesscentral.dynamics.com/v2.0/${environment}/api/v2.0;
this.tokenUrl = https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token;
this.clientId = clientId;
this.clientSecret = clientSecret;
}
async getToken() {
const response = await fetch(this.tokenUrl, {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: new URLSearchParams({
grant_type: 'client_credentials',
client_id: this.clientId,
client_secret: this.clientSecret,
scope: 'https://api.businesscentral.dynamics.com/.default'
})
});
const data = await response.json();
return data.access_token;
}
async getItems() {
const token = await this.getToken();
const response = await fetch(${this.baseUrl}/items, {
headers: { 'Authorization': Bearer ${token} }
});
return response.json();
}
async createSalesOrder(orderData) {
const token = await this.getToken();
return fetch(${this.baseUrl}/salesOrders, {
method: 'POST',
headers: {
'Authorization': Bearer ${token},
'Content-Type': 'application/json'
},
body: JSON.stringify(orderData)
});
}
}
Veri Eşleme: D365 → WooCommerce
Öğeler’den Ürünlere
| D365 Alanı | WooCommerce | Notlar |
|---|---|---|
| number | sku | Eşleme için birincil anahtar |
| displayName | name | |
| unitPrice | regular_price | Fiyat listesinden |
| inventory | stock_quantity | Gerçek zamanlı kritik |
| itemCategoryCode | categories | Kodları WC kategori ID’lerine eşle |
| blocked | status | blocked=true → draft |
| gtin | meta: _gtin | Schema markup için |
Satış Siparişleri
| WooCommerce | D365 Satış Siparişi | Notlar |
|---|---|---|
| order.id | externalDocumentNumber | Çapraz referans |
| billing.email | customerNumber | E-posta ile eşleştir |
| line_items[].sku | salesOrderLines[].itemId | Öğe numarasıyla eşleştir |
| line_items[].quantity | salesOrderLines[].quantity | |
| line_items[].total | salesOrderLines[].unitPrice | İndirimler için yeniden hesapla |
| shipping_total | — | Ayrı satır veya navlun ücreti olarak ekle |
D365’in Sayfalandırmasını İşleme
Business Central API’leri maksimum 20.000 kayıt döner ve sayfalandırma için @odata.nextLink kullanır:
async function getAllItems(client) {
let items = [];
let url = ${client.baseUrl}/items?$top=1000;
while (url) {
const response = await client.authenticatedFetch(url);
const data = await response.json();
items = items.concat(data.value);
url = data['@odata.nextLink'] || null;
}
return items;
}
Envanter Senkronizasyon Stratejisi
D365 Business Central, envanteri lokasyon (depo) seviyesinde takip eder. Senkronizasyonun şu üç soruya karar vermeli:
- Tek bir WooCommerce stok sayısı için tüm lokasyonları toplamak?
- Belirli lokasyonları senkronize etmek (örn., sadece e-ticaret deposu)?
- Tampon stok rezerve etmek (aşırı satışı önlemek için gerçek stokun %90’ını göstermek)?
async function syncInventory() {
const d365Items = await d365.getItems();
const updates = d365Items.value
.filter(item => !item.blocked)
.map(item => ({
sku: item.number,
stock_quantity: Math.floor(item.inventory * 0.95), // %5 tampon
stock_status: item.inventory > 0 ? 'instock' : 'outofstock'
}));
// WooCommerce toplu güncelleme
for (let i = 0; i < updates.length; i += 100) {
await wooApi.post('products/batch', {
update: updates.slice(i, i + 100).map(u => ({
sku: u.sku, // ürün ID'si almak için SKU araması gerektirir
stock_quantity: u.stock_quantity,
stock_status: u.stock_status
}))
});
}
}
Yaygın D365 Entegrasyon Tuzakları
- OAuth token süre dolumu: Token’lerin 1 saat sonra süresi dolar. API çağrılarından önce her zaman yenile.
- Hız sınırlaması: Business Central, tenant başına dakikada 600 çağrı sınırına sahiptir. İsteklerini toplu hâlde gönder.
- Numara dizileri: D365 belge numaralarını otomatik oluşturur. Bunları manuel olarak ayarlamaya çalışma.
- Boyutlar: D365’in finansal boyutlarının (maliyet merkezi, departman) WooCommerce eşdeğeri yoktur. Bunları nasıl işleyeceğini baştan planla.
- Çoklu para birimi: D365 çoklu para birimini doğal olarak işler. WooCommerce çoklu para birimi için bir eklentiye ihtiyaç duyar. Döviz kurlarını dikkatli eşle.
Ben olsam hangi kalıbı seçerdim
Üç kalıbı önüne koydum; şimdi de dürüst tercihimi söyleyeyim, çünkü “duruma göre” cevabı kimseyi kurtarmaz. Günde yüzün altında sipariş alan, karmaşık dönüşüm mantığı olmayan bir mağaza için Power Automate’i seçerdim ve bundan utanmazdım — kod yazmadığın her satır, iki yıl sonra bakımını yapmadığın bir satırdır. Görsel iş akışı bir zayıflık değil; küçük hacimde tam da doğru araç.
Hacim orta-yükseğe çıktığında ve ekip zaten Azure içindeyse, Azure Functions + Service Bus kalıbına geçerdim. Buradaki asıl mesele hız değil, dayanıklılık: Service Bus’ın dead-letter kuyruğu, bir siparişin sessizce kaybolması ile üç gün sonra fark edilen bir muhasebe açığı arasındaki farktır. Özel Node.js middleware’i ise yalnızca gerçekten tuhaf iş kuralların — özel fiyatlandırma, çok depolu karmaşık tahsis, standart alanlara sığmayan dönüşümler — varsa açardım. Tam kontrol bedavaya gelmez; onu ancak sorun onu hak ettiğinde satın al.
Açık konuşayım: gördüğüm en pahalı hata, günde otuz sipariş alan bir mağazaya “ölçeklensin” diye özel middleware kurmak. O gün gelmeden yazdığın esneklik, o güne kadar sadece bakım yüküdür. Bugünkü hacmine göre seç, yarınki hayaline göre değil.
Sonuç
D365 Business Central + WooCommerce güçlü bir kombinasyondur. Power Automate basit, düşük hacimli entegrasyonlar için çalışır. Azure Functions güvenilirliğe ihtiyaç duyan Microsoft-yığın ekipleri için uygundur. Özel middleware karmaşık senaryolarda sana tam kontrol verir. Kalıp ne olursa olsun, temel şeyler aynıdır: verilerini dikkatli eşle, envanteri en yüksek öncelikli senkronizasyon olarak işle ve sağlam hata işlemeyi ilk günden kur. Hata işlemeyi sonraya bırakma; entegrasyonlarda “sonra” diye bir zaman hiç gelmez.
Last modified: Ağustos 2, 2026
United States / English
Slovensko / Slovenčina
Canada / Français
Türkiye / Türkçe