العودة للأعمال

DataLook — تحليلات أحداث النجاح لمؤسسي SaaS

تحليلاتك تعدّ الزيارات. وDataLook يعدّ العملاء — منتج تحليلات يقدّم الخصوصية أولًا، مبني حول حدث النجاح الذي يهم المؤسس فعلًا.

Full-StackFrontendBackendDevOpsAI
العميل
DataLook
الدور
مهندس مؤسس ومعماري المنتج
المجال
SaaS · تحليلات · أدوات المطورين
المدة
٤ أشهر · مايو–سبتمبر ٢٠٢٦
الخدمات
تصميم المنتج وبنية النظام · تطوير متكامل (Full-Stack) · هندسة خطوط أنابيب البيانات · تصميم حزمة التتبع وضبط ميزانية الأداء · الهوية ونظام التصميم · التوطين ودعم الاتجاه من اليمين إلى اليسار · البنية التحتية والنشر
الأدوات
Next.js 16 (App Router) · TypeScript · Tailwind CSS 4 · shadcn/ui · @visx (hand-built charts) · PostgreSQL 18 (application data) · ClickHouse 24.10 (events, hot/cold tiering) · Redis Streams (ingest queue + rate limiting) · Better-Auth (magic link + password) · Lemon Squeezy (billing) · Google Gemini 2.5 Flash (AI assistant) · fumadocs + MDX (product docs) · Resend (transactional email) · Atlas (schema migrations) · esbuild (SDK bundling) · AWS EC2 · nginx · pm2 · Cloudflare (CDN, DNS, TLS)
DataLook landing page — count customers, not clicks
٣٫٥ ك.بسقف صارم لحجم حزمة التتبع المضغوطة، مفروض في التكامل المستمر
٣قواعد بيانات — Postgres وClickHouse وRedis على خادم واحد
١١٠ ألفسطر TypeScript موزعة على ١٣٥٧ ملفًا
٦٣معالج مسار خلف ٣٩ شاشة تطبيق
٢٥إطار عمل موثّق لتركيب الوسيط من الطرف الأول
٥$سعر البداية — أربع فئات ثابتة، مصممة للمؤسس الفرد
زيارة الموقع

DataLook منتج تحليلات يحترم الخصوصية، موجّه لفرق SaaS الصغيرة، ومبني على فكرة واحدة: وحدة القيمة هي حدث النجاح الذي يعرّفه العميل — تسجيل أو شراء أو حجز أو تفعيل — لا مشاهدة الصفحة.

تُحسن Plausible وFathom عدّ الزيارات لكنها تعامل كل زيارة على أنها متساوية تقريبًا. وتستطيع Mixpanel وAmplitude نمذجة النجاح فعلًا، لكن سعرها وشكلها موجّهان لفرق منتج لديها محلل بيانات. ويستهدف DataLook هذه الفجوة: أربع فئات ثابتة من ٥ إلى ٩٩ دولارًا شهريًا، وتركيب يستغرق أقل من عشر دقائق، وسؤال أول ليس «أي المقاييس تريد؟» بل «كيف يبدو النجاح لمنتجك؟»

وهو يعمل في الإنتاج على datalook.app — تطبيق Next.js 16 مع خط أنابيب أحداث على ClickHouse، وحزمة تتبع تحت سقف صارم قدره ٣٫٥ كيلوبايت، وبوابة إدارة كاملة بالصلاحيات، واشتراكات ذاتية، وواجهة بالإنجليزية والعربية والفرنسية.

أبرز المزايا

  • أحداث النجاح كوحدة للقيمة — عرّف معنى التحويل عبر نمط رابط أو نقرة زر أو استدعاء واحد لـ `analytics.success()`، دون أي شيفرة في أول طريقتين
  • تركيب بسطر واحد مع تتبع تلقائي لمشاهدات الصفحات والجلسات ومصادر الزيارة والجهاز والدولة ووسوم UTM
  • حزمة تتبع محكومة بسقف صارم قدره ٣٫٥ كيلوبايت مضغوطة، يفرضه فحص في التكامل المستمر يُفشل البناء عند تجاوزه
  • وسيط من الطرف الأول ليصمد السكربت أمام حاجبات الإعلانات — عبر CNAME أو إعادة كتابة المسارات، موثّق لـ ٢٥ إطار عمل
  • مسارات تحويل وأفواج بقاء ومقاطع محفوظة قابلة لإعادة الاستخدام
  • عرض لحظي مع كرة أرضية ثلاثية الأبعاد للزوار
  • مساعد ذكي بـ Gemini يجيب عن أسئلة بلغة طبيعية حول بياناتك، مع تنقية البيانات الشخصية قبل مغادرة الطلب للخادم
  • تهيئة أولى بطابع اللعب — سجل مهام غير خطي يوصل المؤسس إلى أول رؤية في أقل من عشر دقائق
  • بوابة إدارة بصلاحيات متعددة الأدوار تغطي المستخدمين والأدوار والاشتراكات والمالية والعملاء والتدقيق وصحة النظام والإشعارات
  • اشتراكات ذاتية عبر Lemon Squeezy — دفع وويب هوكس وفواتير وتغيير الخطط عبر أربع فئات
  • الخصوصية افتراضيًا: بلا كوكيز، وعناوين IP مجهّلة، وبلا بصمة جهاز، مع تصدير وحذف متوافقين مع GDPR
  • واجهة بثلاث لغات — الإنجليزية والعربية (من اليمين لليسار) والفرنسية

