المعرّفات لا تتطابق لأن Shopify و Stripe لا يصدّران الشيء نفسه.
ملفات CSV لطلبات Shopify تصف الطلبات. ملفات CSV لمعاملات Stripe تصف المدفوعات والالتقاطات والاستردادات وحركات الرصيد. إن حاولت مطابقة #1042 من Shopify مع ch_3P8x... من Stripe، فالملفان ليسا خاطئَين. أنت تقارن رقم طلب بسجل دفع.
لمطابقة أرقام طلبات Shopify مع معاملات Stripe في ملف CSV، العمل الحقيقي هو إيجاد المفتاح المشترك بين الملفَّين أولاً. بعد ذلك فقط تبدأ مطابقة الصفوف.
أي القيم تتطابق فعلاً
قبل تنظيف الأعمدة أو كتابة المعادلات، حدّد أي زوج من الحقول تقارنه.
| ما تراه على الشاشة | ما يخزّنه Shopify | ما يخزّنه Stripe | نتيجة محاولة المطابقة |
|---|---|---|---|
#1042 | Name في تصدير طلبات Shopify | id من نوع ch_3P8x... | لا تطابق. الأول رقم طلب. والثاني معرّف تحصيل. |
6721948832513 | Id في تصدير طلبات Shopify أو Order في سجل المعاملات | id من نوع ch_3P8x... | لا تطابق. المعرّف الداخلي لطلب Shopify ليس الكيان نفسه لمعرّف معاملة Stripe. |
c1027508764856.2 | إدخال واحد داخل Payment References | المرجع نفسه لدى مزوّد الدفع في تصدير مرتبط بـ Stripe أو في حقل بيانات وصفية | تطابق مباشر، إن وُجد هذا المرجع بالضبط على الجانبَين. |
1042 | رقم طلب Shopify المنظَّف من Name بعد حذف # | metadata[order_number] أو حقل بيانات وصفية مشابه في Stripe | المطابقة تعمل إن كانت البيانات الوصفية مكتوبة ومُصدَّرة. |
$84.20 في اليوم نفسه | Total وPaid at | Amount وCreated | غير آمن. الطلبات المكررة والمحاولات المتعددة والاستردادات وفوارق التوقيت تولّد تطابقات كاذبة. |
هذا الجدول يلخّص المشكلة بأكملها.
أغلب محاولات المطابقة تفشل لأن أحدهم يستخدم الصف الأول في الجدول متوقعاً منه أن يتصرف كالصف الثالث أو الرابع.
Shopify يتيح أكثر من مرجع لكل طلب
Shopify يُصدِّر عدة معرّفات، ولكل منها وظيفة مختلفة.
| حقل Shopify | ما يمثّله | متى تستخدمه |
|---|---|---|
Name | رقم الطلب الظاهر في Shopify، وغالباً يبدأ بـ # | استخدمه حين تخزّن البيانات الوصفية لـ Stripe رقم الطلب، أو حين تحتاج مرجعاً مقروءاً |
Id | المعرّف الداخلي للطلب في Shopify | استخدمه فقط إن كان المعرّف الداخلي نفسه قد مُرِّر إلى البيانات الوصفية لـ Stripe أو حقل ربط آخر |
Payment ID | معرّف الدفع المُرسَل من Shopify للمدفوعات الناجحة أو المعلّقة | استخدمه حين يتضمن تصدير Stripe المرجع نفسه من جانب الدفع |
Payment References | جميع معرّفات الدفع المرتبطة بالطلب، بما فيها المدفوعات المرفوضة والاستردادات والالتقاطات | استخدمه حين يضم الطلب أحداث دفع متعددة وتحتاج السجل الكامل لا آخر ناجح فحسب |
هذا هو سبب حصول شخصَين يصدّران الطلب نفسه من Shopify على نتائج مطابقة مختلفة.
تصدير واحد منظّم حول الطلبات. تصدير آخر منظّم حول المعاملات. تصدير سجل المعاملات يعطيك صفاً لكل حدث دفع مُلتقَط، لا صفاً لكل طلب. ولا يشمل كل حالات بوابة الدفع الممكنة. إن كنت تقارن تفويضات أو محاولات إعادة أو أحداث دفع أخرى غير موجودة في هذا التصدير، فملف Shopify الذي حمّلته قد لا يعمل على المستوى نفسه.
القرار الأول ليس «أي معادلة أستخدم؟» بل «هل أطابق صفوف طلبات مع صفوف طلبات، أم صفوف مدفوعات مع صفوف مدفوعات؟»
إن تجاهلت هذا السؤال، ستجد نفسك في الموقف نفسه الموصوف في سبب بطء مطابقة طلبات Shopify مع مدفوعات Stripe، حيث ملف منظّم حول الطلبات والآخر حول نشاط التسوية.
Stripe يُصدِّر كيان الدفع لا طلب Shopify
ملفات CSV لـ Stripe تُبنى في الغالب حول معرّفاتها الخاصة:
- معرّفات التحصيل
- معرّفات نية الدفع
- معرّفات الاسترداد
- معرّفات معاملات الرصيد
- سجلات المدفوعات
هذه معرّفات صحيحة. لكنها ليست معرّفات طلبات Shopify.
هذا الفارق مهم لأن طلباً واحداً في Shopify قد ينشئ عدة سجلات في Stripe:
- محاولة دفع فاشلة
- تحصيل ناجح
- التقاط
- استرداد
- نزاع أو تعديل
إن كان ملف Shopify يحمل صف طلب واحد وملف Stripe يحمل ثلاثة صفوف مدفوعات مرتبطة بذلك الطلب، فستفشل المطابقة صفاً بصف حتى حين تكون البيانات صحيحة.
هنا تصبح البيانات الوصفية ضرورية. إن كان Stripe يحمل حقل بيانات وصفية مثل shopify_order_id أو order_number، يمكن لذلك الحقل أن يكون الجسر نحو Shopify. لكن بعض تصديرات Stripe لا تُظهر البيانات الوصفية بشكل افتراضي. القيمة قد تكون موجودة في كيان Stripe ومع ذلك تكون مفقودة في ملف CSV الذي حمّلته.
هذا ما يقود إلى استنتاج خاطئ شائع:
«Stripe لا يحمل مرجع Shopify.»
أحياناً Stripe يحمله. تصديرك فحسب لا يتضمنه.
أنشئ جدول الربط قبل أي مطابقة
المطابقة الموثوقة تحتاج مفتاحاً مشتركاً ثابتاً. بدونه، لن تطابق سجلات. أنت تخمّن استناداً إلى المبالغ والتواريخ.
الطريقة الصحيحة: أنشئ أولاً جدول ربط صغيراً.
| عمود العمل | مصدره | الغرض منه |
|---|---|---|
shopify_order_number_clean | حقل Name في Shopify بعد حذف # | يُتيح المقارنة مع بيانات Stripe الوصفية التي تخزّن 1042 لا #1042 |
shopify_internal_order_id | حقل Id في Shopify أو Order في سجل المعاملات | مفيد فقط إن وُجد المعرّف الداخلي نفسه في جانب Stripe |
shopify_payment_reference_single | قيمة واحدة مُستخرَجة من Payment References | يمنع خلية Shopify المحتوية على مراجع متعددة من إخفاء محاولات دفع متعددة |
stripe_transaction_id | حقل id في Stripe | معرّف سجل Stripe الأصيل |
stripe_metadata_order_number | تصدير البيانات الوصفية لـ Stripe، إن وُجد | في الغالب أقصر طريق نحو حقل Name في Shopify |
stripe_metadata_shopify_order_id | تصدير البيانات الوصفية لـ Stripe، إن وُجد | طريق مباشر نحو المعرّف الداخلي للطلب في Shopify |
amount وtimestamp | كلا الملفَّين | للمراجعة فقط، لا تجعلها مفتاح الربط الأساسي |
ثلاث قواعد تجعل هذا يعمل.
1. قسّم `Payment References` إلى مرجع واحد لكل صف.
إن أعطاك Shopify c1027508764856.1 + c1027508764856.2، فهذان ليسا مرجعاً واحداً. هما مرجعان. أحدهما قد يمثّل محاولة فاشلة والآخر الدفع الناجح. إن تركتهما في خلية واحدة، فقدت القدرة على مطابقة كل حدث بشكل صحيح.
2. احتفظ برقم الطلب المقروء منفصلاً عن معرّفات الدفع.
#1042 مفيد للمراجعة. ليس من الفئة نفسها لـ ch_3P8x.... لا تُلغِ أحدهما بالآخر في عمود «منظَّف». احتفظ بكليهما.
3. نظِّم التنسيق دون فقدان المعنى.
احذف # من أرقام طلبات Shopify إن كانت بيانات Stripe الوصفية تخزّن أرقاماً خالصة. احذف المسافات الزائدة. احتفظ بالأحرف الأولى في مراجع الدفع. قيمة تبدأ بـ c أو ch_ تخبرك بالنظام الذي أنشأها. لا تبتره.
ترتيب المطابقة الذي يعمل في الواقع
بعد بناء جدول الربط، طابق بهذا الترتيب.
1. طابق مرجع الدفع بمرجع الدفع
إن ظهر حقل Payment ID في Shopify أو قيمة منفردة من Payment References في جانب Stripe، فاستخدمها أولاً. هذا أقرب شيء لمفتاح معاملة حقيقي بين النظامَين.
هذا أفضل الحالات لأنه يصل حدث الدفع مباشرةً دون الحاجة للتخمين من الإجماليات.
2. طابق المعرّف الداخلي للطلب في Shopify مع البيانات الوصفية لـ Stripe
إن كانت البيانات الوصفية لـ Stripe تحمل المعرّف الداخلي لطلب Shopify، طابق حقل Id في Shopify أو Order في سجل المعاملات مع ذلك الحقل.
هذا خيار متين لأن المعرّفات الداخلية ثابتة. القيد: يجب أن يكون الحقل قد كُتب في Stripe وأن يكون مُدرَجاً في التصدير.
3. طابق رقم طلب Shopify مع البيانات الوصفية لـ Stripe
إن كانت البيانات الوصفية لـ Stripe تخزّن رقم الطلب لا المعرّف الداخلي، نظّف حقل Name في Shopify لئلا يفشل #1042 و1042 بسبب التنسيق وحده.
هذا المسار جيد للمراجعة والتقارير الموجّهة للعملاء لأن رقم الطلب مقروء. لكنه أضعف من المعرّف الداخلي حين تنسّق أنظمة مختلفة أسماء الطلبات بطرق مختلفة.
4. استخدم المبالغ والطوابع الزمنية فقط لمراجعة ما تبقى
هنا تنحرف أغلب جداول البيانات عن المسار.
المبالغ والتواريخ ليست مفاتيح مطابقة آمنة في ملفات Shopify و Stripe لأن:
- المبلغ نفسه قد يظهر أكثر من مرة في اليوم الواحد
- طلب واحد قد يحمل محاولات دفع متعددة
- تحدث الاستردادات في أحيان كثيرة بعد البيع الأصلي بفترة طويلة
- الطابع الزمني للطلب والطابع الزمني للدفع غالباً لا يمثّلان الحدث نفسه
- فوارق التوقيت بين المناطق قد تزحزح التاريخ دون تغيير الدفع
إن كانت التواريخ جزءاً من مراجعتك، فعاملها كأدلة داعمة. لا تجعلها مفتاح الربط الأساسي، خاصة إن كنت ترى الأنماط الموصوفة في التفاوت بين طوابع وقت Stripe بتوقيت UTC وتواريخ كشف الحساب البنكي CSV.
لماذا تبدو سجلات صحيحة غير متطابقة
حين يُظهر المصنّف أن الصفوف لا تتوافق، في الغالب يكون أحد هذه الأسباب وراء ذلك.
طابقت بيانات على مستوى الطلب مع بيانات على مستوى الدفع.
طلب واحد في Shopify قد يقابل عدة سجلات في Stripe. الملف ليس مخطئاً. مستوى التفصيل هو المشكلة.
تصدير Stripe لا يتضمن حقل الربط.
البيانات الوصفية قد تكون موجودة في Stripe، لكن ملف CSV الذي صدّرته قد يحذفها. إن كان مفتاح الربط مفقوداً من الملف، ستفشل المطابقة حتى إن كان كيان الدفع الأصلي يحمله.
`Payment References` يحتوي أكثر من قيمة.
طلب واحد في Shopify قد يحمل عدة معرّفات دفع. إن عاملت الخلية كاملةً مفتاحاً واحداً، لن يتطابق أي من أحداث الدفع الفردية بشكل صحيح.
تستخدم `Name` لأنه مألوف لديك.
هذا الفخ الأكثر شيوعاً. #1042 سهل القراءة، فيحاول الجميع إرجاع كل شيء إليه. ملفات معاملات Stripe لم تُبنَ حول ما هو أسهل في القراءة. بُنيت حول كيانات الدفع.
الاستردادات تُطابَق مع صف البيع الأصلي.
الاستردادات تحتاج منطق صف خاصاً بها. ليست نسخاً سلبية من سطر تصدير الطلب الأصلي.
الطوابع الزمنية تختلف حتى حين يكون الدفع نفسه.
إنشاء الطلب في Shopify والتقاط الدفع وإنشاء المعاملة في Stripe يمكن أن تقع في أوقات مختلفة. إن فرضت تطابقاً دقيقاً للتاريخ، ستبدو سجلات صحيحة مكسورة.
كيف يبدو الناتج النهائي الموثوق
حين تكون المطابقة صحيحة، يجب أن يستطيع ملف عملك الإجابة على هذه الأسئلة دون بحث يدوي:
| السؤال | يجب أن يجيب الملف بـ |
|---|---|
| إلى أي طلب في Shopify تنتمي هذه المعاملة في Stripe؟ | رقم الطلب والمعرّف الداخلي له |
| أي حدث دفع في Stripe ينتمي لهذا الطلب في Shopify؟ | معرّف المعاملة أو مرجع الدفع |
| هل هذا الصف بيع أم محاولة معادة أم استرداد أم التقاط؟ | نوع الحدث موضّح بوضوح |
| هل جرت المطابقة بمفتاح مباشر أم بمنطق مراجعة؟ | عمود يبيّن طريقة المطابقة |
| ما الصفوف التي لم تُحسَم بعد؟ | قائمة مختصرة بالصفوف غير المتطابقة مع السبب |
إن لم تستطع ورقتك الإجابة على هذه الأسئلة الخمسة، فهي لم تكتمل. ربما معظم الصفوف متوافقة، لكنها لم تصل بعد إلى المستوى الذي يمكن الاعتماد عليه الشهر القادم.
مع الحجم الصغير، يمكن إدارة جدول الربط يدوياً.
مع الحجم المتكرر، يتوقف العمل الحقيقي عن كونه حكماً في المطابقة ليصبح صيانة ملفات:
- تقسيم مراجع الدفع متعددة القيم
- تنظيم أرقام الطلبات
- إعادة تصدير Stripe بالحقول الصحيحة
- إعادة بناء عمليات الربط نفسها
- مراجعة حالات الاستثناء غير المحسومة نفسها مرة أخرى
عند تلك النقطة، تتحوّل المشكلة من «ماذا يعني هذا المعرّف؟» إلى «لماذا ما زلت أُجري هذا التعيين اليدوي في جدول بيانات كل شهر؟»
