ربط القنوات

صفحة الفيسبوك مش ظاهرة عند الربط؟ ضيعت 4 ساعات في فخ الـ Business Portfolio بتاع ميتا

بقلم Omar Eltak · October 10, 2026 · 12 min read

أنا بنيت OT1-Pro عشان أي شركة تربط صفحة الفيسبوك بتاعتها في ضغطتين وتبدأ ترد على رسايل الماسنجر من إنبوكس واحد. وبعدين عميل عندي من القاهرة داس Connect، ودخل بحسابه، والـ OAuth نجح، والقايمة اللي المفروض يختار منها الصفحة طلعت فاضية تماماً. لا إيرور. لا تهنيج. بس ليستة فاضية والصفحة شغالة وموجودة قدامه في الـ Business Suite. أنا ضيعت حوالي 4 ساعات بخمّن قبل ما أوصل للسبب الحقيقي، وأنا بكتب المقال ده بالمصري كده عشان انت ما تضيعش وقتك زيي.

السبب هو اللي بسميه فخ الـ Business Portfolio: الـ endpoint بتاع /me/accounts بيرجع بس الصفحات اللي حسابك الشخصي عليه دور أدمن مباشر على الصفحة نفسها. وعمره ما بيرجع الصفحات اللي واخد عليها صلاحية عن طريق الـ Business Portfolio — يعني تعيينات الـ New Pages Experience، وموظفين الأجينسي اللي متضافين جوه الـ Business Suite، والتيم اللي مكتوب قدامه "Full access". حتى لو الـ Suite مطلعك أدمن في كل حتة، الـ API بيقول انك ما تملكش حاجة. ولو الأجينسي بتاعتك عايشة جوه الـ Business Suite، وده الطبيعي لأي أجينسي حقيقية، فالربط العادي هيخبي صفحاتك بالتصميم مش بالغلط.

الحل اللي شحناه في OT1-Pro يوم 2026-10-07 كان بسيط أول ما شفنا الصورة: نطلب صلاحية business_management وقت الـ OAuth، وبعدين نسأل الاتنين /me/accounts و /me/businesses وبعدين لكل بيزنس نجيب {biz-id}/owned_pages زائد {biz-id}/client_pages، وندمج ونمنع التكرار في FacebookPlatform::fetchBusinessMediatedPages(). لو انت بتدور على حل مشكلة facebook page not showing فالمقال ده هيديك خطوات الفحص والكود والبديل اللي يخليك تبيع وانت مستني ميتا تخلص ورقها.

ولو عايز خلفية البيروقراطية بتاعة ميتا كلها — توثيق البيزنس والـ App Review وليه التطبيق بتاعنا 1469090344742803 شغال بالطريقة دي — اقرا الدليل بتاعي دليل توثيق تطبيق ميتا 2026 من مؤسس عاش التجربة. المقال ده هو اللي بيجيب عندنا 5 لـ 20 دقيقة قراءة لسبب بسيط: بيقول الحقيقة بتاعة ميتا بدل ما يكرر الدوكس.

دوست Connect والـ OAuth نجح والصفحات صفر

كانت ليلة تلات. عميل بيجرب معانا أجينسي من إسكندرية عنده 3 صفحات تحت بورتفوليو معمول زي البورتفوليو بتاعنا احنا OT1 Pro رقم 2169075923895403 — بورتفوليو واحد وشايل كذا صفحة والموظفين متضافين كشركاء. الراجل عمل كل حاجة صح. دخل بأكونت الفيسبوك الصح، وافق على كل الصلاحيات، والـ callback عندنا استلم user token سليم وشغال. وبعدين الـ fetchPages() ندهت على /me/accounts ورجعت {"data": []}.

أول حاجة جت في دماغي انه دخل بأكونت غلط. قلت له جرب تاني. جرب. نفس الليستة الفاضية. سألته عن الـ 2FA وعن الـ ad-blocker وعن اليوزر التجريبي. الراجل كان صبور. وأنا كنت غلطان في التلاتة.