الفرضية

تجيب معظم أدوات التحليلات عن سؤال «كم شخصًا جاء؟» بينما سؤال المؤسس الحقيقي هو «هل حدث شيء جيد، وما سببه؟» وهذان منتجان مختلفان. يجعل DataLook العميل يسمّي حدث نجاحه أثناء التهيئة ثم يقدّم تقاريره وفق ذلك التعريف، فتفتح اللوحة على الرقم الذي يهم المؤسس بدل جدول مشاهدات عليه تفسيره.

ويمكن تعريف حدث النجاح بثلاث طرق، اثنتان منها بلا شيفرة إطلاقًا: بنمط الرابط (زيارة `/welcome` تُحتسب تسجيلًا)، أو بنقرة زر (وسم عنصر بـ `data-track` وربطه في اللوحة)، أو باستدعاء صريح لـ `analytics.success()` لمسارات الخادم.

خط أنابيب الأحداث

مسار الحدث قصير عمدًا، ومفصول عند نقطة واحدة بالضبط:

  • تجمّع الحزمة الأحداث وترسلها عبر `navigator.sendBeacon` مع بديل `fetch({keepalive:true})`
  • تتحقق `/collect` وتكتب في Redis Stream — فلا تنتظر النقطة قاعدة بيانات التحليلات أبدًا
  • يفرّغ مستهلك يعمل تحت pm2 المجرى ويُدرج دفعات في ClickHouse
  • تحافظ العروض المادية والتدرّج الساخن/البارد على سرعة استعلامات اللوحة مع نمو الجدول
  • تقرأ `/api/stats` التجميعات، وتعرضها اللوحة على رسوم visx مبنية يدويًا

وRedis Streams هي الخيار الحامل هنا. فبدونها تتحول عثرة في ClickHouse إلى إشارة ضائعة على موقع شخص آخر، ولا يعلم العميل أنه فقد بيانات — فالفشل صامت بطبيعته، وهو تحديدًا نوع الفشل الجدير بأن يُصمَّم بعيدًا.

قاعدتا بيانات، عن قصد

تحتفظ Postgres 18 بالمستخدمين والمواقع والأدوار والاشتراكات وقواعد النجاح — بيانات علائقية تريد معاملات ومفاتيح أجنبية. وتحتفظ ClickHouse 24.10 بالأحداث، وهي إضافية فقط ومتعددة المستأجرين وتُستعلم كسلاسل زمنية عبر الأفواج. وكانت Postgres وحدها ستكفي أحجام الإصدار الأول بارتياح، فهذا رهان لا ضرورة: الميزة المميزة المخططة مقارنة أفواج — ما الذي فعله المحوَّلون بشكل مختلف؟ — وهو شكل استعلام بُنيت ClickHouse له. والتقاط الأحداث فيها منذ اليوم الأول يحوّل ترحيلًا مستقبليًا تحت ضغط الإنتاج إلى فرع ميزة.

الإطلاق على خادم واحد

الإنتاج خادم EC2 واحد خلف Cloudflare. ينهي nginx التشفير؛ ويعمل Next.js ومستهلك الأحداث تحت pm2؛ وتجلس Postgres وRedis وClickHouse إلى جانبهم. ولا شيء داخل حاويات في الإنتاج — فـ Docker Compose موجود للتطوير المحلي فقط. والنشر أمر واحد على الخادم: سحب، تثبيت، ترحيل Postgres، ترحيل ClickHouse، بناء، إعادة تحميل.

ولبانيَين بدوام جزئي يأخذان منتجًا إلى إطلاق تجريبي صغير مختار، كان تشغيل أربع خدمات مُدارة سيعني أربع لوحات وأربع فواتير وأربعة أنماط فشل قبل خدمة أول عميل. المقايضة صريحة وموثّقة: سرعة الآن، ومشكلة تعدد المناطق معروفة لاحقًا.

