feat(marketing): consent-gated measurement layer + pricing-intelligence legal brief
البند ٢ — استخبارات التسعير (docs/35 جديد): - توصيف تقني دقيق من كود سيرو: المصدر ليس "كشط أسعار معلنة" بل بوت أندرويد على أجهزة حقيقية يشغّل 7 تطبيقات منافسة مُسمّاة بمعرّف الحزمة (standalone_worker.php:665) بدفعات حتى 100 مهمة - فصل ثلاثة أخطار مستقلة: الوصول الآلي · قانون المنافسة · البيانات - الخطر الأكبر (لم يكن موثّقاً): بيع المحرّك لمشغّلَين في نفس المدينة = ترتيب hub-and-spoke تقع مسؤوليته على المحور أي Tripz - ضابط مقترح: مشغّل واحد لكل مدينة، في العقد وفي الكود - تنظيف صياغة الموقع: صفر أسماء منافسين، وحُذفت "اعرف كيف يسعّر منافسك قبل أن يعرف هو" لأنها تصلح دليل نيّة في نزاع البند ٣ — طبقة القياس (docs/32 §5): - شريط موافقة بأربع لغات، الرفض بنفس بروز القبول - البكسل لا يُحمَّل قبل الموافقة (مطلوب لزوّار الاتحاد الأوروبي: الموقع بالفرنسية والإسبانية) - 8 أحداث تغطي القمع كاملاً حتى Lead بمعامل القناة - PIXEL_ID فارغ عمداً: لا شيء ينكسر ولا شيء يُقاس حتى يُملأ تحقُّق: صفر أخطاء console · صفر عناصر i18n فارغة في اللغات الأربع · fbq غير معرّف قبل الموافقة · الأحداث تُطلق بعدها Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
8cbaa89642
commit
7b02b27d92
@@ -225,6 +225,52 @@ Same LOCKED STYLE as above. No readable text.
|
||||
|
||||
---
|
||||
|
||||
---
|
||||
|
||||
## 5) طبقة القياس — منفَّذة 2026-07-24 ✅
|
||||
|
||||
كان في المراجعة النقدية عائق صريح: **خطة إعلانية بأهداف CAC بين $150–400 بلا أداة واحدة تقيسها.** `grep` على البكسل كان يعطي صفراً. هذا القسم يوثّق ما رُكِّب.
|
||||
|
||||
### 5.1 الموافقة أولاً — ليست تجميلاً
|
||||
|
||||
الموقع بأربع لغات منها **الفرنسية والإسبانية**، أي أن زوّاراً من الاتحاد الأوروبي سيصلونه. بكسل يعمل قبل الموافقة = مخالفة GDPR مباشرة. لذلك:
|
||||
|
||||
- شريط موافقة يظهر بعد 1.6 ثانية، بأربع لغات، بخيارَي **أوافق / أرفض** متساويين بصرياً (لا زر رفض مخفي).
|
||||
- **لا يُحمَّل سكربت ميتا إطلاقاً قبل «أوافق».** تحقُّق برمجي: `typeof window.fbq === "undefined"` قبل الموافقة.
|
||||
- من يرفض يتصفّح الموقع كاملاً بلا نقص — ولا كوكيز تتبّع.
|
||||
- الأحداث تُسجَّل محلياً بلا بيانات شخصية في الحالتين، وتُرسَل لميتا فقط بعد الموافقة.
|
||||
|
||||
### 5.2 ⚠️ خطوة واحدة متبقّية قبل أول دولار
|
||||
|
||||
```js
|
||||
const PIXEL_ID = ""; // marketing/index.html
|
||||
```
|
||||
**ما دام فارغاً لا يُحمَّل البكسل ولا يُرسَل حدث.** هذا مقصود: لا شيء ينكسر، ولا شيء يُقاس. ضع المعرّف من Meta Events Manager قبل تشغيل الحملة.
|
||||
|
||||
### 5.3 تعريف الأحداث
|
||||
|
||||
| الحدث | متى | ما يقيسه |
|
||||
|---|---|---|
|
||||
| `PageView` | بعد الموافقة | الوصول الأساسي |
|
||||
| `SectionView` | ظهور 35% من قسم | **عمق القمع** — أين يتوقف الزائر |
|
||||
| `PlanInterest` | نقر بطاقة باقة | أي باقة تجذب فعلاً |
|
||||
| `ModuleInterest` | نقر بطاقة وحدة | **أي وحدة يطلبها الناس** — أثمن بيانات تسعيرية |
|
||||
| `CalculatorUsed` | تغيير مُهدَّأ 800ms | أقوى إشارة نيّة قبل التواصل |
|
||||
| `Lead` | نقر واتساب/Calendly | **التحويل** — بمعامل `channel` و`where` |
|
||||
| `DemoAppOpened` | نقر رابط متجر | جودة الاهتمام |
|
||||
| `ConsentGranted` | قبول الموافقة | معدّل القبول = مقام كل نسبة أدناه |
|
||||
|
||||
### 5.4 كيف تُحسب أهداف §2 فعلياً
|
||||
|
||||
- **CAC** = إنفاق الحملة ÷ عدد `Lead` بـ`channel=whatsapp`. الهدف $150–400 صار قابلاً للقياس.
|
||||
- **معدّل التحويل** = `Lead` ÷ `PageView`.
|
||||
- **جودة الرسالة** = `SectionView(#pricing)` ÷ `PageView` — انخفاضه يعني أن الإعلان يجلب جمهوراً خاطئاً لا أن الصفحة ضعيفة.
|
||||
- **إشارة التسعير** = توزيع `PlanInterest` و`ModuleInterest` — يخبرك أي باقة/وحدة تُطلب قبل أول مكالمة.
|
||||
|
||||
> **تحذير تحليلي:** كل النسب أعلاه مقامها **الموافِقون فقط**. إن كان معدّل القبول 60% فأنت لا ترى 40% من الزوّار. لا تقارن هذه الأرقام بأرقام منصّة الإعلان مباشرة — قارن الاتجاه لا القيمة المطلقة.
|
||||
|
||||
---
|
||||
|
||||
## سجل التغييرات
|
||||
|
||||
| التاريخ | التغيير |
|
||||
|
||||
@@ -0,0 +1,168 @@
|
||||
# 35 — استخبارات التسعير: ملخّص وقائع للمحامي + ضوابط المنتج
|
||||
|
||||
> أُنشئ 2026-07-24 بطلب المالك (البند ٢ من قائمة المراجعة النقدية).
|
||||
>
|
||||
> ⚠️ **هذا الملف ليس رأياً قانونياً ولا يقوم مقامه.** أنا لست محامياً. الغرض منه أن يُسلَّم **كما هو** لمحامٍ مختص بالملكية الفكرية وقانون المنافسة في كل ولاية قضائية مستهدفة، فيجد أمامه الوقائع التقنية دقيقة بدل أن يعيد اكتشافها. الأسئلة في §5 هي ما يُطرح عليه.
|
||||
>
|
||||
> يُقرأ مع: [docs/33 §2.3](33-addons-packaging.md) (الوحدة والتسعير) · [docs/34](34-siro-backend-multitenancy.md) (من سيشغّلها)
|
||||
|
||||
---
|
||||
|
||||
## 1) ما تفعله الوحدة فعلاً — مقروء من الكود لا من العرض التسويقي
|
||||
|
||||
هذا القسم هو أهم ما في الملف. الوصف الذي كان في `docs/33` («جمع أسعار المنافسين») **أقل دقة بكثير من الواقع**، والفارق قانوني لا لفظي.
|
||||
|
||||
### 1.1 مصدر البيانات: بوت أندرويد يشغّل تطبيقات المنافسين على أجهزة حقيقية
|
||||
|
||||
| الحلقة | الملف | ما يحدث |
|
||||
|---|---|---|
|
||||
| ① طابور المهام | `backend/bot/standalone_worker.php` | لوحة تُنشئ مهام: تطبيق منافس + نقطة انطلاق + وجهة + إحداثيات. وزرّ **«Generate Batch Trips»** يولّد حتى **100 مهمة دفعة واحدة** |
|
||||
| ② التنفيذ | **بوت أندرويد خارج المستودع** | نصّ الواجهة حرفياً: *"Results will appear here when the Android bot submits them"* (`standalone_worker.php:821`). التنفيذ على **جهاز حقيقي** يفتح تطبيق المنافس ويطلب تسعيرة |
|
||||
| ③ الإرجاع | نفس الملف، سطور 22–73 | البوت يوقّع بـ`hash_hmac('sha256', device_id.ts, SECRET_KEY)` ويرسل النتائج |
|
||||
| ④ التخزين | `bot/cron_empty_results_to_db.php:38` | `INSERT INTO scraped_competitor_prices (...)` من `results.json` |
|
||||
| ⑤ التحليل | `backend/pricing-engine/src/` | MAD (شواذ) · K-Means (تجميع فئات) · انحدار خطي متعدد → **استخراج معادلة تسعير المنافس** |
|
||||
| ⑥ التطبيق | `ride/pricing/auto_adapt.php` · `bot/ai_formula_solver.php` · `cron_pricing_stability_engine.php` | ضبط سعر سيرو آلياً على أساس النتيجة |
|
||||
|
||||
### 1.2 التطبيقات المستهدفة — **بالاسم ومعرّف الحزمة**
|
||||
|
||||
من `standalone_worker.php:665–673`:
|
||||
|
||||
| التطبيق | معرّف الحزمة |
|
||||
|---|---|
|
||||
| Uber | `com.ubercab` |
|
||||
| Careem | `com.careem.acma` |
|
||||
| Jeeny | `me.com.easytaxi` |
|
||||
| TaxiF | `com.taxif.passenger` |
|
||||
| YallaGo | `ae.com.yalla.go.dubai.client` |
|
||||
| Zaken / Zakinn | `com.zakinn.app` |
|
||||
| Tfadal | `com.bis.taxi` |
|
||||
|
||||
`scraped_competitor_prices` يخزّن `app_name` و`competitor_name` كأعمدة مفهرسة — أي أن **نسبة السعر إلى منافس مُسمّى هي تصميم الجدول نفسه، لا أثر جانبي**.
|
||||
|
||||
### 1.3 لماذا هذا التوصيف مهم
|
||||
|
||||
الفارق بين ثلاثة أوصاف، وكلها كانت تُستعمل بالتبادل في وثائقنا:
|
||||
|
||||
| الوصف | الواقع؟ | الوزن القانوني |
|
||||
|---|---|---|
|
||||
| «تحليل بيانات السوق» | ❌ غير دقيق | منخفض |
|
||||
| «كشط أسعار معلنة من صفحات عامة» | ❌ غير دقيق | متوسط |
|
||||
| **«أتمتة تطبيقات منافسين مُسمّاة على أجهزة حقيقية لتوليد طلبات تسعير آلية بالجملة»** | ✅ **هذا هو الواقع** | **مرتفع** |
|
||||
|
||||
الأسعار في تطبيقات النقل **ليست منشورة على صفحة عامة** — تُولَّد ردّاً على طلب تسعيرة من حساب داخل التطبيق. أي أن الحصول عليها يستلزم بالضرورة: حساباً على منصة المنافس، وتفاعلاً آلياً معها، وتوليد أحمال على أنظمته.
|
||||
|
||||
---
|
||||
|
||||
## 2) الخطر الأول — الوصول الآلي المصرّح به وشروط الاستخدام
|
||||
|
||||
**ما يجب أن يعرفه المحامي:**
|
||||
- الوصول يتم عبر **حساب مستخدم** على منصة المنافس (لا يمكن الحصول على تسعيرة بدونه).
|
||||
- التفاعل **آلي** ومُجدوَل ودُفعي (حتى 100 طلب/دفعة).
|
||||
- الطلبات هي **طلبات تسعير** لا حجوزات مكتملة — لكنها أحمال حقيقية على أنظمة المنافس.
|
||||
- شروط استخدام تطبيقات النقل الكبرى تحظر عادةً صراحةً: الوصول الآلي، والاستخدام لأغراض تجارية منافسة، وجمع البيانات بالجملة.
|
||||
|
||||
**البُعد الذي يتجاوز «مخالفة عقد»:** في عدد من الولايات القضائية يُجرَّم الوصول غير المصرّح به إلى نظام معلوماتي بقانون جزائي مستقل عن العقد (الأردن: قانون الجرائم الإلكترونية · مصر: قانون مكافحة جرائم تقنية المعلومات · الخليج: قوانين مكافحة جرائم المعلوماتية). **السؤال للمحامي: هل «الوصول بحساب صحيح لكن بغرض تحظره الشروط وبأتمتة» يندرج تحت «غير مصرّح» في هذه القوانين؟** الإجابة تختلف جوهرياً بين الولايات.
|
||||
|
||||
---
|
||||
|
||||
## 3) الخطر الثاني — قانون المنافسة (الأخطر، ولم يكن موثَّقاً أصلاً)
|
||||
|
||||
هذا الخطر **مستقل تماماً** عن الأول، ولا يزول بحلّه.
|
||||
|
||||
### 3.1 الفرق بين الاستعمال الذاتي والبيع كخدمة
|
||||
|
||||
| الوضع | الوصف | الوزن |
|
||||
|---|---|---|
|
||||
| **أمس** | سيرو تجمع أسعاراً وتضبط أسعارها هي | فاعل واحد يتصرّف تنافسياً |
|
||||
| **غداً** | **Tripz تشغّل المحرّك لـN مشغّلاً** وتضبط أسعارهم | **Tripz صارت العقدة المركزية بين متنافسين** |
|
||||
|
||||
### 3.2 السيناريو الذي يجب تفاديه معمارياً
|
||||
|
||||
مشغّلان في **نفس المدينة** يشتريان الوحدة. كلاهما يتغذّى من نفس المحرّك، بنفس المنطق، على نفس بيانات السوق → **أسعارهما تتقارب بلا اتفاق بينهما**.
|
||||
|
||||
هذا هو التوصيف الكتابي لما يُسمّى **التواطؤ الخوارزمي عبر وسيط (hub-and-spoke)**: لا يلزم اتفاق بين المتنافسين؛ يكفي أن يديرا التسعير عبر **مزوّد واحد يعرف بيانات الجميع**. والمسؤولية في هذا النمط تقع على **المزوّد** (المحور) لا على المشغّلين فقط.
|
||||
|
||||
مصر والسعودية والإمارات والأردن لديها جميعاً هيئات منافسة فاعلة، والاتحاد الأوروبي هو الأشدّ في هذا الباب تحديداً.
|
||||
|
||||
### 3.3 الضابط المعماري المقترح — يُنفَّذ قبل البيع لا بعده
|
||||
|
||||
> **قاعدة «مشغّل واحد لكل مدينة» للوحدة ②:** لا تُباع «استخبارات التسعير» لأكثر من مستأجر واحد في نفس المدينة/السوق. تُقيَّد في العقد **وفي الكود** (فحص عند تفعيل الميزة على مستوى المدينة).
|
||||
|
||||
هذا الضابط يحوّل الوحدة من «محور تواطؤ محتمل» إلى «أداة تنافسية لفاعل واحد» — وهو أقوى دفاع بنيوي متاح، وله أثر تجاري إيجابي أيضاً: **الحصرية الجغرافية تبرّر سعراً أعلى** ($249 → قابلة لأن تصير $399 لأول مشغّل في المدينة).
|
||||
|
||||
---
|
||||
|
||||
## 4) الخطر الثالث — البيانات الشخصية
|
||||
|
||||
`scraped_competitor_prices` يخزّن إحداثيات دقيقة (`decimal(10,7)`) لنقاط انطلاق ووصول. هذه **نقاط اصطناعية ولّدها فريقنا**، لا نقاط ركاب حقيقيين — أي أن الخطر هنا **منخفض**، لكن يجب تثبيته كتابةً حتى لا ينزلق لاحقاً إلى استعمال نقاط رحلات فعلية.
|
||||
|
||||
> **قاعدة:** ممنوع تغذية `scraped_competitor_prices` من إحداثيات رحلات ركاب حقيقية. النقاط الاصطناعية فقط.
|
||||
|
||||
---
|
||||
|
||||
## 5) الأسئلة التي تُطرح على المحامي (بهذا الترتيب)
|
||||
|
||||
**أ — الوصول الآلي**
|
||||
1. هل الوصول الآلي إلى تطبيق منافس بحساب صحيح، بغرض تحظره شروطه، يشكّل «وصولاً غير مصرّح به» جزائياً في [الأردن · مصر · سوريا · السعودية · الإمارات]؟
|
||||
2. هل تتغيّر الإجابة إذا كان الحساب باسم شركة أو باسم شخص طبيعي؟
|
||||
3. ما مدى تعرّضنا لدعوى مدنية (إخلال بعقد · منافسة غير مشروعة · إثراء بلا سبب) من منصة مُسمّاة؟
|
||||
|
||||
**ب — بيع الأداة كخدمة**
|
||||
4. حين تشغّل Tripz المحرّك **نيابة عن** مستأجريها، من الفاعل قانوناً — Tripz أم المستأجر أم كلاهما؟
|
||||
5. هل ينفعنا تعاقدياً أن يقرّ المستأجر بأنه المسؤول عن استعمال المخرجات؟ أم تبقى المسؤولية على المزوّد؟
|
||||
|
||||
**ج — المنافسة (الأهم)**
|
||||
6. هل بيع محرّك تسعير واحد لمشغّلَين متنافسَين في نفس السوق يُعرّضنا لمساءلة كـ«محور» في ترتيب hub-and-spoke؟
|
||||
7. هل ضابط «مشغّل واحد لكل مدينة» (§3.3) كافٍ للدفع؟ وهل يلزم أن يكون في العقد أم في الكود أم في الاثنين؟
|
||||
8. ما الأسواق التي يجب **ألّا** تُعرض فيها الوحدة إطلاقاً في المرحلة الأولى؟
|
||||
|
||||
**د — التسويق**
|
||||
9. ما الصياغات التسويقية الممنوعة؟ (تسمية منافس · التلميح لـ«اختراق» · وعد بمعرفة «أسرار» المنافس)
|
||||
|
||||
---
|
||||
|
||||
## 6) ما نُفِّذ الآن على الموقع — وما ينتظر رأي المحامي
|
||||
|
||||
### ✅ نُفِّذ فوراً (لا يحتاج انتظاراً)
|
||||
- **لا يُسمّى أي منافس** في أي لغة من اللغات الأربع.
|
||||
- حُذفت صياغة **«اعرف كيف يسعّر منافسك — قبل أن يعرف هو»**: توحي بالتسلل، وتصلح دليلاً على النيّة في أي نزاع.
|
||||
- الصياغة البديلة تصف **المخرَج** (معادلة تسعير السوق · مرونة الطلب · ضبط سعرك) لا **الوسيلة**.
|
||||
|
||||
### ⏸️ موقوف على رأي المحامي
|
||||
- عرض الوحدة في **أي سوق خليجي أو أوروبي**.
|
||||
- تفعيل ضابط «مشغّل واحد لكل مدينة» في الكود (`FeatureGuard` على مستوى المدينة).
|
||||
- صياغة بند تحمّل المسؤولية في عقد المستأجر.
|
||||
|
||||
### 🔴 قرار يستحق النظر قبل أول بيع
|
||||
|
||||
المسار الأقل خطراً **ليس تحسين الصياغة، بل تبديل مصدر البيانات**. المحرّك التحليلي (`pricing-engine/`) هو الأصل الثمين، وهو **محايد تماماً تجاه المصدر**: MAD وK-Means والانحدار تعمل على أي جدول أسعار.
|
||||
|
||||
بدائل تُغذّي نفس المحرّك بمخاطرة أقل بكثير:
|
||||
1. **بيانات المستأجر نفسه** — تاريخ رحلاته ومرونة الطلب وأسعاره. لا يحتاج منافساً أصلاً، ويغطّي معظم قيمة «اضبط سعرك بالبيانات لا بالحدس».
|
||||
2. **تعرفة الجهة المنظِّمة** — منشورة رسمياً في معظم أسواقنا، وجمعها مشروع تماماً.
|
||||
3. **مسح ميداني بشري** — بائع بيانات أو مسح دوري، بعقد يحمّل المزوّد المسؤولية.
|
||||
|
||||
**الرأي الصريح:** الوحدة تظل تستحق $249 حتى لو حُذفت طبقة المنافسين كلياً. أما بيع بوت الأندرويد كخدمة لـN مشغّلاً فيضع Tripz — لا المستأجر — في مرمى دعويين مختلفتين. لو كان القرار لي: **أفصل المحرّك عن مصدره، وأبيع المحرّك، وأترك مصدر المنافسين استعمالاً داخلياً لسيرو وحدها ريثما يردّ المحامي.**
|
||||
|
||||
---
|
||||
|
||||
## 7) موقف المنتج الحالي
|
||||
|
||||
| البند | الحالة |
|
||||
|---|---|
|
||||
| الوحدة على الموقع | معروضة بصياغة محايدة، بلا تسمية منافس |
|
||||
| السعر | $249/شهر + $1,000 إعداد |
|
||||
| ضابط مشغّل/مدينة | ⬜ غير منفَّذ في الكود |
|
||||
| رأي قانوني | ⬜ لم يُطلب بعد — **هذا الملف هو مادته** |
|
||||
| أسواق مسموحة | الأردن · مصر · سوريا مبدئياً · **الخليج وأوروبا موقوفان** |
|
||||
|
||||
---
|
||||
|
||||
## سجل التغييرات
|
||||
|
||||
| التاريخ | التغيير |
|
||||
|---|---|
|
||||
| 2026-07-24 | إنشاء الملف — توصيف تقني دقيق من الكود (بوت أندرويد على أجهزة حقيقية ضد ٧ تطبيقات مُسمّاة)، فصل ثلاثة أخطار، ضابط مشغّل/مدينة، أسئلة المحامي، تنظيف صياغة الموقع |
|
||||
|
||||
---
|
||||
← ذو صلة: [33-addons-packaging](33-addons-packaging.md) · [21-siro-audit](21-siro-audit.md) · [34-siro-backend-multitenancy](34-siro-backend-multitenancy.md)
|
||||
+128
-4
@@ -412,6 +412,17 @@ html[dir=ltr] .transit-sec{background-image:radial-gradient(760px 420px at 88% 0
|
||||
.transit-note{color:#9BA8C9;font-size:13.5px;margin-bottom:20px}
|
||||
@media(max-width:900px){.transit-grid{grid-template-columns:1fr;gap:32px}}
|
||||
|
||||
/* ============ CONSENT + ANALYTICS ============ */
|
||||
.consent{position:fixed;inset-inline:16px;bottom:16px;z-index:200;max-width:520px;margin-inline:auto;
|
||||
background:var(--card);border:1px solid var(--border);border-radius:16px;box-shadow:var(--shadow-lg);
|
||||
padding:20px 22px;transform:translateY(140%);transition:transform .45s var(--ease)}
|
||||
.consent.show{transform:none}
|
||||
.consent h4{font-size:16px;margin-bottom:6px}
|
||||
.consent p{font-size:13.5px;color:var(--text-soft);margin-bottom:14px}
|
||||
.consent-btns{display:flex;gap:10px;flex-wrap:wrap}
|
||||
.consent-btns .btn{flex:1;justify-content:center;padding:11px 18px;font-size:14px;min-width:120px}
|
||||
@media(max-width:520px){.consent{inset-inline:10px;bottom:10px;padding:18px}}
|
||||
|
||||
/* ============ COMPARISON ============ */
|
||||
.cmp-table{width:100%;border-collapse:separate;border-spacing:0;font-size:15px}
|
||||
.cmp-table th,.cmp-table td{padding:16px 18px;text-align:start;border-bottom:1px solid var(--border)}
|
||||
@@ -1281,6 +1292,16 @@ footer{background:var(--midnight-900);color:#8A99C2;padding:64px 0 32px;border-t
|
||||
<svg width="28" height="28" viewBox="0 0 24 24" fill="#fff"><path d="M12 2a10 10 0 00-8.6 15l-1.3 4.7 4.8-1.3A10 10 0 1012 2zm0 18a8 8 0 01-4-1.1l-.3-.2-2.9.8.8-2.8-.2-.3A8 8 0 1112 20zm4.4-6c-.2-.1-1.4-.7-1.6-.8s-.4-.1-.6.1-.6.8-.8.9-.3.2-.6 0a6.5 6.5 0 01-1.9-1.2 7.3 7.3 0 01-1.4-1.7c-.1-.3 0-.4.1-.5l.4-.5.3-.5v-.4l-.8-1.9c-.2-.5-.4-.4-.6-.4h-.5a1 1 0 00-.7.3 3 3 0 00-.9 2.2 5.2 5.2 0 001.1 2.7 11.8 11.8 0 004.5 4c.6.2 1.1.4 1.5.5.6.2 1.2.2 1.6.1.5-.1 1.4-.6 1.6-1.1s.2-1 .1-1.1z"/></svg>
|
||||
</a>
|
||||
|
||||
<!-- ================= CONSENT ================= -->
|
||||
<div class="consent" id="consent" role="dialog" aria-live="polite">
|
||||
<h4 data-i18n="consent.t"></h4>
|
||||
<p data-i18n="consent.d"></p>
|
||||
<div class="consent-btns">
|
||||
<button class="btn btn-primary" id="consentYes" data-i18n="consent.yes"></button>
|
||||
<button class="btn btn-ghost" id="consentNo" data-i18n="consent.no"></button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
/* ============ i18n DICTIONARY (ar default · en · fr · es) ============ */
|
||||
const I18N = {
|
||||
@@ -1320,13 +1341,14 @@ const I18N = {
|
||||
"price.gmvnote":"نِسب GMV تنازلية: كلما كبر حجم أعمالك، صغرت نسبتنا. (علامة: 2.5% حتى $50k · 2% حتى $200k · 1.5% فوقها)",
|
||||
"price.c1.t":"نسبة معلنة","price.c1.d":"مكتوبة ومثبتة في العقد — لا مفاجآت.","price.c2.t":"تصدير بياناتك","price.c2.d":"بياناتك كاملة، قابلة للتصدير في أي وقت.","price.c3.t":"خروج كريم","price.c3.d":"إن غادرت: فترة انتقال 60 يوماً بدل القطع الفوري.",
|
||||
"price.founder.t":"برنامج الشريك المؤسِّس","price.founder.d":"أول 3 مشغّلين: إعداد مجاني مقابل نقطة مئوية إضافية لسنة + دراسة حالة باسمك.","price.founder.seats":"المقاعد المتبقية",
|
||||
"consent.t":"نقيس ما ينفعك — بعد إذنك","consent.d":"نستخدم قياساً إعلانياً لمعرفة أي إعلان أوصلك إلينا. لا نجمع اسمك ولا رقمك، ويمكنك الرفض والاستمرار في تصفّح الموقع كاملاً.","consent.yes":"أوافق","consent.no":"أرفض\u200f",
|
||||
"addons.eyebrow":"قابلة للتركيب","addons.title":"ثلاث وحدات مدفوعة — لا أكثر","addons.lead":"الأمان والمدفوعات لا تُباع عندنا: مشمولة في كل باقة. ما يُباع هو ما يزيد أرباحك فعلاً.",
|
||||
"addon.badge.now":"متاح الآن","addon.badge.soon":"قريباً الربع القادم",
|
||||
"core.title":"مشمول في كل باقة — ولا يُباع كإضافة أبداً","core.lead":"مشغّل بلا زر طوارئ أو بلا بوابة دفع ليس منتجاً ناقصاً — هو منتج لا يعمل. لذلك لا نسعّر هذين.",
|
||||
"core.i1.t":"الأمان والامتثال","core.i1.d":"زر الطوارئ · كشف الاحتيال · تأمين السائق · فحص الوثائق بالذكاء الاصطناعي · تقارير المنظّم",
|
||||
"core.i2.t":"المدفوعات المحلية","core.i2.d":"PayMob · CliQ · سيرياتيل وMTN كاش · شام كاش · المحافظ وطلبات السحب",
|
||||
"addons.m1.name":"حزمة الذكاء الاصطناعي","addons.m1.desc":"تدقيق الشكاوى آلياً، مستشار تشغيلي أسبوعي، تسوية المدفوعات من رسائل المزوّد — موظفك الذي لا ينام.","addons.m1.period":"/شهر",
|
||||
"addons.m2.name":"استخبارات التسعير","addons.m2.desc":"استخبارات سوق تستخرج معادلة تسعير السوق وتضبط سعرك عليها. تغيير 5% في السعر يغيّر أرباحك 30%.","addons.m2.period":"/شهر","addons.m2.setup":"إعداد $1,000 — ضبط السوق المحلي",
|
||||
"addons.m2.name":"استخبارات التسعير","addons.m2.desc":"محرّك إحصائي يستخرج معادلة تسعير سوقك ومرونة الطلب فيه، ويضبط تعرفتك عليها آلياً. تغيير 5% في السعر يغيّر أرباحك 30% — هذه الوحدة تقرّر الـ5% بالبيانات لا بالحدس.","addons.m2.period":"/شهر","addons.m2.setup":"إعداد $1,000 — ضبط السوق المحلي",
|
||||
"addons.m3.name":"حزمة النمو","addons.m3.desc":"إعادة تنشيط الركاب الخاملين، حملات واتساب، تلعيب وتحديات وإحالات — راكب عاد أرخص 10 مرات من راكب جديد.","addons.m3.period":"/شهر",
|
||||
"addons.note":"«ذكاء الأسطول» (الخريطة الحرارية والطلب التنبؤي وتقارير الصحة) لم يعد يُباع منفصلاً — صار جزءاً أصيلاً من باقة «أسطول+».",
|
||||
"transit.eyebrow":"خط منتج مستقل","transit.title":"المواصلات العامة — الباصات على نفس المنصة","transit.lead":"ليست إضافة على تطبيق تكسي. جمهورها مختلف كلياً، وتُشترى لأنك تدير شبكة نقل جماعي — بقمع بيع ومواصفات وعقد مستقلين.",
|
||||
@@ -1387,13 +1409,14 @@ const I18N = {
|
||||
"price.gmvnote":"Descending GMV rates: the bigger you get, the smaller our cut. (Brand: 2.5% up to $50k · 2% up to $200k · 1.5% above)",
|
||||
"price.c1.t":"Published rate","price.c1.d":"Written and fixed in the contract — no surprises.","price.c2.t":"Export your data","price.c2.d":"All your data, exportable at any time.","price.c3.t":"Graceful exit","price.c3.d":"If you leave: a 60-day transition instead of an instant cut-off.",
|
||||
"price.founder.t":"Founding Partner program","price.founder.d":"First 3 operators: free setup for +1 percentage point for a year + a named case study.","price.founder.seats":"Seats left",
|
||||
"consent.t":"We measure what helps you — with your permission","consent.d":"We use advertising measurement to learn which ad brought you here. We do not collect your name or number, and you can decline and still use the whole site.","consent.yes":"Accept","consent.no":"Decline",
|
||||
"addons.eyebrow":"Composable","addons.title":"Three paid modules — and no more","addons.lead":"We don't sell safety or payments: they're in every plan. What we sell is what actually grows your margin.",
|
||||
"addon.badge.now":"Available now","addon.badge.soon":"Coming next quarter",
|
||||
"core.title":"In every plan — never sold as an add-on","core.lead":"An operator without a panic button or without a payment gateway isn't a lesser product — it's a product that doesn't work. So we don't price these.",
|
||||
"core.i1.t":"Trust & Safety","core.i1.d":"Panic button · fraud detection · driver assurance · AI document verification · regulator reports",
|
||||
"core.i2.t":"Local payments","core.i2.d":"PayMob · CliQ · SyriaTel & MTN Cash · Sham Cash · wallets and payout requests",
|
||||
"addons.m1.name":"AI Suite","addons.m1.desc":"Automated complaint triage, weekly operations advisor, payment reconciliation from provider SMS — your employee who never sleeps.","addons.m1.period":"/month",
|
||||
"addons.m2.name":"Pricing Intelligence","addons.m2.desc":"Market intelligence that derives the market's pricing formula and tunes yours to it. A 5% price change moves profit by 30%.","addons.m2.period":"/month","addons.m2.setup":"Setup $1,000 — local market calibration",
|
||||
"addons.m2.name":"Pricing Intelligence","addons.m2.desc":"A statistical engine that derives your market's pricing formula and demand elasticity, then tunes your tariff to it automatically. A 5% price change moves profit by 30% — this module decides that 5% from data, not instinct.","addons.m2.period":"/month","addons.m2.setup":"Setup $1,000 — local market calibration",
|
||||
"addons.m3.name":"Growth Suite","addons.m3.desc":"Re-engage idle riders, WhatsApp campaigns, gamification, challenges and referrals — a returning rider costs 10× less than a new one.","addons.m3.period":"/month",
|
||||
"addons.note":"Fleet Intelligence (heatmap, predictive demand, health reports) is no longer sold separately — it is now built into the Fleet+ plan.",
|
||||
"transit.eyebrow":"A separate product line","transit.title":"Public transit — buses on the same platform","transit.lead":"Not an add-on to a taxi app. A completely different buyer, bought because you run a mass-transit network — with its own funnel, spec and contract.",
|
||||
@@ -1454,13 +1477,14 @@ const I18N = {
|
||||
"price.gmvnote":"Taux GMV dégressifs : plus vous grandissez, plus notre part diminue. (Marque : 2,5% jusqu'à 50k$ · 2% jusqu'à 200k$ · 1,5% au-delà)",
|
||||
"price.c1.t":"Taux publié","price.c1.d":"Écrit et fixé dans le contrat — sans surprises.","price.c2.t":"Exportez vos données","price.c2.d":"Toutes vos données, exportables à tout moment.","price.c3.t":"Sortie élégante","price.c3.d":"Si vous partez : 60 jours de transition au lieu d'une coupure immédiate.",
|
||||
"price.founder.t":"Programme Partenaire Fondateur","price.founder.d":"3 premiers opérateurs : mise en place gratuite contre +1 point pendant un an + étude de cas nominative.","price.founder.seats":"Places restantes",
|
||||
"consent.t":"Nous mesurons ce qui vous sert — avec votre accord","consent.d":"Nous utilisons une mesure publicitaire pour savoir quelle annonce vous a amené ici. Nous ne collectons ni votre nom ni votre numéro, et vous pouvez refuser tout en utilisant l'intégralité du site.","consent.yes":"Accepter","consent.no":"Refuser",
|
||||
"addons.eyebrow":"Composable","addons.title":"Trois modules payants — pas un de plus","addons.lead":"Nous ne vendons ni la sécurité ni les paiements : ils sont dans chaque forfait. Ce que nous vendons, c'est ce qui augmente réellement votre marge.",
|
||||
"addon.badge.now":"Disponible maintenant","addon.badge.soon":"Prochainement ce trimestre",
|
||||
"core.title":"Dans chaque forfait — jamais vendu en option","core.lead":"Un opérateur sans bouton d'urgence ou sans passerelle de paiement n'est pas un produit incomplet — c'est un produit qui ne fonctionne pas. Nous ne les facturons donc pas.",
|
||||
"core.i1.t":"Confiance & Sécurité","core.i1.d":"Bouton d'urgence · détection des fraudes · assurance chauffeur · vérification IA des documents · rapports régulateur",
|
||||
"core.i2.t":"Paiements locaux","core.i2.d":"PayMob · CliQ · SyriaTel et MTN Cash · Sham Cash · portefeuilles et demandes de retrait",
|
||||
"addons.m1.name":"Suite IA","addons.m1.desc":"Tri automatique des plaintes, conseiller opérationnel hebdomadaire, rapprochement des paiements depuis les SMS opérateur — votre employé qui ne dort jamais.","addons.m1.period":"/mois",
|
||||
"addons.m2.name":"Renseignements Tarifaires","addons.m2.desc":"Renseignement de marché qui extrait la formule tarifaire du marché et y aligne la vôtre. 5% de variation de prix déplacent 30% du profit.","addons.m2.period":"/mois","addons.m2.setup":"Mise en place 1 000 $ — calibrage du marché local",
|
||||
"addons.m2.name":"Renseignements Tarifaires","addons.m2.desc":"Un moteur statistique qui extrait la formule tarifaire de votre marché et son élasticité de la demande, puis aligne votre tarif automatiquement. 5% de variation de prix déplacent 30% du profit — ce module décide ces 5% par les données, pas à l'instinct.","addons.m2.period":"/mois","addons.m2.setup":"Mise en place 1 000 $ — calibrage du marché local",
|
||||
"addons.m3.name":"Suite Croissance","addons.m3.desc":"Réactivation des passagers inactifs, campagnes WhatsApp, gamification, défis et parrainages — un passager qui revient coûte 10× moins cher qu'un nouveau.","addons.m3.period":"/mois",
|
||||
"addons.note":"Renseignements Flotte (carte thermique, demande prédictive, rapports de santé) n'est plus vendu séparément — il est désormais intégré au forfait Flotte+.",
|
||||
"transit.eyebrow":"Une ligne de produit distincte","transit.title":"Transport public — les bus sur la même plateforme","transit.lead":"Pas une option d'une app de taxi. Un acheteur totalement différent, qui achète parce qu'il exploite un réseau de transport collectif — avec son propre tunnel, cahier des charges et contrat.",
|
||||
@@ -1521,13 +1545,14 @@ const I18N = {
|
||||
"price.gmvnote":"Tasas GMV decrecientes: cuanto más creces, menor es nuestra parte. (Marca: 2,5% hasta $50k · 2% hasta $200k · 1,5% por encima)",
|
||||
"price.c1.t":"Tarifa publicada","price.c1.d":"Escrita y fijada en el contrato — sin sorpresas.","price.c2.t":"Exporta tus datos","price.c2.d":"Todos tus datos, exportables en cualquier momento.","price.c3.t":"Salida elegante","price.c3.d":"Si te vas: 60 días de transición en lugar de un corte inmediato.",
|
||||
"price.founder.t":"Programa Socio Fundador","price.founder.d":"Primeros 3 operadores: instalación gratis a cambio de +1 punto porcentual por un año + estudio de caso con tu nombre.","price.founder.seats":"Plazas restantes",
|
||||
"consent.t":"Medimos lo que te sirve — con tu permiso","consent.d":"Usamos medición publicitaria para saber qué anuncio te trajo aquí. No recogemos tu nombre ni tu número, y puedes rechazar y seguir usando todo el sitio.","consent.yes":"Aceptar","consent.no":"Rechazar",
|
||||
"addons.eyebrow":"Modular","addons.title":"Tres módulos pagados — ni uno más","addons.lead":"No vendemos ni la seguridad ni los pagos: están en todos los planes. Lo que vendemos es lo que realmente aumenta tu margen.",
|
||||
"addon.badge.now":"Disponible ahora","addon.badge.soon":"Próximamente este trimestre",
|
||||
"core.title":"En todos los planes — nunca se vende como complemento","core.lead":"Un operador sin botón de pánico o sin pasarela de pago no es un producto incompleto — es un producto que no funciona. Por eso no los cobramos.",
|
||||
"core.i1.t":"Confianza y Seguridad","core.i1.d":"Botón de pánico · detección de fraude · seguro del conductor · verificación de documentos con IA · reportes regulatorios",
|
||||
"core.i2.t":"Pagos locales","core.i2.d":"PayMob · CliQ · SyriaTel y MTN Cash · Sham Cash · billeteras y solicitudes de retiro",
|
||||
"addons.m1.name":"Suite de IA","addons.m1.desc":"Triaje automático de quejas, asesor operativo semanal, conciliación de pagos desde SMS del proveedor — tu empleado que nunca duerme.","addons.m1.period":"/mes",
|
||||
"addons.m2.name":"Inteligencia de Precios","addons.m2.desc":"Inteligencia de mercado que extrae la fórmula de precios del mercado y ajusta la tuya. Un cambio del 5% en el precio mueve el 30% del beneficio.","addons.m2.period":"/mes","addons.m2.setup":"Configuración $1.000 — calibración del mercado local",
|
||||
"addons.m2.name":"Inteligencia de Precios","addons.m2.desc":"Un motor estadístico que extrae la fórmula de precios de tu mercado y su elasticidad de demanda, y ajusta tu tarifa automáticamente. Un cambio del 5% en el precio mueve el 30% del beneficio — este módulo decide ese 5% con datos, no por intuición.","addons.m2.period":"/mes","addons.m2.setup":"Configuración $1.000 — calibración del mercado local",
|
||||
"addons.m3.name":"Suite de Crecimiento","addons.m3.desc":"Reactivación de pasajeros inactivos, campañas WhatsApp, gamificación, desafíos y referidos — un pasajero que vuelve cuesta 10× menos que uno nuevo.","addons.m3.period":"/mes",
|
||||
"addons.note":"Inteligencia de Flota (mapa de calor, demanda predictiva, informes de salud) ya no se vende por separado — ahora está integrada en el plan Flota+.",
|
||||
"transit.eyebrow":"Línea de producto independiente","transit.title":"Transporte público — autobuses en la misma plataforma","transit.lead":"No es un complemento de una app de taxi. Un comprador completamente distinto, que compra porque opera una red de transporte masivo — con su propio embudo, especificación y contrato.",
|
||||
@@ -1748,6 +1773,105 @@ function animateTimeline(){
|
||||
const l=localStorage.getItem("tripz_lang")||"ar";applyLang(l);
|
||||
}catch(e){applyLang("ar");}
|
||||
})();
|
||||
/* ============ MEASUREMENT (consent-gated) ============ ------------------
|
||||
⚠️ ضع معرّف البكسل هنا قبل أول دولار إعلاني. ما دام فارغاً لا يُحمَّل شيء.
|
||||
الأحداث تُسجَّل محلياً دائماً (بلا كوكيز وبلا بيانات شخصية) وتُرسل لميتا
|
||||
فقط بعد موافقة صريحة — مطلوب لزوّار الاتحاد الأوروبي (الموقع بالفرنسية
|
||||
والإسبانية). تعريف الأحداث وربطها بأهداف CAC في docs/32 §5. */
|
||||
const PIXEL_ID = ""; // <-- مثال: "1234567890123456"
|
||||
const CONSENT_KEY = "tripz_consent";
|
||||
|
||||
const Track = (() => {
|
||||
const local = [];
|
||||
let pixelReady = false;
|
||||
|
||||
function loadPixel(){
|
||||
if (pixelReady || !PIXEL_ID) return;
|
||||
pixelReady = true;
|
||||
/* Meta Pixel base */
|
||||
!function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod?
|
||||
n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n;
|
||||
n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0;
|
||||
t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}
|
||||
(window,document,'script','https://connect.facebook.net/en_US/fbevents.js');
|
||||
fbq('init', PIXEL_ID);
|
||||
fbq('track','PageView');
|
||||
local.forEach(([n,p]) => fbq('trackCustom', n, p));
|
||||
}
|
||||
|
||||
function consented(){ return localStorage.getItem(CONSENT_KEY) === "yes"; }
|
||||
|
||||
return {
|
||||
init(){ if (consented()) loadPixel(); },
|
||||
grant(){ localStorage.setItem(CONSENT_KEY,"yes"); loadPixel(); },
|
||||
deny(){ localStorage.setItem(CONSENT_KEY,"no"); },
|
||||
ev(name, params = {}){
|
||||
const p = Object.assign({ lang: document.documentElement.lang }, params);
|
||||
local.push([name, p]);
|
||||
if (pixelReady && window.fbq) fbq('trackCustom', name, p);
|
||||
if (location.protocol === "file:") console.debug("[track]", name, p);
|
||||
},
|
||||
seen: new Set()
|
||||
};
|
||||
})();
|
||||
|
||||
/* شريط الموافقة */
|
||||
(function(){
|
||||
const box = document.getElementById("consent");
|
||||
if (!box) return;
|
||||
if (!localStorage.getItem(CONSENT_KEY)) setTimeout(()=>box.classList.add("show"), 1600);
|
||||
document.getElementById("consentYes").onclick = () => { Track.grant(); box.classList.remove("show"); Track.ev("ConsentGranted"); };
|
||||
document.getElementById("consentNo").onclick = () => { Track.deny(); box.classList.remove("show"); };
|
||||
Track.init();
|
||||
})();
|
||||
|
||||
/* أحداث القمع — مطابقة لأهداف CAC في docs/32 */
|
||||
(function(){
|
||||
// عمق التصفّح: أي قسم وصله الزائر
|
||||
const secs = document.querySelectorAll("section[id]");
|
||||
if ("IntersectionObserver" in window){
|
||||
const io = new IntersectionObserver(es => es.forEach(e => {
|
||||
if (e.isIntersecting && !Track.seen.has(e.target.id)){
|
||||
Track.seen.add(e.target.id);
|
||||
Track.ev("SectionView", { section: e.target.id });
|
||||
}
|
||||
}), { threshold: .35 });
|
||||
secs.forEach(s => io.observe(s));
|
||||
}
|
||||
|
||||
// نية شراء: نقر على باقة / وحدة / مواصلات
|
||||
document.querySelectorAll("#pricing .plan").forEach(p => p.addEventListener("click", () => {
|
||||
Track.ev("PlanInterest", { plan: p.querySelector("h3")?.getAttribute("data-i18n") || "?" });
|
||||
}));
|
||||
document.querySelectorAll("#addons .addon-card").forEach(c => c.addEventListener("click", () => {
|
||||
Track.ev("ModuleInterest", { module: c.querySelector("h3")?.getAttribute("data-i18n") || "?" });
|
||||
}));
|
||||
|
||||
// استعمال الحاسبة = أقوى إشارة نية قبل التواصل
|
||||
let calcTimer;
|
||||
["trips","fare","cur","plan"].forEach(id => {
|
||||
const el = document.getElementById(id);
|
||||
el && el.addEventListener("change", () => {
|
||||
clearTimeout(calcTimer);
|
||||
calcTimer = setTimeout(() => Track.ev("CalculatorUsed", {
|
||||
plan: document.getElementById("plan")?.value,
|
||||
currency: document.getElementById("cur")?.value?.split(":")[0]
|
||||
}), 800);
|
||||
});
|
||||
});
|
||||
|
||||
// التحويل: كل مسارات الاتصال
|
||||
document.querySelectorAll('a[href*="wa.me"]').forEach(a => a.addEventListener("click", () => {
|
||||
Track.ev("Lead", { channel: "whatsapp", where: a.closest("section")?.id || "float" });
|
||||
}));
|
||||
document.querySelectorAll('a[href*="calendly"]').forEach(a => a.addEventListener("click", () => {
|
||||
Track.ev("Lead", { channel: "calendly", where: a.closest("section")?.id || "?" });
|
||||
}));
|
||||
document.querySelectorAll('a[href*="apps.apple.com"],a[href*="play.google.com"]').forEach(a => a.addEventListener("click", () => {
|
||||
Track.ev("DemoAppOpened");
|
||||
}));
|
||||
})();
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user