واللي كان هيجنني ان الـ Business Suite مطلعه أدمن في كل حتة: الـ Business settings جوه People مكتوب Full access، والصفحة نفسها جوه Page access مكتوب Full control. بكل إشارات الواجهة هو الأدمن. بس الـ API بيقول انه ما عندوش ولا صفحة. وأنا بعد كده شفت نفس الليستة الفاضية في الجيزة وفي جدة وفي دبي، ومع فاوندر من بريطانيا كان بيقدم الـ Companies House confirmation statement في نفس الأسبوع.

الدرس اللي طلعت بيه: العميل كان صح وأنا والسيستم كنا غلط.

ميتا عندها نوعين أدمن وانت فاكرهم نوع واحد

ميتا عندها طريقتين منفصلين تماماً تخلي بيهم حد أدمن على الصفحة، وشكلهم في الـ Business Suite واحد بالظبط بس سلوكهم في الـ API مختلف تماماً.

النوع الأول هو الدور المباشر القديم. بتروح على الصفحة وبعدين Settings وبعدين Page access وبتضيف حد بالبروفايل الشخصي بتاعه. الدور ده متخزن على الصفحة نفسها. ولما الشخص ده يعمل OAuth لأي تطبيق وتنادي /me/accounts ميتا بترجعلك الصفحة ومعاها page_access_token. وده الطريق اللي كل الشروحات وكل إجابات Stack Overflow فاكرة انه الطريق الوحيد.

النوع التاني هو الصلاحية اللي جاية عن طريق الـ Business Portfolio. بتروح الـ Business Suite وبعدين Business settings وبعدين People وبتضيف الشخص وتديله صلاحية على الصفحات اللي مملوكة للبورتفوليو. أو بتضيف أجينسي كشريك وتسند لها صفحات من البورتفوليو التاني. ومع الـ New Pages Experience ده بقى الطبيعي للتيمات، لأن ميتا بتزقك تدير الناس من مستوى البورتفوليو. والشخص هنا عمره ما بياخد دور مباشر على سطر الصفحة. الصلاحية بتاعته عايشة على جراف أصول البيزنس مش على الصفحة.

وهنا السطر اللي ميتا دافناه: /me/accounts بيقرا النوع الأول بس. ما بيمشيش في جراف البيزنس. فلو كل صلاحياتك من النوع التاني هتاخد مصفوفة فاضية مع HTTP 200 — لا إيرور ولا تحذير. وأنا اتأكدت من ده مع 3 يوزرز تجريبيين على البورتفوليو OT1 Pro رقم 2169075923895403: ضيف اليوزر مباشرة على الصفحة فتظهر في /me/accounts، شيل الدور المباشر واديله نفس الصلاحية من البورتفوليو فالصفحة تختفي من /me/accounts والـ Suite لسه كاتب Full access.

كنت ببص على الباب الغلط والصفحة في أوضة تانية.

ليه /me/accounts بيخبي صفحات البورتفوليو بالتصميم

أنا بقول بيخبي، بس من ناحية ميتا هو تحديد نطاق. /me/accounts بيجاوب على سؤال "اليوزر ده واخد صلاحية مباشرة على أنهي صفحات؟" واتبنى قبل ما البورتفوليوهات تتوجد أصلاً، وميتا عمرها ما حدثت معناه لما إدارة التيمات اتنقلت للبورتفوليو. هما ضافوا حواف جديدة — /me/businesses و /{business-id}/owned_pages و /{business-id}/client_pages — وسابوا الـ endpoint القديم يرجع إجابة ناقصة مع status ناجح.

والإجابة الناقصة مع status ناجح دي هي اللي بتحرق الفاوندرز. لو الـ endpoint كان بيرجع 403 وبيقول "استخدم business_management scope" كنا صلحناها في عشر دقايق. لكنه بيرجع نجاح وبيانات ناقصة، فبتشك في اليوزر. وأنا عملت كده بالظبط أول ساعتين.