التصميم بوصفه تموضعًا

كل منافس في هذه الفئة يبدو متشابهًا — أزرق مخضر ونيلي على رمادي مزرق. ويغادر DataLook هذا النطاق عمدًا: مساحة كريمية دافئة، وذهبي عسلي عميق كلون الإشارة الوحيد، وكوبالت محجوز وزنًا باردًا داخل الرسوم. والرموز اللونية محددة بنظام OKLCH مع تسجيل نسب التباين المقاسة مقابل كل منها، فلا يكلّف الدفء وضوح القراءة، والرسوم مبنية يدويًا على visx تحديدًا لترث اللوحة بدل مصارعة إعدادات مكتبة.

والانضباط نفسه يحكم عناصر اللعب. التهيئة الأولى سجل مهام غير خطي مع احتفال عند الإتمام، لأن الوصول إلى أول رؤية يستحق أن يبدو كفوز — لكن هذه الآلية تتوقف عند حدود التهيئة ولا تتسرب إلى الأسطح اليومية.

أين يقف الآن

يعمل DataLook في الإنتاج بخط الأنابيب موصولًا من طرف لطرف، واشتراكات ذاتية على Lemon Squeezy، ومساعد بـ Gemini ينقّي البيانات الشخصية قبل مغادرة أي طلب للخادم، وبوابة إدارة بالصلاحيات تغطي المستخدمين والأدوار والاشتراكات والمالية والعملاء والتدقيق وصحة النظام. نحو ١١٠ آلاف سطر TypeScript عبر ١٣٥٧ ملفًا، و٣٩ شاشة، و٦٣ معالج مسار، و٢٢٩ مكوّنًا — مع التعامل مع اللاأهداف الصريحة (بلا إعادة تشغيل جلسات، بلا خرائط حرارية، بلا اختبار A/B) كجزء من المنتج لا كنقص فيه.

التحديات والحلول

التحدي

سكربت التحليلات ضريبة يدفعها كل زائر لموقع العميل. إن شحنت سكربتًا ثقيلًا تكون قد أبطأت منتج عميلك مقابل إخباره بمدى بطئه — وهو أسرع طريق ليقتلع المؤسس وسمك من موقعه.

الحل

كُتبت الحزمة بـ TypeScript وتُجمَّع عبر esbuild في دالة واحدة بسقف صارم قدره ٣٫٥ كيلوبايت مضغوطة، يؤكده فحص يعمل قبل كل دفعة ويُفشل البناء عند تجاوزه. ويستخدم النقل `navigator.sendBeacon` مع بديل `fetch({keepalive:true})`، فتنجو الأحداث عند مغادرة الصفحة دون تعطيل التنقل. السقف قيد وقت بناء لا نية حسنة، وهي الطريقة الوحيدة ليصمد حد الحجم أمام سنة من الميزات.

التحدي

تحجب إضافات الخصوصية وحاجبات الإعلانات سكربتات التحليلات حسب النطاق. ولمنتج قيمته كلها في عدّ التحويلات بدقة، فقدان ثلث البيانات بصمت أسوأ من فقدانها كلها — إذ لا تعلم أن ذلك حدث.

الحل

يقدّم DataLook خدمته عبر وسيط من الطرف الأول: السكربت ونقطة التجميع متاحان على نطاق العميل نفسه، إما بسجل CNAME أو بإعادة كتابة في إعدادات إطار عمله. وقد كتبت هذا المسار واختبرته لـ ٢٥ بيئة مختلفة ليصير التركيب نسخًا ولصقًا لا تذكرة دعم، وتخزّن Cloudflare الحزمة على الحافة فلا تكلّف القفزة الإضافية شيئًا.

التحدي

لاستقبال الأحداث وقراءات التطبيق شكلان متعاكسان. أحداث النجاح كثيفة الحجم، إضافية فقط، متعددة المستأجرين، وتُستعلم كسلاسل زمنية عبر الأفواج؛ بينما المستخدمون والمواقع والأدوار والاشتراكات بيانات علائقية قليلة الحجم تحتاج معاملات ومفاتيح أجنبية. وقاعدة واحدة تخدمهما تُحسن أحدهما وتسيء للآخر.

الحل

فصلتهما: تحتفظ Postgres 18 ببيانات التطبيق، وتحتفظ ClickHouse 24.10 بالأحداث مع تدرّج ساخن/بارد وعروض مادية، وتجلس Redis Streams بين المجمّع والمستهلك فلا تُسقط كتابةٌ بطيئة أي إشارة ولا ترتد الضغوط إلى نقطة HTTP. كانت Postgres ستكفي عند أحجام الإصدار الأول، لكن الميزة المخططة — مقارنة ما فعله المحوَّلون بشكل مختلف — استعلام أفواج بُنيت ClickHouse له، والتقاط الأحداث فيها منذ اليوم الأول يجنّب ترحيلًا تحت الضغط لاحقًا.

