مفيش بيانات زيارات للشهر ده — اعمل مزامنة ميتا الأول.
تشخيص الأداء — ليه المنتج فشل؟
المعايير: تحويل ≥ 2% · تسليم ≥ 35% · CTR ≥ 1.5%
خط فيندور (أفلييت تاني)منفصل عن كزاميزا
تفصيل الحملات / المجموعات / الإعلانات
الاسم
المنتج
المصروف
الظهور
النقرات
CTR
CPC
مفيش بيانات للمستوى ده — غالباً لازم تحدّث سكربت جوجل لأحدث نسخة.
منحنى الأداء المالي اليومي (المصروف الإعلاني مقابل الأرباح)
توزيع حالات الطلبات
مرتجعات: 0
ملغي ومغلق: 0
مقارنة ربحية وأداء المنتجات
المنتج
الأوردرات
المُسلّم
نسبة التسليم
تحويل اللاند
عمولة المحفظة
في الشحن
عمولة الشحن
الإعلانات
الـ CPA
الربح الفعلي
الربح المتوقع
جاري تحميل البيانات...
أوردرات إيزي أوردر (تلقائي)
—
الأوردر
التاريخ
العميل
المصدر
الإجمالي
الحالة
المنتج
الربح الحقيقي حسب المنصة
—
المنتج
أوردرات
عمولة
إيراد Meta
مصروف Meta
صافي Meta
إيراد Google
مصروف Google
صافي Google
عضوي
غير معروف
الصافي الكلي
الإيراد هنا من الأوردرات المطابقة فعلياً بتصدير إيزي أوردر (موبايل + تاريخ).
الأوردرات غير المطابقة بتظهر في عمود غير معروف ومش بتتحسب في صافي أي منصة.
تفاصيل الأوردرات اللحظية
رقم الطلب
التاريخ
العميل
المحافظة
المحتوى والمقاس
الإجمالي
العمولة
حالة الشحن
المحفظة
جاري تحميل الأوردرات...
صفحة 1
تحديث الأوردرات
من لوحة كذا ميزا: تقاريري / ملخص طلباتي ← زرار تصدير ← Excel أو CSV.
استقبال الأوردرات الجديدة أوتوماتيك (Webhook)
الرابط اللي تحطه في إيزي أوردر:
/easy/webhook
جاري التحميل...
كل خط ليه ملفه ونسخه الاحتياطية في مجلد backups — استيراد فيندور مش بيلمس أوردرات كذا ميزا.
ربط منصات الإعلانات (Meta & Google)
المزامنة بتسحب المصروف الفعلي للشهر المختار في الفلاتر، وتوزّعه على المنتجات حسب ربط الحملات.
الشهر الحالي: -
المصادر الداخلة في الحساب:
تقدر تربط أكثر من حساب إعلاني. ضيف كل حساب بتوكنه (نفس التوكن شغال لو الحسابات تحت نفس Business).
لسه مفيش حسابات مربوطة.
دقيقة
إضافة حساب إعلاني
أو استورد تقرير CSV من Ads Manager (بدون توكن)
Ads Manager ← تصدير الجدول ← CSV، وفيه عمود "المبلغ الذي تم إنفاقه" + تقسيم "يومي"
خطوات الإعداد مرة واحدة:
1) من Google Ads: الأدوات → API Center → اطلب Developer Token (محتاج حساب مدير MCC).
2) من Google Cloud: فعّل Google Ads API، واعمل OAuth Client من نوع Desktop.
3) شغّل في الفولدر: python google_oauth_setup.py عشان يطلع Refresh Token تلقائياً.
أو استورد تقرير CSV من Google Ads (بدون توكن)
Google Ads ← التقارير ← تنزيل CSV، مع عمود التكلفة والتاريخ
لو اسم الحملة مش واضح، حدد المنتج يدوياً. التغيير بيتطبق على الإجماليات فوراً.
الحملة
المنصة
المصروف
المنتج
خط الشغل
لسه مفيش حملات متزامنة
المجموعات الإعلانية
المنتج هنا هو الأدق — معظم أسماء المجموعات فيها اسم المنتج فعلاً.
المجموعة
الحملة
المصروف
المنتج
خط الشغل
لسه مفيش مجموعات إعلانية — شغّل السكربت الجديد
تحديث تلقائي من Google Sheet (بدون Developer Token)
شغّل سكربت Google Ads مرة واحدة، وهو يكتب الصرف اليومي لكل حملة في الشيت،
واللوحة تسحبه تلقائياً كل 5 دقايق.
إعداد السكربت (خطوات + الكود)
اعمل Google Sheet جديد، وسمّي تاب الشيت spend (السكربت هيعمله لوحده لو مش موجود).
من رابط الشيت انسخ الـ ID (الجزء بين /d/ و /edit).
في Google Ads: الأدوات → الإجراءات المجمّعة → Scripts → سكربت جديد.
الصق الكود اللي تحت، وبدّل SHEET_ID بالـ ID بتاعك.
اضغط Authorize ثم Run، وبعدها من Schedule خليه كل ساعة.
شارك الشيت: مشاركة → أي شخص عنده الرابط → عارض.
افتح تاب spend وانسخ رابطه (اللي فيه #gid=) وحطه فوق — لو حطيت رابط الشيت الأساسي اللوحة هتقرأ التاب الأول.
function main() {
var SHEET_ID = 'PUT_YOUR_SHEET_ID_HERE';
var TAB = 'spend';
var report = AdsApp.report(
"SELECT campaign.id, campaign.name, ad_group.name, " +
"ad_group_ad.ad.id, ad_group_ad.ad.type, segments.date, " +
"metrics.cost_micros, metrics.impressions, metrics.clicks " +
"FROM ad_group_ad WHERE segments.date DURING LAST_30_DAYS"
);
var rows = report.rows();
var data = [['Day', 'Campaign ID', 'Campaign', 'Ad group', 'Ad ID', 'Ad type',
'Cost', 'Impressions', 'Clicks']];
while (rows.hasNext()) {
var r = rows.next();
data.push([
r['segments.date'],
r['campaign.id'],
r['campaign.name'],
r['ad_group.name'] || '(بدون مجموعة)',
r['ad_group_ad.ad.id'],
r['ad_group_ad.ad.type'],
(Number(r['metrics.cost_micros']) || 0) / 1000000,
Number(r['metrics.impressions']) || 0,
Number(r['metrics.clicks']) || 0
]);
}
var ss = SpreadsheetApp.openById(SHEET_ID);
var sh = ss.getSheetByName(TAB) || ss.insertSheet(TAB);
sh.clearContents();
sh.getRange(1, 1, data.length, data[0].length).setValues(data);
}