والنقطة التانية: مستحيل تشوف صفحات البورتفوليو من غير business_management. الـ scopes اللي بدأنا بيها كانت public_profile, email, pages_show_list, pages_messaging, pages_manage_metadata, pages_read_engagement, instagram_basic, instagram_manage_messages — كفاية للصفحات المباشرة، ومش كفاية عشان تعد البيزنسات. من غير business_management الـ /me/businesses بيرجع فاضي هو كمان. لازم التسع صلاحيات يبقوا Advanced Access قبل ما التعداد يشتغل مع العملا الحقيقيين. ونفس وجع الـ scopes ده في حتة الواتساب شرحته في مقال أخو المقال ده استيراد سجل الواتساب مع الـ Embedded Signup 2026.

القاعدة: النجاح الناقص أخطر من الإيرور الصريح.

الدوامة اللي ضيعت فيها 4 ساعات عشان انت ما تضيعهاش

دي الدوامة بتاعتي ساعة بساعة. كل تخمين غلط كان شكله منطقي. وكل واحد كلفني من نص ساعة لساعة. اقرا الجدول وبعدين ما تكرروش.

العرضالتخمين الغلطالفحص الصحالحل
القايمة فيها صفر صفحات بعد OAuth ناجحاليوزر دخل بأكونت فيسبوك غلطنادي /me?fields=id,name بالتوكن المتخزن وقارن الـ ID مع الـ Suite وهيطلع نفس الشخصبطل تطلب إعادة ربط واسأل /me/businesses
/me/accounts بيرجع {"data":[]} مع 200الـ 2FA أو تغيير الباسورد لغى التوكننادي /me/permissions وهتلاقي الصلاحيات granted والتوكن سليمالتوكن سليم والمشكلة انك ما مشيتش في حافة البيزنس
الـ Suite كاتب Full access والـ API شايف ولا حاجةاليوزر شال صلاحية وقت شاشة الـ OAuthبص على /me/permissions وشوف business_management هل هي declined ولا مش موجودة أصلاًضيف business_management لجملة الـ OAuth وخليه يوافق من جديد
شغالة مع الأدمن التجريبي وبتفشل مع العميلالتطبيق في وضع التطوير أو حدود اليوزر التجريبيافتح developers.facebook.com/apps/1469090344742803 وهتلاقي الصلاحية مكتوبة "جاهز للاختبار" يعني Standard Accessوصّل التسع صلاحيات لـ Advanced Access وقبل كده اشتغل بالـ managed onboarding
بعض الصفحات ظاهرة وصفحة واحدة مختفيةالصفحة مش منشورة أو عليها قيداسأل {biz}/owned_pages و {biz}/client_pages لوحدهم والصفحة الناقصة هتطلع في الحافة التانيةادمج الحافتين وامسح التكرار في fetchBusinessMediatedPages()
اللي مش أدمن بيشوف "Feature unavailable: Facebook Login is currently unavailable for this app"بج في الـ callback عندنااتأكد من حالة مراجعة التطبيق 1469090344742803 والـ Standard Access بيمنع دخول غير الأدمن إجباريخلي META_APP_VERIFIED مقفول ومشي العميل على الـ managed onboarding

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

الفحص بتاع 10 دقايق اللي بيقول الحقيقة

