معظم استعادة السلال المتروكة تتم عبر البريد الإلكتروني. المكالمة الهاتفية تعمل بشكل مختلف، لأن المكالمة هي وحدها التي تحتاج إلى حُكم. مراسلة من اشترى بالفعل بالبريد أمر هيّن؛ أما الاتصال به فدقيقة سيئة لكما معًا.
لهذا فإن معظم هذا الدليل لا يتحدث عن الاتصال، بل عن كل ما يجب أن يكون صحيحًا قبل ذلك: أن عملية دفع حقيقية موجودة، وأن الشخص لم يشترِ فعلًا، وأن الوقت ليس منتصف الليل عنده، وأنه لم يطلب منك أبدًا التوقف عن الاتصال به، وأنك تعرف اسمه بما يكفي لتبدأ به المكالمة.
خصص نصف ساعة. معظمها يُقضى في Shopify، لا هنا.
الخلاصة المختصرة
١. أنشئ تطبيق Shopify، وعلّم على أربعة أذونات، وثبّته ٢. انسخ سرّين مختلفين من Shopify ٣. احفظهما في Omni Octo كاتصالين ٤. اطلب من Octo أن يبني التدفق ٥. انسخ عنوان الويبهوك والصقه في Shopify، مرتين ٦. اختبر بمدة انتظار دقيقة واحدة
الخطوتان ١ و٥ هما موضع التعثر. لكل منهما قسمها الخاص.
الخطوة ١ — أنشئ تطبيق Shopify وثبّته
في Shopify: الإعدادات ← Apps and sales channels ← Develop apps ← Create an app. أعطه اسمًا ستتعرف عليه لاحقًا.
علّم على هذه الأذونات
افتح Configuration ← Admin API integration ← Configure وامنح:
| الإذن | الغرض منه |
|---|---|
read_orders | التحقق مما إذا كان المتسوق قد أكمل الشراء |
read_all_orders | التحقق نفسه على الطلبات الأقدم من ٦٠ يومًا |
read_customers | اسم المتسوق ورقم هاتفه |
read_products | قراءة ما كان في السلة |
ستبحث عن إذن خاص بالدفع (checkout) ولن تجده. إذن read_checkouts موجود،
لكن Shopify يعامله على أنه محمي: فهو ليس في القائمة التي يمكنك التعليم عليها،
وطلب الأمر يحتاج إلى موافقة Shopify نفسها. إذا استدعيت واجهة الدفع بدونه،
فسيجيبك Shopify:
This action requires merchant approval for
read_checkoutsscope.
هذا لا بأس به، وهو السبب في أن هذا التدفق لا يقرأ عمليات الدفع أبدًا. إنه
يسأل سؤالًا أفضل بدلًا من ذلك — هل ظهر طلب؟ — وهذا يحتاج إلى read_orders
فقط.
ثبّته
هذه هي الخطوة التي ينساها الجميع. تهيئة التطبيق لا تفعل شيئًا حتى تضغط Install app في صفحة Overview الخاصة بالتطبيق. قبل ذلك، لا يوجد رمز وصول إلى Admin API يمكن نسخه، وكل خطوة لاحقة تفشل بطريقة توهم أن شيئًا آخر قد تعطّل.
انسخ سرّين، ولا تخلط بينهما
تحتاج إلى شيئين مختلفين، ومن السهل الخلط بينهما لأن كليهما يبدو كسلسلة أحرف عشوائية.
| ما هو | أين تجده | ماذا يفعل |
|---|---|---|
| رمز الوصول إلى Admin API | علامة تبويب API credentials في التطبيق، بعد التثبيت. يبدأ بـ shpat_ | يتيح لـ Omni Octo طرح الأسئلة على Shopify |
| سر توقيع الويبهوك | الإعدادات ← الإشعارات ← Webhooks، في أسفل الصفحة | يتيح لـ Omni Octo التحقق من الرسائل التي يرسلها Shopify |
أحدهما للحديث مع Shopify. والآخر للتأكد من أن Shopify هو فعلًا من أرسل شيئًا. الخلط بينهما هو أغلى خطأ في هذا الإعداد كله، والعَرَض لا يشبه السبب إطلاقًا — انظر عندما لا يحدث شيء.
الخطوة ٢ — احفظ السرّين في Omni Octo
اذهب إلى صفحة Connections وأضِفهما واحدًا في كل مرة.
رمز الوصول إلى Admin API. اضغط New connection ثم اختر بطاقة
HTTP / API key ضمن Other. الصق رمز shpat_. أعطِ الاتصال اسمًا ستتعرف
عليه في قائمة — «رمز Shopify Admin API» خير من «Shopify».
سر توقيع الويبهوك. اضغط New connection مرة أخرى واختر Signing secret، ثم الصق السرّ من صفحة الإشعارات. النموذج يقول ما يستحق التذكر:
The secret the sender signs with, not a key you call them with.
اتصالان، اتجاهان. احفظهما معًا قبل أن تبني أي شيء.
الخطوة ٣ — اطلب من Octo أن يبني التدفق
أنت لا تكتب الأتمتة بنفسك. افتح المحادثة وصف ما تريده، بما في ذلك الجزء المتعلق بحفظ المتسوق كجهة اتصال:
عندما يترك أحدهم سلة الشراء في متجري على Shopify، انتظر نحو ثلاثين دقيقة ثم اتصل به. احفظه أولًا كجهة اتصال، مع اسمه ورقم هاتفه، ليتمكن الوكيل من تحيّته باسمه. اتصل من الرقم +1 555 0100 مستخدمًا وكيلي Shopify Cart Recovery.
قل جزء جهة الاتصال بصوت مسموع. سيبني Octo تدفقًا يعمل من دونه، لكن الوكيل يفتتح بـ«مرحبًا» بدلًا من «مرحبًا سارة»، لأن التحية تأخذ الاسم من سجل جهات الاتصال لديك لا من رسالة Shopify. طلب هذا هو الفرق بين مكالمة استعادة ومكالمة باردة.
سيقرأ Octo اتصالاتك، وسيجد وكيلك، وقد يسألك عن سر التوقيع الواجب استخدامه إن كنت حفظت أكثر من واحد. أجب بسر التوقيع، لا برمز Admin.
ثم تحقق من أنه يظهر بحالة نشط. التدفق الذي ما يزال مسودّة يرفض كل ما يرسله Shopify، ويمتلئ سجل التسليم لدى Shopify بإخفاقات تبدو كعنوان خاطئ.
الخطوة ٤ — أعطِ Shopify العنوان
افتح التدفق وابحث عن بطاقة Webhook endpoint أعلى المخطط. تعرض العنوان وحالة:
- Ready — يعمل، مع سر توقيع محفوظ
- Inactive — متوقف مؤقتًا أو ما يزال مسودّة، ولذلك تُرفض رسائل Shopify
اضغط Copy. ثم في Shopify اذهب إلى الإعدادات ← الإشعارات ← Webhooks ← إنشاء webhook وأضِف اثنين منها، ملصقًا العنوان نفسه في كليهما:
| الحدث | الصيغة | لماذا |
|---|---|---|
| إنشاء عملية دفع | JSON | ينطلق عندما يصل أحدهم إلى الدفع |
| تحديث عملية دفع | JSON | ينطلق عندما يملأ بيانات إضافية |
لماذا اثنان، بعبارة مبسطة
يخبرك Shopify بعملية الدفع لحظة بدء أحدهم فيها — وكثيرًا ما يكون ذلك قبل أن يكتب رقم هاتف. ويخبرك مرة أخرى في كل مرة يملأ فيها شيئًا، وإحدى تلك الرسائل اللاحقة هي عادة التي تحمل الرقم.
اشترك في الأولى فقط وستحصل على تدفقات تبدأ دون أحد للاتصال به. اشترك في الاثنتين وسيكون لديك أحد للاتصال به.
القائمة المنسدلة نفسها تعرض إنشاء عربة التسوق، وهو يبدو مناسبًا وليس كذلك. عربة التسوق مجرد سلة — لا يمتلك Shopify بريدًا ولا هاتفًا ولا اسمًا لها، فلا يوجد من نتصل به. استخدمه فقط إذا أردت إشارة غير ضارة إلى أن الويبهوكس تصل فعلًا.
أنشئ هذه الويبهوكس في مسؤول Shopify، يدويًا، في هذه الصفحة. لا تنشئها عبر واجهة Shopify API. جرّبنا الطريقتين: تلك التي أُنشئت في هذه الصفحة وصلت خلال نحو ثلاثين ثانية؛ وتلك التي أُنشئت عبر الواجهة لم تصل إطلاقًا خلال أكثر من ساعة، ولم يعطِ Shopify خطأً في الحالتين.
اضغط إرسال اختبار على أحدها. ينبغي أن يظهر شيء في قائمة تشغيلات تدفقك خلال دقيقة. هذه النقرة الواحدة هي أسرع طريقة لإثبات أن الاتصال يعمل، وهي لا تكلف شيئًا.
الخطوة ٥ — اختبره في دقيقة واحدة
اطلب من Octo تغيير مدة الانتظار إلى دقيقة.
أولًا، ضع رقم هاتفك أنت على سجل عميل. في Shopify: العملاء ← اختر عميلًا ببريدك الإلكتروني أو أنشئه ← أضف رقم هاتفك واحفظ.
افعل هذا قبل التسوق. كتابة رقم الهاتف في صفحة الدفع لا تكفي — في صفحة الدفع ذات الصفحة الواحدة لدى Shopify لا توجد خطوة لإرساله قبل السداد، فقد لا يصل رقم تكتبه هناك إلى Shopify أبدًا. أضعنا ليلة كاملة بسبب هذا. الرقم الموجود على سجل العميل يرافق عملية الدفع منذ الرسالة الأولى، وهذا ما يجعل الاختبار ينجح.
ثم:
١. سجّل الدخول إلى واجهة متجرك بهوية ذلك العميل ٢. أضف شيئًا إلى السلة ٣. اذهب إلى الدفع، لكي تُحمَّل الصفحة ٤. أغلق علامة التبويب
ينبغي أن يرن هاتفك بعد نحو دقيقة من تسليم Shopify الرسالة. لا تحتاج إلى كتابة أي شيء في نموذج الدفع.
ثم اطلب من Octo إعادة الانتظار إلى ثلاثين دقيقة. عند مدة دقيقة واحدة، يتصل التدفق بأشخاص ما يزالون يكتبون رقم بطاقتهم.
عندما لا يحدث شيء
هذا هو القسم الذي تمنّينا لو كنا نملكه. اتبعه بالترتيب — كل بند فيه هو شيء أوقف اختبارًا فعلًا.
لا يصل شيء إلى التدفق إطلاقًا
هل ضغطت Install app؟ تهيئة الأذونات ليست تثبيتًا.
هل أُنشئت الويبهوكس في مسؤول Shopify لا عبر الواجهة؟ انظر إلى ما سبق. هذا هو ما كلفنا أكثر الوقت بفارق كبير.
هل التدفق نشط؟ المسودّة ترفض كل شيء.
هل أنشأت التدفق أو عدّلته للتو؟ امنحه دقيقتين. التدفق الجديد تمامًا يجيب لوهلة بأنه «غير جاهز» أثناء التقاطه، ويعيد Shopify المحاولة من تلقاء نفسه.
تحقق أولًا من سجل التسليم لدى Shopify نفسه، على الويبهوك الذي أنشأته. إذا لم يُظهر Shopify تسليمًا، فالمشكلة في جانبهم من الخط، ولا شيء في Omni Octo سيفسرها لك.
يرسله Shopify، لكن التدفق يرفضه
في الغالب يكون السرّ الخطأ. أي سرّ يوقّع يعتمد على كيف أُنشئ الويبهوك، وهذا غير بديهي:
| الويبهوك المُنشأ… | موقّع بـ |
|---|---|
| يدويًا، في صفحة الإشعارات | سر التوقيع الموجود في الصفحة نفسها |
| بواسطة تطبيق، عبر الواجهة | مفتاح الـAPI السرّي الخاص بذلك التطبيق |
إذا اتبعت هذا الدليل فأنت تريد الصف الأول. وجّه التدفق إلى اتصال سر التوقيع من الخطوة ٢.
يبدأ التدفق، لكن لا أحد يتصل به
هل كان هناك رقم هاتف؟ افتح التشغيل وانظر إلى ما وصل. لا رقم يعني لا مكالمة، ذلك بالتصميم.
الإضافة إلى السلة لا تكفي. السلة وحدها لا تخبر Shopify بأي شيء. على الشخص أن يصل إلى صفحة الدفع، وأن يمتلك Shopify وسيلة للتواصل معه — إما من الحساب الذي سجّل الدخول به، أو مما يكتبه هناك.
كتابة رقم الهاتف ليست إرساله. في صفحة الدفع ذات الصفحة الواحدة لدى Shopify لا يوجد زر «متابعة» قبل السداد، فقد لا يصل رقم يكتبه أحدهم إلى Shopify أبدًا. الحل الموثوق هو البند التالي.
ضع رقم هاتف على سجل العميل. في Shopify: العملاء ← الشخص ← أضف هاتفه. رقم المتسوق الذي سجّل دخوله يرافق عندئذ عملية الدفع منذ الرسالة الأولى، فلا يعود أي مما سبق مهمًا. هذا هو التغيير الوحيد الذي جعل اختبارنا ناجحًا.
تسجيل الدخول عبر رسالة نصية لا يُحتسب. إذا أرسل Shopify رمزًا نصيًا للدخول، فذلك الرقم يخص نظام تسجيل الدخول لدى Shopify. إنه لا يصل أبدًا إلى سجل عملائك ولا يمكنك استخدامه.
الاختبار على متجر تجريبي أو محمي بكلمة مرور
تحتاج إلى كلمة مرور واجهة المتجر لتتسوق في متجرك أنت، من المتجر الإلكتروني ← التفضيلات ← الحماية بكلمة مرور.
لا تثق بـ onlineStoreUrl كدليل على نشر منتج. في المتجر المحمي بكلمة مرور
يُبلغ عنه Shopify باعتباره فارغًا لـكل منتج، منشورًا كان أم لا. أضعنا وقتًا
ننشر منتجات كانت منشورة أصلًا. افتح صفحة المنتج بكلمة المرور وانظر بنفسك.
ما الذي يوقف مكالمة
أربعة تحققات. كل واحد منها موضع ينتهي فيه التشغيل بهدوء وصواب بدلًا من الفشل. ما تراه بعده يختلف، لذا يستحق الأمر أن تعرف أيّها أيّ.
لقد اشترى. بعد الانتظار، نسأل Shopify إن كان قد نشأ طلب لعملية الدفع تلك. إن وُجد، يتوقف التشغيل. هذا هو السبب الوحيد لوجود الانتظار: يحتسب Shopify عملية الدفع متروكة لحظة كتابة أحدهم بريده الإلكتروني، وكثيرًا ما يكون ذلك بينما لا يزال يمد يده إلى بطاقته.
لم نستطع التحقق. إذا فشل هذا التحقق — رمز منتهي الصلاحية، أو إذن أُزيل، أو مشكلة شبكة — يتوقف التشغيل دون اتصال. التخمين في الاتجاه الآخر يعني الاتصال بمن دفع فعلاً.
كلاهما يحدث قبل الخطوة الأولى، لأن التحقق جزء من المشغّل. لذلك يظهر التشغيل المتوقف بهذه الطريقة بأنه مكتمل دون تشغيل أي خطوات — لم يُحفظ شيء ولم يُطلب رقم. حتى اليوم، لا توضّح شاشة التشغيل أيّ الاثنين كان؛ إذا كانت التشغيلات تكتمل دون خطوات بينما كنت تتوقع مكالمات، فتحقق أولًا من اتصال Admin API.
إنه الليل عنده. ساعات الاتصال تُشتق من رمز بلد رقم الهاتف، والرقم الذي نعجز عن إيقاعه في منطقة زمنية هو رقم لن نتصل به. وفي البلد الممتد على عدة مناطق، يجب أن يكون النهار في جميعها.
طلب منك التوقف. قيد «عدم الاتصال» الخاص بذلك الرقم يمنع المكالمة قبل طلب أي رقم، ويسجّل التشغيل الرفض بدل الفشل.
ما الذي لن يفعله هذا
لن ينشئ لك ويبهوكس Shopify. أنت تلصق العنوان بنفسك، مرتين.
لن يخترع رقم هاتف. لا رقم، لا مكالمة.
تعامل مع مكالمة الاستعادة على أنها «مرة واحدة على الأقل»، لا «مرة واحدة بالضبط». يرسل Shopify رسالة في كل مرة يغيّر المتسوق شيئًا، وكل رسالة تبدأ تشغيلًا خاصًا بها. تُقارَن هذه التشغيلات ببعضها فتنتج عادة مكالمة واحدة، لكن فاصلًا طويلًا بما يكفي بين الرسائل قد ينتج مكالمة ثانية. يستحق الأمر معرفته قبل توجيه هذا إلى عملاء حقيقيين.
أبقِ نسخة الـAPI محدثة. يسجّل اتصال Admin API نسخة واجهة Shopify الواجب استخدامها. يدعم Shopify كل نسخة نحو سنة، ثم يجيب بصمت بنسخة أقدم بدلًا من إخبارك. إن مضت سنة، فحدّثها.