جهات الاتصال والموافقة
ليست تقدر تدافع عنها، مش مجرد ليست عندك
أي حد يقدر يمسك عشر آلاف عنوان إيميل. السؤال المهم — اللي الجهة الرقابية والمزوّد وضميرك كلهم بيسألوه بكلمات مختلفة شوية — هو إيه مصدر كل عنوان وعلى أي أساس مسموحلك تكتبله. ClickSomo بيخلي دي حقيقة متخزّنة بدل حاجة هتضطر تعيد بناءها.
الهوية هي عنوان الإيميل
تواصل واحد لكل عنوان لكل مشروع، مفروض من قاعدة البيانات نفسها مش بالتمني. العناوين بتتظبط وقت الكتابة، مش وقت القراءة — لو ظبطتها وقت القراءة القيد بيبقى مجرد حاجة شكلية بتخلي Anna@ وanna@ يدخلوا الاتنين.
أرقام التليفون بتتخزن بصيغة E.164 لو موجودة، بس رقم التليفون صفة مش هوية. مفيش رسم بياني لحل الهويات، ولا بروتوكول دمج، ولا سجل تدقيق للدمج، لأن كل تواصل هنا بييجي من قناة عندها عنوان أصلاً: استيراد، أو فورم، أو اشتراك، أو كودك انت.
الاسم بيتخزن كامل
display_name بيتحفظ زي ما اتكتب بالظبط ومش بيتقسم أبدًا. تقسيم الأسماء مصنع عيوب — "van der Berg"، "Kim Min-jun"، الأسماء المفردة، اللقب، وكل طريقة ترتيب مش إنجليزية — والتقسيم الغلط بيظهر في وسم الدمج كـ "عزيزي van،" وده أسوأ من عدم التخصيص خالص.
الأجزاء المهيكلة موجودة بس للمصادر اللي بتيجي بيها مقسّمة أصلًا. مفيش حاجة بتشتقها. والاسم اللي حد كتبه بنفسه مش بيتكتب فوقه من ملف CSV بعدين صادف إنه شايف حاجة مختلفة، لأن قاعدة آخر كتابة بتخلي الاستيراد الأكثر عشوائية هو اللي يكسب.
- 1الهويةالإيميل، مظبوط. فريد داخل المشروع.
- 2الاسمبيتخزن كامل.
first_nameبيتشتق وقت العرض، مش بيتخزن أبدًا. - 3الخصائصأي حاجة انت عايزها، بصيغة JSON. بتاعتك، وقابلة للاستبدال كـ
attrs.*. - 4الوسوم والقوائمالوسوم كيانات أساسية وعايشة في مخزن واحد؛ القوائم عضوية صريحة.
- 5الموافقةصف واحد لكل قناة، مع أساس قانوني ودليله.
- 6الأحداثسجل إضافي بس لكل حاجة الشخص عملها. الجدول اللي المنتج كله مبني عليه.
- ×أبدًالا كلمة سر، ولا هاش، ولا جلسة، ولا مفتاح API. عمود بيعرّف حد هتبقى حادثة أمنية، مش ميزة.
محدود بالمستأجر والمشروع، الاتنين
سجل الموافقات
الغياب مش إذن
صف واحد لكل تواصل لكل قناة — إيميل، SMS، رسالة، إشعارات — وكل صف فيه حالة، وأساس قانوني، ومصدر، والدليل، والطوابع الزمنية، والاختصاص القضائي. التواصل اللي مالوش صف أساس لقناة معينة مش ممكن يتبعتله أي حاجة على القناة دي. مش "معلّم عليه". مستحيل.
consent
حد طلب بنفسه فعلاً. تقديم فورم والدليل متخزن، أو تأكيد مزدوج للاشتراك، أو مربع اختيار حد علّمه بنفسه. ده أقوى أساس، وهو الوحيد اللي الفورم يقدر ينتجه.
legitimate_interest
أفضل حاجة استيراد CSV ممكن يوصلها. ملف إكسل مش بيفتكر حد وافق على حاجة، فمسموحش أبدًا يدّعي إنه وافق — وإعادة رفع نفس الملف مش هتطوره.
contract
انت بتكتب لهم بسبب حاجة الاتنين منكم طرفين فيها. تذكير الخدمة، إشعار التجديد، الحاجة اللي كان هيضايقهم لو ما وصلتهمش.
قبل ما الحملة تتبعت، بتشوف توزيع الأساس القانوني لجمهورها: كام واحد فيهم طلب بنفسه، وكام بتوصلهم تحت المصلحة المشروعة، وكام موجودين بسبب عقد. رقم واحد ده وقّف إرسالات وحشة أكتر من أي لافتة تحذير اتكتبت في حياتك.
ليه ده أشد من اللي محتاجه بالنسبة ليك: الموضوع مش عليك فعلًا. سمعة الإرسال الجماعي مورد مشترك، وقائمة واحدة مهملة بتسمّم البير للكل اللي بيبعتوا من نفس البنية. معدلات الشكاوى والارتداد بتتتابع لكل مستأجر، والحساب اللي معدلاته تعدّي الحد بيتقيّد هنا — قبل ما المزوّد يعملها للكل مرة واحدة.