لو صفحة الفيسبوك بتاعتك مش ظاهرة في الربط دلوقتي حالاً، امشي على السبع خطوات دول بالترتيب وبالتوكن المتخزن الحقيقي. كلهم على بعض حوالي عشر دقايق.

  1. اتأكد من الهوية. نادي GET /me?fields=id,name بالتوكن المتخزن. قارن الـ ID مع الشخص اللي في Business Suite جوه People. لو طلعوا نفس الشخص امسح نظرية "الأكونت الغلط" نهائياً.
  2. اتأكد من صحة التوكن. نادي GET /me/permissions. التسعة — public_profile, email, pages_show_list, pages_messaging, pages_manage_metadata, pages_read_engagement, instagram_basic, instagram_manage_messages, business_management — لازم يظهروا granted. لو business_management طالعة declined أو مش موجودة اعمل OAuth من جديد بجملة التسع صلاحيات، لأن اليوزر ممكن يشيل علامة صح من شاشة الموافقة.
  3. شغل الفحص القديم. نادي GET /me/accounts?fields=id,name,access_token. سجل الليستة. دي مجموعة الأدوار المباشرة. ولو فاضية ما تستنتجش ان اليوزر ما عندوش صفحات.
  4. شغل فحص البورتفوليو. نادي GET /me/businesses?fields=id,name. ولكل بيزنس نادي GET /{biz-id}/owned_pages و GET /{biz-id}/client_pages. وده بالظبط اللي FacebookPlatform::fetchBusinessMediatedPages() بيعمله من 2026-10-07.
  5. ادمج وامسح التكرار. وحّد التلات قوايم على الـ Page ID. في حالة إسكندرية رحنا من صفر صفحات لـ 3 صفحات. ولو الصفحة الناقصة ظهرت هنا يبقى أثبت فخ البورتفوليو وتوقف تحليل في التوثيق.
  6. بص على مستوى الوصول. افتح developers.facebook.com/apps/1469090344742803 وبعدين Use Cases وبعدين Permissions. لو أي صلاحية مكتوبة "جاهز للاختبار" بدل Advanced Access فالعملا اللي مش أدمن لسه هياخدوا Feature unavailable: Facebook Login is currently unavailable for this app. ودي مشكلة مراجعة مش مشكلة كود.
  7. خد قرار البديل. لقيت الصفحة بعد الدمج وكل حاجة Advanced Access اشحن قايمة الاختيار المدمجة. أي حاجة لسه Standard Access خلي الكود بس مشي العملا الحقيقيين على "Request connection" عشان السوبر أدمن يربط من الطريق الموثق ويعيد تعيين الصفحة.

الدعم عندنا بيمشي على الشيك ليست دي قبل ما يتسمح له يقول للعميل "جرب متصفح تاني". ومن شهر أكتوبر وهي قافلة دايرة التخمين في كل حالة.

الحل اللي شحناه: business_management زائد حافتي الصفحات

الحل بتاعنا في app/Services/Platforms/FacebookPlatform.php مقصود يكون ممل. الـ fetchPages() بقت تمشي في طريقين وتدمج.

الأول بتفضل على النداء القديم: /me/accounts بتوكن اليوزر. السطور دي جاية أصلاً معاها page_access_token وبتتربط مباشرة على جدول pages. وصفحات الدور المباشر لسه شائعة مع الفاوندرز الأفراد، فما شلناش الطريق ده.

والتاني لما التوكن يكون فيه business_management بينادي fetchBusinessMediatedPages(): يجيب البيزنسات من /me/businesses وبعدين لكل بيزنس يجيب owned_pages يعني المملوكة للبورتفوليو و client_pages يعني المتشاركة مع شريك وهي حالة الأجينسي الكلاسيك. وبندمج المصادر التلاتة على الـ Page ID وبناخد أحدث توكن وبنمسح التكرار قبل ما نعرض قايمة الاختيار.

وفيه 3 تفاصيل يفرقوا. واحد اطلب business_management وقت الـ OAuth — الكود من غير الـ scope بيرجع ليستة بيزنس فاضية وإحساس كداب انك صلحت. اتنين اسأل الاتنين owned_pages و client_pages. أنا شحنت owned-only الأول وصفحة متشاركة مع شريك لسه اختفت، لأن صفحات الشركا عايشة على حافة الـ client بس. تلاتة حافظ على قاعدة الصفحة النشطة الواحدة: الـ observer بتاع Page::booted() بيفرض صف واحد نشط لكل platform ID، ودمج المصادر بيزود احتمال التكرار، فامسح التكرار على platform_page_id قبل الـ upsert وإلا توجيه الويبهوك بيتكسر. الفرق كله كان تحت 120 سطر. الأربع ساعات ما كانتش مشكلة كود. كانت مشكلة رؤية.

جاهز للاختبار ضد Advanced Access: الفخ التاني ورا الأول

