---
title: "Mikro ERP Stok Verilerini Google Sheets'ten Web Dashboard'a Taşımak"
description: "Mikro ERP stok verilerini Google Sheets'ten okuyarak web üzerinden takip edilebilir bir stok dashboard'u oluşturma rehberi. Supabase ve React ile adım..."
date: 2026-04-12
category: mikro-erp
tags: ["mikro-erp", "stok-yonetimi", "google-sheets", "supabase", "react", "dashboard", "csv-import"]
url: https://mikroerp.dev/blog/mikro-erp-stok-dashboard-csv-web/
---

## Stok Verisi Nerede?

Mikro ERP kullanan birçok firma aynı sorunu yaşar: stok bilgisi farklı yerlerde dağınık halde durur.

- **Depocu**: Google Sheets'e veya Excel'e sayım girer
- **Muhasebe**: Mikro'dan bakar, ama genelde güncel değildir
- **Satış ekibi**: Müşteriye "bakayım" deyip WhatsApp'tan sorar
- **Yönetici**: Haftalık Excel raporu bekler

Sonuç? Kimse gerçek stok durumunu bilmiyor. Yanlış stok bilgisiyle sipariş veriliyor, müşteriye olmayan ürün satılıyor.

**Çözüm**: Tüm stok verisini tek bir web sayfasında toplamak. Herkes telefonundan veya bilgisayarından anlık görsün.

## Nasıl Çalışıyor?

Genel akış şöyle:

```
Google Sheets (stok verileri)
    ↓ otomatik okuma
Node.js servisi (veriyi çeker, düzenler)
    ↓ Supabase'e yazar
Web Dashboard (herkes buradan bakar)
```

## 1. Google Sheets'ten Veri Okuma

Depocu stok sayımını Google Sheets'e giriyor diyelim. Bu veriyi web'den çekmek çok basit — Sheets'i CSV olarak dışa aktarabilirsiniz:

```typescript
import Papa from 'papaparse';

async function stokVerisiniOku(sheetsUrl: string) {
  // Google Sheets'in CSV export linki
  const csvUrl = sheetsUrl.replace(/\/edit.*$/, '/export?format=csv');
  
  const response = await fetch(csvUrl);
  const csvText = await response.text();
  
  // CSV'yi parse et — başlık satırını otomatik algılar
  const sonuc = Papa.parse(csvText, {
    header: true,
    skipEmptyLines: true,
  });
  
  return sonuc.data;
}
```

> **💡 İpucu**: Google Sheets URL'inizi "herkese açık — görüntüleyebilir" yapmanız yeterli. API key'e gerek yok.

## 2. Veritabanına Yazma

Okuduğumuz stok verilerini Supabase'e (PostgreSQL) toplu olarak yazıyoruz. Böylece web uygulaması bu veritabanından okuyacak:

```typescript
async function stoklariKaydet(stoklar) {
  // 500'er gruplar halinde kaydet (büyük verilerde performans için)
  const grupBoyutu = 500;
  
  for (let i = 0; i < stoklar.length; i += grupBoyutu) {
    const grup = stoklar.slice(i, i + grupBoyutu);
    
    await supabase
      .from('v3_stock')
      .upsert(grup, { onConflict: 'stok_kodu' });
    // upsert: varsa güncelle, yoksa ekle
  }
}
```

### Veritabanı Tablosu

```sql
CREATE TABLE v3_stock (
  id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  stok_kodu VARCHAR(50) UNIQUE NOT NULL,
  stok_adi VARCHAR(255) NOT NULL,
  miktar DECIMAL(18,4) DEFAULT 0,
  birim VARCHAR(20) DEFAULT 'ADET',
  depo VARCHAR(50),
  updated_at TIMESTAMPTZ DEFAULT NOW()
);
```

## 3. Dashboard'da Gösterme

React ile basit bir stok tablosu ve birkaç özet kart:

```
┌─────────────┐  ┌─────────────┐  ┌──────────────┐
│  1.245       │  │  23 ürün     │  │  8 ürün       │
│  toplam ürün │  │  kritik stok │  │  sıfır stok   │
└─────────────┘  └─────────────┘  └──────────────┘

┌──────────────────────────────────────────────┐
│ Stok Kodu  │ Ürün Adı         │ Miktar │ Birim│
│ SRM.001    │ Yer Seramiği 60x │ 250    │ M2   │
│ FYN.012    │ Metro Fayans     │ 0      │ M2   │ ← Kırmızı!
│ BYA.045    │ İç Cephe Boya    │ 12     │ KOVa │
└──────────────────────────────────────────────┘
```

Kritik stoklar ve sıfır stoklar kırmızıyla vurgulanır. Yönetici bir bakışta "hangi ürünler tükeniyor?" sorusunun cevabını alır.

## 4. Otomatik Güncelleme

Bu işlemi elle yapmak yerine, bir zamanlayıcı (cron job) ile otomatikleştirebilirsiniz:

```typescript
import cron from 'node-cron';

// Her 30 dakikada bir güncelle
cron.schedule('*/30 * * * *', async () => {
  const stoklar = await stokVerisiniOku(SHEETS_URL);
  await stoklariKaydet(stoklar);
  console.log(`${stoklar.length} ürün güncellendi`);
});
```

Artık depocu Sheets'e girdiği anda, 30 dakika içinde web dashboard güncellenmiş oluyor.

## Bu Şekilde Neyi Çözmüş Oluyorsunuz?

✅ Herkes aynı stok verisine bakıyor — tek kaynak  
✅ Telefon, tablet, bilgisayar — her yerden erişim  
✅ Kritik stoklar otomatik vurgulanıyor  
✅ Manuel rapor hazırlamaya gerek kalmıyor  

## Peki, Ölçek Büyüyünce?

Bu yapı tek bir Sheets dosyası ve tek bir depo için harika çalışır. Ama büyüdükçe karşılaşacağınız zorluklar var:

- 8 şubenin her birinin ayrı Sheets dosyası ve farklı kolon formatları
- Eski verilerin temizlenmesi (artık depoda olmayan ürünler)
- ABC analizi, emniyet stok hesaplaması, hareket hızı raporları
- 15.000+ ürünle performans optimizasyonu

Biz 8 şubeli, 15.000+ ürünlü yapımızda bu sorunların hepsini çözdük. İhtiyacınız olursa deneyimimizden faydalanabilirsiniz.

---

*Bu yazı [AstaFlow Case Study](/case-study) serisinin bir parçasıdır.*