ورا كل صف في القائمة، حد قال أواه.
أربع طرق للدخول
كل طريق لقائمتك هو انت، بتتصرف في بياناتك انت
مفيش مسار استيراد بتوكن خدمة، ولا منتج تاني بيكتب في تواصلاتك في الخفاء. لو عايز حد يكون في قائمة، واحد من الأربعة دول هو اللي حطه.
استيراد CSV
مربوط عمود بعمود، مظبوط وقت الكتابة، متفحص على MX عشان الدومينات الميتة والمكتوبة غلط تتلقط قبل ما ترتد ارتداد نهائي، وبتنزل بأساس قانوني انت بتحدده صراحة. الاستيراد بياخد معرّف، وكل تواصل أنشأه بيشاور عليه.
فورم من ClickSomo
بيترندر من نفس المستند زي كل حاجة تانية، مع تحقق من المدخلات، وفخ عناكب، وحد لمعدل الإرسال. تقديم الفورم هو المسار الوحيد اللي يقدر ينتج consent بشكل مشروع، لأنه الوحيد اللي الشخص موجود فيه بنفسه.
صفحة انت بنيتها في dash-b
مصمم الداشبورد بينشر صفحات؛ والفورم اللي عليها بيبعت هنا ببيانات اعتمادك انت. نفس التحقق، نفس التعامل مع الموافقة، ومفيش تكامل تاني تحافظ عليه.
الـ API العام
POST /v1/contacts بتوكنك انت، بسلوك upsert، ومفتاح idempotency محترم. تطبيقك عارف مين سجّل خلاص؛ ودي أقصر طريق من المعرفة دي لقمع تسويقي.
السيجممنتس عبارة عن شرط (predicate)، مُترجَم
السيجممنت هو شجرة شروط محفوظة على حقول جهات الاتصال والخصائص والتاجات والعضوية في القوائم والسلوك، بتترجم لـ SQL وبتتخزن في الكاش مع عدد. المعاملات هي العادية — يساوي، لا يساوي، داخل، خارج، يبدأ بـ، ينتهي بـ، يحتوي على، فيه قيمة، مفيش قيمة — وممكن تدمجها بـ and و or و not لأي عمق محتاجه.
عاينه قبل ما تستخدمه. الـ endpoint بيرجع جهات اتصال حقيقية، فسؤال «مين اللي موجود فعلاً هنا» بتجاوب عليه بالبص، مش بالإرسال واكتشاف النتيجة.
السيجممنتس بتشتغل شغل مزدوج: كجمهور لحملة، وكشرط على فرع في الفانل، وكتريجر لحالها — segment_enter بيبدأ تشغيل في اللحظة اللي حد بيبقى مؤهل فيها.
- 1تاج
tags contains "regular" - 2خاصية
attrs.total_orders >= 3— حقلك، واسمك إنت ليه. - 3السلوكمفيش حدث
order.paidفي آخر 90 يوم. - 4الموافقةأساس إيميل قابل للاستخدام. جهات الاتصال اللي ملهاش أساس مش داخلين في العدد، لأنهم مش هيوصلهم إرسال أصلاً.
- معلومةمعاينة412 جهة اتصال، متعرضة. بيتحسب تاني وقت الإرسال، لأن السيجممنت سؤال مش لقطة.
مترجم لـ SQLالعدد في الكاش، والإجابة حية
الاستبعاد، وإمتى بيتم فحصه
الاستبعادات على مستوى المشروع وعالمية: الرجعات الصلبة، الشكاوى، إلغاء الاشتراكات، الإضافات اليدوية، وعناوين الأدوار. بتتفحص وقت الإرسال، وبعدين تاني جوه خدمة الإرسال نفسها.
الفحص التاني ده هو اللي بيقوم بالشغل. فانل فيه انتظار ثلاث أيام معناه إن فيه نافذة ثلاث أيام ممكن حد يلغي اشتراكه فيها، ونظام فحص الاستبعاد وقت طلب الرسالة هيبعتلهم برضه. الفحص وقت الإرسال هو الفرق بين احترام إلغاء الاشتراك وتسجيله بس.
المسح بيشتغل بنفس الطريقة: طلب الحذف بيشيل جهة الاتصال وتاريخ رسايلها من هنا، وبيوصل لكل الخدمات الشقيقة اللي عندها نسخة عن طريق نفس القناة الداخلية اللي باقي العيلة بتستخدمها. فيه مكان واحد للطلب ونتيجة واحدة بتحصل.