حل التعداد بيكشف الحيطة اللي بعده: حالة الـ App Review. ميتا بتعرض كل صلاحية يا Advanced Access يا "جاهز للاختبار" — يعني "Ready to Test" ومعناها Standard Access للأدمن والمختبرين بس. والتطبيق بتاعنا 1469090344742803 محتاج التسعة Advanced Access: public_profile, email, pages_show_list, pages_messaging, pages_manage_metadata, pages_read_engagement, instagram_basic, instagram_manage_messages, business_management.

ولو واحدة بس واقفة على Standard Access فقايمة الاختيار المتصلحة هتشتغل معاك انت وتفشل مع كل عميل حقيقي برسالة Feature unavailable: Facebook Login is currently unavailable for this app. أنا شفت فاوندر يصلح بج البورتفوليو ويجربه على نفسه ويشحنه وبعدين أول عميل يبعت له نفس الجملة دي خلال ساعة. هو ما بوظش حاجة. هو عدى البوابة الأولى ودخل على اللي بعدها.

والوصول لـ Advanced Access يعني توثيق البيزنس الأول وبعدين App Review لكل صلاحية. والتوثيق عايز تطابق حرفي في الاسم: في مصر مستخرج السجل التجاري مع البطاقة الضريبية، وفي الإمارات الرخصة التجارية مع عقد الإيجار المتسجل في Ejari، وفي بريطانيا الـ Companies House confirmation statement. وأنا موثق السلسلة كاملة في دليل توثيق ميتا من مؤسس. ولحد ما كل صلاحية تبقى Advanced Access ما تفتحش META_APP_VERIFIED=true.

الجملة بتاعة "جاهز للاختبار" دي خادعة. شكلها مطمئن كأن التطبيق جاهز. وهي في الحقيقة معناها العكس: شغال معاك انت بس. وأي حد بره التيم هيترفض على الباب. فما تفرحش لما تشوفها. افرح لما تشوف Advanced Access مكتوبة على التسعة.

ليه رقم التطبيق 1469090344742803 والبورتفوليو 2169075923895403 مهمين

الأرقام المحددة بتخليك تتأكد بدل ما تخمن. التطبيق 1469090344742803 هو تطبيق ميتا بتاع OT1-Pro اللي بيطلب التسع صلاحيات. والبورتفوليو OT1 Pro رقم 2169075923895403 هو الـ Business Portfolio بتاعنا اللي كررت عليه الفخ: اعمل اتنين يوزر تجريبي وضيف واحد من Page access مباشرة وضيف التاني من Business settings جوه People واعمل OAuth للاتنين بنفس الصلاحيات وقارن /me/accounts. صفحة واحدة ضد صفر صفحات، ونفس شارة الـ Suite في الواجهة.

كرر التجربة دي على البورتفوليو بتاعك قبل ما تصدق أي صفحة دوكس. الـ API هو مصدر الحقيقة، والواجهة بتدمج منحتين مختلفتين في شارة واحدة. واحنا بنسجل حمولتي الفحصين لما عميل يبلغ عن صفحة ناقصة — بنخزن أعداد accounts والـ businesses والـ owned والـ client على طلب الـ onboarding، والسطر ده حل 4 خلافات من شهر أكتوبر.

بحط الأرقام مقصود عشان تعرف تمسك طرف الخيط في اللوجز.

الحسبة بالدولار اللي الأجينسي بتحس بيها فوراً

ودي مش خنقة ربط صغيرة. خد أجينسي عربية نموذجية على أسعار OT1-Pro: 1500 دولار ريتينر شهري للعميل الواحد، وبتشيل الماسنجر والإنستجرام بمسودات ذكاء اصطناعي بالمصري. لو الصفحة ما اتربطتش مش هتعرف تسحب الرسايل ولا تدرب الردود ولا تعمل الديمو بتاع الإنبوكس الموحد اللي كسبت بيه الصفقة. والعميل مش بيدفع على "كانت هتتربط". بيوقف أو بيمشي.