التحدي

البنية البديهية لهذا المنتج أربع خدمات سحابية مُدارة. ولبانيَين بدوام جزئي يسعيان لإطلاق تجريبي بحفنة مستخدمين مختارين، فهذا يعني أربع لوحات تحكم وأربع فواتير وأربعة أنماط للفشل قبل خدمة أول عميل.

الحل

يعمل كل شيء على خادم EC2 واحد: Next.js ومستهلك الأحداث تحت pm2، وnginx ينهي تشفير Cloudflare، وPostgres وRedis وClickHouse إلى جانبهم. ولا شيء داخل حاويات في الإنتاج — فـ Docker Compose أداة تطوير فقط. والنشر أمر واحد يسحب ويرحّل قاعدتي البيانات ويبني ويعيد التحميل. إنها مقايضة مقصودة: عمل توسّع مستقبلي مقابل سرعة حاضرة، وهي مدوّنة كمشكلة معروفة للإصدار الثاني لا متجاهَلة.

التحدي

ثلاث لغات — الإنجليزية والعربية والفرنسية — تحتاج العربية فيها اتجاهًا من اليمين لليسار وخطًا مختلفًا. وتحميل خطوط عربية لكل زائر يعاقب غالبية الصفحات التي لا تعرض حرفًا عربيًا واحدًا.

الحل

تحمل القواميس الثلاثة المفاتيح الـ ١١٣٣ نفسها، وترتد المفاتيح غير المعبأة إلى الإنجليزية وقت العرض بدل إظهار مفتاح خام. ويُضبط الاتجاه على عنصر `html` حسب اللغة، وتنعكس التخطيطات عبر خصائص Tailwind المنطقية مع قلب الأسهم بمُعدِّل `rtl:`. ويأتي خط Noto Sans Arabic خلف Geist مع واصف `unicode-range`، فلا تُجلب النسخة العربية إلا في الصفحات التي تحتوي فعلًا حروفًا عربية.

التحدي

لوحات التحليلات تتشابه كلها: أزرق مخضر ونيلي على رمادي مزرق. والتشابه مع كل منافس مشكلة تموضع لا مسألة ذوق فحسب — فحجة المنتج كلها أنه يقيس شيئًا مختلفًا عما تقيسه الأدوات المجاورة له.

الحل

انتقلت الهوية خارج ذلك النطاق اللوني تمامًا، إلى مساحة كريمية دافئة مع ذهبي عسلي عميق كلون إشارة وحيد، وأُبقي الكوبالت وزنًا باردًا مقابلًا في الرسوم فقط. وكل رمز لوني محدد بنظام OKLCH مع تسجيل نسبة تباينه المقاسة بجانبه، فلا يكلّف الدفء وضوح القراءة. والرسوم مبنية يدويًا على visx بدل إعدادات مكتبة جاهزة، وهو ما يجعلها ترث لوحة الهوية بدل أن تقاومها.

الخلاصة

DataLook هو المشروع الذي تعلمت فيه أن أصعب القرارات الهندسية في منتج صغير هي القرارات الطارحة. اختيار ClickHouse إلى جانب Postgres، وإبقاء الحزمة تحت سقف حجم مفروض في البناء، وتدوين أن إعادة تشغيل الجلسات والخرائط الحرارية لن تُشحن أبدًا — كل واحد من هذه أغلق بابًا عن قصد، وكل واحد جعل ما تبقى من المنتج أحدّ.

وبنية الخادم الواحد أوضح مثال. ليست البنية التي سأختارها عند التوسّع، ولم أدّعِ غير ذلك: فهي موثّقة كمقايضة مقصودة بشرط انتهاء مسمّى. وتبيّن أن الصراحة بشأن كلفة القرار وموعد مراجعته أثمن من إصابته نظريًا من اليوم الأول.

The landing page leads with the product’s whole argument: your analytics counts visits, DataLook counts customers.
Four flat tiers from $5 to $99 a month — priced so a solo founder lands at the bottom of the range, not the top.
Product docs built on fumadocs from MDX, including the first-party proxy install path for 25 frameworks.
A public status page backed by the same health endpoints the admin portal reads.
The same landing in Arabic. Direction is set per locale on the html element and layouts mirror through logical properties.
Pricing in Arabic — all three dictionaries carry the same 1,133 keys.
Sign-in on Better-Auth, offering both magic link and email + password.
The landing on mobile — the “did it work?” glance is a first-class use case.
Arabic on mobile, with full RTL.