اخسر ريتينر واحد بـ 1500 دولار بسبب تأخير ربط أسبوعين وهتخسر حوالي 750 دولار إيراد معترف بيه زائد حوالي 6 ساعات دعم رايح جاي بتكلفة 40 دولار للساعة يعني 240 دولار. الصفحة المحبوسة الواحدة بتكلف حوالي 990 دولار. واخسر تلاتة في شهر واحد في تجارب جديدة — زي آخر سبتمبر عندنا — ودي حوالي 2970 دولار خط أنابيب اتحرق عشان حل 120 سطر. وقارن ده مع هوامش المقعد الواحد لنفس سباكة ميتا (بص على مقارنة OT1-Pro و WATI)، الأجينسي اللي بتربط في دقايق بتحافظ على الريتينر واللي بيفتح تذاكر لميتا بيخسره. والحسبة دي هي ليه بنينا بديل الـ managed onboarding ورافضين نشيله: العميل بيدوس "Request connection" والسوبر أدمن بيربط من التطبيق الموثق وبعدين بيعيد تعيين الصفحة في /super-admin/onboarding-requests. مش شيك أوي، بس بيقفل.

أنا عارف ان الرقم يوجع، بس هو ده الواقع بتاع الأجينسيز. الربط مش خطوة فنية على الهامش. الربط هو الباب اللي لو اتقفل كل حاجة وراه واقفة: السحب والرد والتدريب والفوترة. عشان كده أي يوم تأخير في الربط هو يوم خصم من ثقة العميل قبل ما يكون خصم من الفلوس.

لو انت محبوس دلوقتي اعمل كده النهاردة

لو عندك قايمة اختيار فاضية مفتوحة في تاب تاني، شغل خطوات الفحص السبعة اللي فوق واحفظ أعداد الفحص للدعم. وبعدين بص على صلاحيات تطبيقك: Advanced Access في كل حتة ولا فيه "جاهز للاختبار"؟ ولو أي حاجة Standard Access وانت مش أدمن ولا مختبر على التطبيق ده، بطل تحاول OAuth مباشر. مفيش كود هيعدي حالة المراجعة.

وعلى OT1-Pro دوس Request connection بدل المحاولة. الطلب بيتبعت ومعاه أعداد الفحص، والسوبر أدمن بيربط الصفحة من التطبيق الموثق ويسندها للتيم بتاعك. وبتاخد الماسنجر والإنستجرام والواتساب في إنبوكس واحد مع ردود ذكاء اصطناعي من أول يوم، من غير طابور تذاكر ميتا. ابدأ من التسجيل في OT1-Pro — خطة مجانية ومن غير كارت — وبعدين ابعت الطلب من Connections. الوسيط عندنا من ساعة ما نظمنا الطابور أقل من يوم، بدل أسابيع الـ App Review.

أنا حرقت حوالي 4 ساعات بخمن في الـ 2FA والأكونتات الغلط والصلاحيات المتشالة قبل ما أسأل الطرفين بالتوكن المتخزن وأشوف الحقيقة. ما تكررش الدوامة بتاعتي. اسأل الاتنين وادمج وامسح التكرار واحترم بوابة الـ Advanced Access وخلي عندك طريق يدوي ينقذ الريتينر لحد ما ميتا تلحق. الصفحة الناقصة بتاعتك موجودة أكيد — ورا حافة البورتفوليو اللي الكود بتاعك عمره ما مشي فيها.

جرّب النظام اللي بيقفل البيعات بدالك

OT1-Pro بيدير المتابعة والتحليل والردود في صندوق واحد — واتساب وانستجرام وماسنجر وتيليجرام وإيميل، بالعربي أو الإنجليزي، مع سكور لكل عميل وكشف شفاف لكل كريديت. باقة مجانية، بدون بطاقة ائتمان.

ابدأ مجاناً ← · الأسعار · لماذا نتفوق على WATI · كلّمني على واتساب

جاهز للتجربة OT1-Pro?

اربط واتساب وإنستغرام وفيسبوك وتيليجرام مع ذكاء اصطناعي يبيع نيابةً عنك.

ابدأ مجاناً
واصل القراءة

قصص ذات صلة