إدارة الاشتراكات
يشرح هذا المستند نظام Joryio المتكامل لإدارة الاشتراكات والموافقة: اشتراكات القنوات، والقوائم والموضوعات، ورؤوس RFC 8058 الخاصة بإلغاء الاشتراك، ومعالجة الارتدادات وميزات الامتثال.
المحتويات
- نظرة عامة
- نماذج البيانات
- اشتراكات القنوات
- تكامل Web SDK
- قوائم الاشتراك
- التأكيد المزدوج للاشتراك (Double opt-in)
- مجموعات الاشتراك لكل رقم
- رأس List-Unsubscribe
- صفحة التفضيلات المستضافة وإلغاء الاشتراك
- صفحة التفضيلات
- معالجة الارتدادات
- متغيرات Liquid
- فلاتر الشرائح
- مرجع API
- الإعداد
- الامتثال
نظرة عامة
يوفر نظام إدارة الاشتراكات في Joryio ما يلي:
- اشتراكات على مستوى القناة: تتبع حالة الموافقة أو إلغاء الموافقة لـ Email وSMS وWhatsApp وPush وViber.
- اشتراكات قائمة على القوائم: يختار المستخدم موضوعات أو قوائم بريدية محددة.
- امتثال RFC 8058: رؤوس إلغاء اشتراك بنقرة واحدة لتحسين قابلية تسليم Email.
- معالجة الارتدادات: تعامل تلقائي مع الارتدادات المؤقتة والدائمة.
- سجل تدقيق: تاريخ كامل لتغييرات الاشتراك لأغراض الامتثال.
- تصفية الشرائح: استهداف المستخدمين حسب حالة اشتراكهم.
نماذج البيانات
اشتراك القناة، لكل مستخدم
لكل مستخدم حالة اشتراك لكل قناة تواصل:
interface ChannelSubscription {
status: 'optedIn' | 'subscribed' | 'unsubscribed';
optInDate?: Date;
optOutDate?: Date;
optInSource?: string; // 'api', 'web_form', 'import', 'manual'
consentText?: string; // Consent text shown at opt-in
}
interface EmailSubscription extends ChannelSubscription {
bounceType?: 'soft' | 'hard' | null;
bounceCount?: number;
lastBounceAt?: Date;
isValid?: boolean; // false if hard bounced
}
interface UserSubscriptions {
email?: EmailSubscription;
sms?: ChannelSubscription;
whatsapp?: ChannelSubscription;
push?: ChannelSubscription;
viber?: ChannelSubscription;
}
قائمة الاشتراك
القوائم هي موضوعات أو فئات يستطيع المستخدم الاشتراك فيها:
interface SubscriptionList {
id: string;
organizationId: string;
workspaceId: string;
name: string;
description?: string;
channels: ('email' | 'sms' | 'whatsapp' | 'push' | 'viber')[];
isPublic: boolean; // Show in preference center
type: 'marketing' | 'transactional';
requireDoubleOptIn: boolean;
archivedAt?: Date;
createdAt: Date;
updatedAt: Date;
}
عضوية القائمة
تتبع المستخدمين المشتركين في كل قائمة:
interface ListSubscription {
contactId: string;
listId: string;
channel: 'email' | 'sms' | 'whatsapp' | 'push' | 'viber';
status: 'optedIn' | 'subscribed' | 'unsubscribed';
subscribedAt?: Date;
unsubscribedAt?: Date;
optInSource?: string;
}
اشتراكات القنوات
أنواع الحالة
| الحالة | الوصف |
|---|---|
optedIn | أكمل المستخدم تأكيد الموافقة المزدوجة |
subscribed | المستخدم مشترك عبر موافقة مفردة |
unsubscribed | ألغى المستخدم الاشتراك |
pending | بانتظار التأكيد: طلب الاشتراك ولم يؤكد الموافقة المزدوجة بعد. لا تصله الرسائل حتى يؤكد، والتأكيد يجعله subscribed. تضبطه عملية تأكيد (مثل الموافقة المزدوجة في Delivyr) ولا تضبطه حزم SDK أبدًا. |
تحديث حالة قناة
// Via API
await subscriptionsApi.updateChannelSubscription(userId, 'email', {
status: 'unsubscribed',
source: 'preference_center',
reason: 'User requested via preference center'
});
حدث الاشتراك
كلما أصبح شخص مشتركًا، يسجّل Joryio حدث المنصة message.subscribed - المقابل لـ message.unsubscribed. استخدمه كمحفّز لرحلة (مثل سلسلة ترحيب بعد الاشتراك في النشرة البريدية) أو في شريحة ("نفّذ message.subscribed خلال آخر 7 أيام").
- مرة واحدة لكل تغيير حقيقي. يُسجَّل عندما تنتقل قناة أو قائمة من دون حالة أو
unsubscribedأوpendingإلىsubscribed/optedIn. حفظ الموافقة نفسها مرة أخرى، أو جهة اتصال مشتركة من قبل، لا يسجّل شيئًا. مع التأكيد المزدوج (double opt-in) يُسجَّل عندما يؤكد الشخص، لا عندما يُطلب منه التأكيد. - الخصائص:
channel,scope(channel/list),listId,source,platform,optInSource,status,previousStatus,resubscribe. يظهرlistIdللقائمة؛ ويسمّيplatformالمتجر عند الاشتراك من متجر؛ وresubscribeقيمتهtrueبعد إلغاء اشتراك سابق. source- كيف حدث:store_newsletter,store_checkout,store_registration,store_customer_record,landing_page_form,in_app_form,website_form,api,dashboard,sdk,preference_center,double_opt_in,keyword,push_permission,journey.keywordهو رد START، وpush_permissionأول رمز push مسجَّل، وjourneyخطوة تحديث المستخدم في رحلة، وdouble_opt_inتأكيد لاشتراك معلّق.- لا يُسجَّل للبيانات التاريخية. استيراد جهات الاتصال ومزامنة مستودع البيانات والإضافة الجماعية إلى قائمة والمزامنة الأولى أو المطابقة المجدولة للمتجر تكتب حالة الاشتراك دون حدث: هؤلاء الأشخاص كانوا مشتركين من قبل، ولم يشتركوا للتو، ويجب ألا يبدأ استيراد كبير آلاف رحلات الترحيب. أما الإشارات الحية من المتجر - الاشتراك في النشرة، خانة الدفع، تحديث العميل - فتُسجَّل.
- قواعد الموافقة لا تتغير. إعادة الاشتراك تنطبق على جهة الاتصال هذه فقط، ولا يرفع الشكوى أو الارتداد الدائم إلا فريق Joryio - وإعادة الاشتراك المرفوضة لا تسجّل شيئًا. وكأي حدث، ينتمي إلى مساحة عمل واحدة.
حدث إلغاء الاشتراك. يسجّل message.unsubscribed كل إلغاء اشتراك: رابط أو رأس إلغاء الاشتراك، صفحة التفضيلات، رد STOP، ومنذ 2026-11-02 - عضو في الفريق في لوحة التحكم (unsubscribeSource admin)، الـ API (api)، الـ SDK (sdk)، وإلغاء اشتراك من المتجر (store_sync). وهو سجل لإلغاء الاشتراك للشرائح والشروط وData Streaming؛ ولا تبدأ رحلة به.
أفضل الممارسات
- سجّل مصدر كل تغيير في الاشتراك دائماً.
- خزّن نص الموافقة عند اشتراك المستخدم.
- استخدم الموافقة المزدوجة للمستخدمين الأوروبيين امتثالاً لـ GDPR.
تكامل Web SDK
يتيح لك Joryio Web SDK إدارة تفضيلات اشتراك المستخدم من موقعك أو تطبيق الويب مباشرة.
التثبيت
<!-- Via script tag (served from the Joryio API) -->
<script src="https://sdk.joryio.com/web/1/joryio.min.js"></script>
<!-- Or via npm -->
npm install @joryio/web-sdk
حالات الاشتراك في SDK
| الحالة | الوصف |
|---|---|
SubscriptionStatus.OPTED_IN | وافق المستخدم صراحة، مثل تأكيد الموافقة المزدوجة |
SubscriptionStatus.SUBSCRIBED | المستخدم مشترك لكنه لم يقدّم موافقة صريحة |
SubscriptionStatus.UNSUBSCRIBED | ألغى المستخدم الاشتراك |
ضبط اشتراكات القنوات
import { JoryioSDK, SubscriptionStatus } from '@joryio/web-sdk';
const sdk = new JoryioSDK({ sdkKey: 'jry_sdk_web_...' });
// Set subscription for a single channel (write-only for security - no getters)
sdk.user.setSubscription('email', SubscriptionStatus.OPTED_IN);
sdk.user.setSubscription('sms', SubscriptionStatus.SUBSCRIBED);
sdk.user.setSubscription('push', SubscriptionStatus.UNSUBSCRIBED);
sdk.user.setSubscription('whatsapp', SubscriptionStatus.SUBSCRIBED);
// Set multiple channels at once
sdk.user.setSubscriptions({
email: SubscriptionStatus.OPTED_IN,
sms: SubscriptionStatus.UNSUBSCRIBED,
whatsapp: SubscriptionStatus.SUBSCRIBED,
push: SubscriptionStatus.OPTED_IN
});
إدارة مجموعات الاشتراك، القوائم
// Add user to a subscription group/list
sdk.user.addToSubscriptionGroup('newsletter-list-id', 'email');
sdk.user.addToSubscriptionGroup('product-updates-id', 'push');
// Remove user from a subscription group/list
sdk.user.removeFromSubscriptionGroup('newsletter-list-id', 'email');
// The channel parameter is optional, defaults to 'email'
sdk.user.addToSubscriptionGroup('weekly-digest-id');
ملاحظات أمنية
كائن المستخدم في SDK للكتابة فقط لأسباب أمنية:
- لا توجد دالة
getSubscriptions()كي لا تستطيع المواقع أو البرامج الأخرى قراءة اشتراكات المستخدم. - لا توجد دوال قراءة؛ جميع العمليات تكتب باتجاه واحد إلى الخلفية.
- تصادق كل الطلبات بمفتاح SDK الخاص بك.
- يتصرف SDK دائماً بصفته «المستخدم الحالي». لا تأخذ
setSubscriptionوaddToSubscriptionGroupمعرّف مستخدم مستهدفاً؛ بل تطبّقان على من عرّفه SDK حالياً، سواء زائراً مجهولاً أو مستخدماً مرّرته إلىidentify(). لا يمكن لزائر تغيير اشتراكات زائر آخر عبر SDK. - عند تفعيل مصادقة SDK، يجب أن يحمل تغيير الاشتراك الذي يذكر مستخدماً رمز ذلك المستخدم. يُقبل تغيير الزائر المجهول لنفسه - فليس لديه رمز يقدمه - لكن يُرفض
anonymousIdينتمي بالفعل إلى مستخدم معرّف، فلا يمكن تغيير موافقة شخص عبر معرّف قديم لشخص آخر. عند تفعيل هوية SDK الصارمة، تُرفض تغييرات الاشتراك المجهولة أيضاً - استدعِidentify(userId)أولاً. الاستثناء هو إلغاء الاشتراك، الذي يُقبل دائماً (أدناه). - يُسلَّم إلغاء الاشتراك دائماً. تُقبل حالة القناة
unsubscribedوإلغاء الاشتراك في مجموعة لأي شخص يعمل SDK باسمه - زائر مجهول، أو شخص ألغى التتبع أو رفض موافقة التتبع، وكذلك مع هوية SDK الصارمة. تحتفظ حزم SDK بها في قائمة الانتظار وتعيد محاولتها حتى بعدoptOut()ورفض الموافقة وwipeData()؛ أما كل ما عدا ذلك (الاشتراك والسمات والأحداث) فيتوقف. القاعدة الوحيدة التي تبقى سارية: مع مصادقة SDK، لا يستطيعanonymousIdينتمي إلى مستخدم معرّف تغيير موافقة ذلك المستخدم دون رمزه. التفاصيل: سحب الموافقة يُسلَّم دائماً. وتُقبل حتى أثناء إيقاف استقبال الأحداث في الحساب مؤقتًا بسبب الفوترة. - الاشتراك الأول مفتوح؛ أما إعادة اشتراك من ألغى فلا. كما في أي SDK من جهة العميل، المفتاح عام، لذا بدون SDK Authentication يكون
userIdمجرد ادعاء. يُقبل الاشتراك الأول (قناة أو قائمة لم يلغِ الشخص اشتراكه فيها قط) لأي مستخدم. أما إعادة اشتراك شخص ألغى صراحةً - إلغاؤه هو أو إلغاؤه من قائمة، أو رد STOP، أو إلغاء على بريده أو هاتفه قامت به جهة اتصال أخرى - فتُقبل فقط لمستخدم مُتحقق منه عبر SDK Authentication أو للملف المجهول للزائر نفسه؛ وإلا تحصل الطلب على403معcode: "verified_identity_required"(أعد اشتراكه من خادمك عبر الـ API). يُعاملanonymousIdالذي يخص شخصًا معرّفًا مثلuserIdغير مُتحقق منه: يُقبل الاشتراك الأول لذلك الشخص، ولا تُقبل إعادة اشتراكه بعد الإلغاء. يُنصح: فعّل التأكيد المزدوج للقوائم التي تغذيها نماذج أو تطبيقات عامة - الاشتراك عبر SDK في هذه القائمة يرسل بريد التأكيد بدل الاشتراك. - تنتقل الاشتراكات مع الشخص عند تسجيل الدخول. عندما يعرّف زائر مجهول نفسه ويُدمج ملفه المجهول في ملف موجود، تنتقل اشتراكات القنوات وعضويات القوائم معاً. وحيث يختلف الملفان، يغلب إلغاء الاشتراك من أي جانب. الدمج لا يمحو أبداً حالة يملكها الملف الباقي؛ والحالة التي ينقلها (إلغاء اشتراك) تُكتب في سجل اشتراكات ذلك الملف بالمصدر
identity_merge.
دعم TypeScript
import {
JoryioSDK,
SubscriptionStatus,
SubscriptionChannel,
SubscriptionPreferences
} from '@joryio/web-sdk';
const sdk = new JoryioSDK({ sdkKey: 'jry_sdk_web_...' });
const preferences: SubscriptionPreferences = {
email: SubscriptionStatus.OPTED_IN,
sms: SubscriptionStatus.UNSUBSCRIBED,
};
sdk.user.setSubscriptions(preferences);
const channel: SubscriptionChannel = 'email';
sdk.user.setSubscription(channel, SubscriptionStatus.OPTED_IN);
مثال: صفحة إعدادات التفضيلات
// On your settings page
function handleSubscriptionToggle(channel, isEnabled) {
sdk.user.setSubscription(
channel,
isEnabled ? SubscriptionStatus.SUBSCRIBED : SubscriptionStatus.UNSUBSCRIBED
);
}
// Usage
handleSubscriptionToggle('email', true); // Subscribe to email
handleSubscriptionToggle('sms', false); // Unsubscribe from SMS
مثال: الاشتراك في النشرة
function subscribeToNewsletter(email) {
// First identify the user
sdk.identify(email);
sdk.setAttributes({ email: email });
// Then subscribe to the newsletter list
sdk.user.setSubscription('email', SubscriptionStatus.OPTED_IN);
sdk.user.addToSubscriptionGroup('newsletter-list-id', 'email');
}
قوائم الاشتراك
إنشاء قائمة
const list = await listsApi.create({
name: 'Weekly Newsletter',
description: 'Our weekly digest of product updates',
channels: ['email'],
isPublic: true, // Show in preference center
type: 'marketing',
requireDoubleOptIn: false
});
إدارة الأعضاء
// Subscribe a user to a list
await subscriptionsApi.subscribeToList(userId, listId, 'email', {
source: 'api',
consentText: 'Weekly newsletter signup'
});
// Unsubscribe a user
await subscriptionsApi.unsubscribeFromList(userId, listId, 'email');
// Bulk operations (never re-subscribe contacts who opted out)
await listsApi.bulkAddMembers(listId, contactIds, 'email');
await listsApi.bulkRemoveMembers(listId, contactIds, 'email');
قوائم عامة أو خاصة
- العامة،
isPublic: true: تظهر في مركز التفضيلات ويمكن للمستخدم إدارتها بنفسه. - الخاصة،
isPublic: false: يديرها المشرفون فقط ولا تظهر للمستخدمين.
التأكيد المزدوج للاشتراك (Double opt-in)
يضيف التأكيد المزدوج خطوة تأكيد إلى القائمة: يملأ الشخص نموذجًا، ويتلقى رسالة بريد واحدة تحمل رابطًا موقّعًا، ولا يُضاف إلى القائمة إلا بعد النقر عليه. ينطبق ذلك على القوائم التي يُنضم إليها عبر نموذج صفحة هبوط أو نموذج داخل رسالة في التطبيق؛ أما الاشتراك المكتوب عبر API أو الاستيراد الجماعي فيُضاف مباشرة.
الإعداد الافتراضي لمساحة العمل
يحتوي الإعدادات > الاشتراكات > Double opt-in على عنصرين:
- تفعيل double opt-in افتراضيًا للقوائم الجديدة - معطّل افتراضيًا. هو إعداد افتراضي للقوائم الجديدة وليس سياسة: القائمة المنشأة أثناء تفعيله تبدأ بخيار "يتطلب double opt-in" محددًا، وتغيير المفتاح لاحقًا لا يمس القوائم الموجودة.
- قالب بريد التأكيد - "بريد التأكيد المدمج" أو أحد قوالب البريد الخاصة بمساحة العمل (انظر أدناه).
التجاوز لكل قائمة
لكل قائمة خانة اختيار خاصة بها يتطلب double opt-in (الاشتراكات > القوائم، في نافذة الإنشاء والتعديل؛ ويعرضها جدول القوائم كـ "مطلوب" أو "اختياري"). وهي تتقدم دائمًا على الإعداد الافتراضي لمساحة العمل - الاختيار الصريح في القائمة لا يُستبدل أبدًا بالإعداد. عبر API الحقل هو requireDoubleOptIn؛ احذفه من طلب الإنشاء لاعتماد الإعداد الافتراضي لمساحة العمل، أو مرّر true / false لتقرر لتلك القائمة.
كيف يبدو الاشتراك المعلّق
عندما يذكر إرسال نموذج قائمةً تتطلب تأكيدًا:
- يُنشأ ملف الشخص أو يُحدَّث بقيم النموذج كالمعتاد، لكن عضوية القائمة لا تُكتب - لا يُخزَّن شيء للقائمة حتى ينقر الشخص. لا يوجد صف عضو "معلّق" يمكن العثور عليه في القائمة.
- تُلحَق برسالة الشكر في النموذج عبارة "تحقق من بريدك الوارد لتأكيد الاشتراك." بلغة الصفحة.
- يحمل حدث إرسال النموذج
listsSubscribed(القوائم التي تم الانضمام إليها فورًا) وlistsPending(القوائم التي تنتظر التأكيد)، ليتمكن المسار من التمييز بينهما. - تُرسَل رسالة تأكيد واحدة لجميع القوائم المعلّقة معًا، كبريد معاملات عبر إعداد البريد الخاص بمساحة العمل نفسها. الشخص نفسه الذي يطلب القوائم نفسها مجددًا خلال الساعة نفسها لا يتلقى رسالة ثانية.
- الرابط صالح لمدة 7 أيام. النقر عليه يشترك الشخص في كل قائمة يذكرها الرابط بالمصدر
double_opt_inويعرض صفحة تأكيد صغيرة بلغة النموذج. أما الرابط المنتهي أو المعدَّل فيعرض "رابط التأكيد هذا لم يعد صالحًا. املأ النموذج مجددًا للحصول على رابط جديد."
بريد التأكيد
من دون قالب محدد، يرسل Joryio بريد التأكيد المدمج بلغة الصفحة (الإنجليزية أو العبرية أو الإسبانية أو اليونانية أو العربية؛ وأي لغة أخرى تعود إلى الإنجليزية): سطر موضوع "أكّد اشتراكك"، وأسماء القوائم، وزر "تأكيد الاشتراك"، وسطر يطلب من المستلم تجاهل الرسالة إن لم يكن هو.
لاستخدام تصميمك الخاص، اختر أحد قوالب البريد لديك بوصفه قالب بريد التأكيد. يُعرَض بهذه المتغيرات:
| المتغير | القيمة |
|---|---|
{{ confirm_url }} | رابط التأكيد الموقّع. مطلوب - القالب الذي لا يشير إلى confirm_url لا يُستخدم ويُرسَل البريد المدمج بدلاً منه، لأن بريد تأكيد بلا رابطه لا يمكن تأكيده أبدًا. |
{{ list_names }} | أسماء القوائم المعلّقة مفصولة بفواصل ("Weekly Newsletter, Product Updates"). |
{{ lists }} | القوائم المعلّقة ككائنات تحمل id وname، للتكرار عليها. |
{{ brand }} | اسم مساحة العمل (أو "us" حين لا يكون لها اسم). |
{{ language }} | رمز لغة صفحة النموذج، مثل en. |
يُعرَض سطر موضوع القالب بالمتغيرات نفسها؛ والقالب الذي لا موضوع له يستخدم الموضوع المدمج. كما يُتخطى القالب، مع تحذير في السجلات، حين لم يعد موجودًا أو فشل عرضه - ويظل الشخص يتلقى البريد المدمج. متغيرات الشخص ({{ user.first_name }} وغيرها) متاحة كما في أي بريد معاملات.
<p>You asked to receive updates from {{ brand }}:</p>
<ul>
{% for list in lists %}
<li>{{ list.name }}</li>
{% endfor %}
</ul>
<p><a href="{{ confirm_url }}">Confirm subscription</a></p>
<p>If this was not you, ignore this email and nothing changes.</p>
التأكيد المزدوج لاشتراك SMS
يطلب التأكيد المزدوج لاشتراك SMS من كل مشترك جديد في SMS أن يؤكد من هاتفه قبل أن يتلقى أي رسالة تسويقية. يعمل مع جميع مزودي SMS وهو متوقف افتراضيا.
التفعيل
الإعدادات > الاشتراكات > التأكيد المزدوج لاشتراك SMS:
- طلب التأكيد من مشتركي SMS الجدد - مفعل أو متوقف لمساحة العمل.
- اسم العلامة التجارية - يحل محل
{{brand}}في الرسائل. فارغ = اسم مساحة العمل. - رسالة التأكيد - الافتراضي:
{{brand}}: Reply YES to receive texts. Msg & data rates may apply. Reply STOP to opt out.يُرفض الحفظ إذا لم تذكر الرسالة العلامة التجارية ({{brand}}أو اسم العلامة)، ولم تطلب الرد بـ YES (أو كلمة اشتراك أخرى من قائمة الكلمات المفتاحية مثل START أو SI أو نعم)، ولم توضح طريقة إلغاء الاشتراك (STOP أو كلمة إلغاء أخرى). 320 حرفا كحد أقصى. - الرد عند التأكيد - مفعل افتراضيا:
{{brand}}: You're subscribed to texts. Msg & data rates may apply. Reply STOP to opt out.ويجب أن يذكر العلامة التجارية وطريقة الإلغاء أيضا. - ينتهي بعد - عدد الأيام التي يبقى فيها الطلب مفتوحا، من 1 إلى 30، والافتراضي 7.
- إرسال تذكير واحد - متوقف افتراضيا؛ عند تفعيله يُرسل تذكير واحد (رسالة التأكيد نفسها) بعد عدد الساعات الذي تحدده، قبل انتهاء الطلب.
ما الذي يحدث لمشترك SMS جديد
عند تفعيل الإعداد، يُحفظ أي اشتراك جديد في SMS من أي مصدر غير تأكيد جهة الاتصال نفسها - نموذج أو صفحة هبوط، أو الـ API، أو حزم SDK، أو مزامنة متجر، أو استيراد جهات اتصال، أو مزامنة مستودع بيانات - بحالة بانتظار التأكيد (pending) بدلا من مشترك، وتتلقى جهة الاتصال رسالة تأكيد واحدة:
- تُرسل من رقم SMS الافتراضي لمساحة العمل - الرقم الذي ستتلقى منه جهة الاتصال الرسائل - عبر مسار SMS المعتاد، كرسالة نظام: ليست حملة، وتُحتسب تكلفتها مثل أي SMS، وتظهر في سجلات SMS. لا تُرسل أبدا إلى رقم ألغى الاشتراك (STOP)، وتحترم ساعات الهدوء كما تفعل الرسالة المعاملاتية (يحسم ذلك إعداد "استثناء الرسائل المعاملاتية")؛ والرسالة التي تقع في نافذة هدوء تنتظر حتى نهايتها.
- الطلب الواحد يرسل رسالة واحدة (إضافة إلى التذكير الاختياري). طلب الاشتراك مرة أخرى بينما جهة الاتصال لا تزال بانتظار التأكيد لا يرسل رسالة أخرى.
- جهة الاتصال بانتظار التأكيد لا تتلقى أي SMS من حملة أو رحلة، في أي وضع للجمهور.
- تعرض صفحة جهة الاتصال "بانتظار التأكيد" على بطاقة SMS، مع وقت إرسال الرسالة ووقت انتهاء الطلب.
التأكيد والرفض وانتهاء الصلاحية
- YES (أو أي كلمة اشتراك من قائمة الكلمات المفتاحية المشتركة - START وYES وSI وSÍ وOUI وJA وΝΑΙ ونعم وכן وما تضيفه) من هاتف جهة الاتصال إلى رقمك تجعلها مشتركة، بمصدر اشتراك
double_opt_in. لا يُؤكد إلا جهات الاتصال بانتظار التأكيد في مساحة العمل التي يتبع لها الرقم المستقبل. إذا كان "الرد عند التأكيد" مفعلا، تتلقى الرد مرة واحدة. أما YES ممن ليس بانتظار التأكيد فيتبع قواعد START المعتادة. - STOP أثناء انتظار التأكيد يجعلها غير مشتركة؛ ولا يُرسل شيء آخر.
- دون رد، ينتهي الطلب بعد عدد الأيام المحدد: تعود حالة SMS فارغة (وليست "غير مشترك" أبدا - لم يلغ أحد اشتراكه) ويعرض السجل "انتهت صلاحية التأكيد". لا تسأل مزامنة المتجر أو مستودع البيانات مرة أخرى بعد انتهاء الصلاحية؛ أما الاشتراك الجديد عبر نموذج أو الـ API أو الـ SDK فيسأل.
جهات الاتصال التي ألغت اشتراكها
عند تفعيل التأكيد المزدوج لاشتراك SMS، تُعامل إعادة اشتراك جهة اتصال ألغت اشتراكها - بـ STOP أو بأي إلغاء آخر لـ SMS، عبر الـ API أو لوحة التحكم أو الـ SDK أو استيراد مع تجاوز إلغاء الاشتراك - كاشتراك جديد: تصبح جهة الاتصال بانتظار التأكيد وتتلقى رسالة تأكيد واحدة، ولا تصبح مشتركة إلا بعد الرد بـ YES. الطلب مرة ثانية أثناء الانتظار لا يرسل شيئا. إذا لم ترد، ينتهي الطلب وتعود غير مشتركة؛ ولا يُرسل شيء آخر (لا تذكير). جهة الاتصال التي أرسلت STOP تبقى معها التحذيرات المعتادة (في استجابة الـ API بالرمز sms_stop_provider_block، وفي صفحة جهة الاتصال، وفي ملخص الاستيراد): قد يحجب مزود SMS رسالة التأكيد حتى ترسل START، وإذا رفضها المزود برمز STOP الخاص به (مثل Twilio 21610 أو Delivyr الرمز 1) تعود جهة الاتصال غير مشتركة مع ملاحظة السجل "provider still blocks: re-opted out". الاستيراد بدون خانة التجاوز ومزامنة المتجر لا يعيدان أبدا اشتراك جهة اتصال ألغت اشتراكها، لذا لا تُرسل إليها رسالة.
الاستيراد
تُظهر صفحة الاستيراد متى يكون التأكيد المزدوج لاشتراك SMS مفعلا. عندها يصبح كل اشتراك SMS جديد في الملف بانتظار التأكيد ويتلقى رسالة تأكيد واحدة (خلال دقيقة تقريبا من الاستيراد). مع تجاوز إلغاء الاشتراك، تُعامل جهات الاتصال في الملف التي ألغت اشتراكها في SMS بالطريقة نفسها - رسالة واحدة، ولا تصبح مشتركة إلا بعد YES، وتعود غير مشتركة إن لم ترد (انظر أعلاه)؛ وبدونه تبقى ملغاة ولا تتلقى رسالة. حدد مؤكد مسبقا (لدي إثبات) فقط إذا كان لديك إثبات أن الأشخاص في الملف أكدوا اشتراكهم في SMS من قبل؛ عندها يُحفظون مشتركين دون رسالة. تتطلب الخانتان صلاحية الامتثال.
حسابات Delivyr
لدى Delivyr تأكيد مزدوج خاص بها. عندما يكون رقم SMS لمساحة العمل على حساب Delivyr، لا ترسل Joryio تأكيدا ثانيا: تُسجل اشتراكات SMS الجديدة كالمعتاد، وتحجز Delivyr كل رسالة إلى رقم غير مؤكد (سبب الفشل "Not confirmed yet") وتسأل جهة الاتصال بنفسها حتى ترد بـ YES لديها. جهة الاتصال التي تبلغ Delivyr أنها بانتظار التأكيد تُؤكد في Joryio عندما يصل رد YES منها عبر webhook الخاص بـ Delivyr.
مجموعات الاشتراك لكل رقم، SMS وWhatsApp
تعمل قائمة اشتراك مرتبطة بمرسل محدد، أي تحمل senderId، كمجموعة اشتراك لكل رقم. في SMS تكون لكل رقم؛ وفي WhatsApp تكون لكل WABA، أي WhatsApp Business Account. يتيح ذلك لجهة الاتصال إلغاء رسائل رقم أو WABA واحد مع بقائها مشتركة في الآخرين.
نطاق تخزين إلغاء الاشتراك
- يخزّن إلغاء الاشتراك لكل مجموعة. تحتفظ كل مجموعة لكل رقم بحالتها، منفصلة عن موافقة جهة الاتصال العامة للقناة وعن الأرقام أو WABA الأخرى.
- تحترم الإرسالات من الحملات والرحلات كليهما الإلغاء. قبل الإرسال يفحص النظام حالة إلغاء المستلم لمجموعة رقم الإرسال أو WABA. إن ألغى هذه المجموعة، يُتخطى الإرسال. وفي الرحلة، ينتقل الشخص إلى الخطوة التالية؛ تتخطى الرسالة فقط لا الرحلة.
- رقم SMS الافتراضي. عند الإرسال من رقم مساحة العمل الافتراضي، يُنسب إلغاء الاشتراك إلى مجموعة هذا الرقم الافتراضي.
نطاق STOP وSTART الواردين
تطبق كلمة الرد على الرقم المحدد في SMS أو WABA المحدد في WhatsApp الذي استقبل الرسالة:
STOPوكل كلمة إلغاء أخرى عداSTOPALLتخص مجموعة الرقم أو WABA فقط.STOPALLيخص القناة كلها، فيلغي كل أرقامها أو WABA فيها.STARTيعيد الاشتراك في مجموعة الرقم أو WABA نفسها.
مساحات العمل علامات تجارية منفصلة، لذا فإن STOP يلغي اشتراك جهة الاتصال من تلك العلامة التجارية - لا من الحساب بأكمله. هذا النطاق يأتي من عنوان webhook الوارد، الذي يحمل مساحة عمل واحدة.
لا يستطيع Joryio استنتاج العلامة التجارية من الرسالة نفسها. يُعرَّف المرسلون بـالاسم (مثل Acme)، بينما يصل الرد إلى رقم هاتف - فلا يوجد ما يربط بينهما.
لذلك تُسجَّل كل ردّ وكل إلغاء اشتراك يصل إلى عنوان وارد معيّن في مساحة عمل ذلك العنوان. إذا كان حساب مزوّد واحد يخدم أكثر من علامة تجارية، فاضبط عنوانًا واردًا منفصلًا لكل رقم في بوابة المزوّد، أو امنح كل علامة تجارية حساب مزوّد خاصًا بها. وإلا فإن STOP الموجّه للعلامة (ب) سيُسجَّل على العلامة (أ)، وستستمر العلامة (ب) في الإرسال.
الكلمات المفتاحية
تعالج كلمات SMS الواردة ثلاث طبقات تُدمج وقت المطابقة: أساس إنجليزي دائم، وافتراضيات مترجمة مفعلة، وإضافاتك المخصصة.
الأساس الإنجليزي، مفعل دائماً ولا يمكن إزالته
| النوع | الكلمات |
|---|---|
| إلغاء الاشتراك | STOP, STOPALL, UNSUBSCRIBE, CANCEL, END, QUIT, REVOKE, OPTOUT, OPT OUT, OPT-OUT |
| الاشتراك | START, YES, UNSTOP, SUBSCRIBE, OPTIN |
| المساعدة | HELP, INFO |
REVOKE وOPTOUT جزء من أساس إلغاء الاشتراك، وفق قاعدة FCC لشهر أبريل 2025 بشأن إبطال موافقة SMS. يُحترمان دائماً، ولا تحتاج إلى إضافتهما أو تفعيلهـما.
الافتراضيات المحلية، مفعلة وتُضاف إلى الأساس
يتعرف النظام تلقائياً على كلمات الإلغاء والاشتراك والمساعدة الشائعة بلغات أخرى، ليتمكن الشخص من الإلغاء بلغته:
| اللغة | إلغاء الاشتراك | الاشتراك | المساعدة |
|---|---|---|---|
| العبرية | הסר, הסרה, עצור, ביטול, הפסק | התחל, הצטרף, כן | עזרה, מידע |
| الإسبانية | PARE, BASTA, CANCELAR, ALTO | SI, ALTA | AYUDA |
| الفرنسية | ARRET, ARRÊT, DESABONNER | OUI | AIDE |
| الألمانية | STOPP, ABBESTELLEN | JA | HILFE |
| البرتغالية | PARAR, SAIR | - | - |
إضافات مخصصة، لكل منظمة
من الإعدادات ← SMS / الاشتراكات يمكنك إضافة كلمات الإلغاء والاشتراك والمساعدة الخاصة بك، وكذلك كلمات إلغاء للقناة كلها. تظهر الطبقة الثابتة والافتراضيات المحلية للقراءة فقط بجانب قائمتك القابلة للتعديل، لذا تدير إضافاتك فقط. تضبط كلمات SMS على مستوى المنظمة. وهي تنطبق على جميع مساحات العمل في المؤسسة، لذا يتطلب تغييرها صلاحية org_settings:write على مستوى الشركة؛ ويرى أعضاء مساحة العمل الذين لا يملكونها القائمة للقراءة فقط.
| النوع | الكلمات |
|---|---|
| إلغاء الاشتراك | STOP, STOPALL, UNSUBSCRIBE, CANCEL, END, QUIT, OPTOUT, OPT-OUT |
| الاشتراك | START, UNSTOP, SUBSCRIBE, YES, OPTIN, OPT-IN |
STOPALL وحدها على مستوى القناة؛ وكل كلمة إلغاء أخرى تخص مجموعة الرقم أو WABA. وتنطبق القاعدة نفسها على أي كلمات إلغاء عامة للقناة تضيفها لـ SMS.
مطابقة متسامحة مع الفروق البسيطة
المطابقة الواردة غير حساسة لحالة الأحرف وعلامات الترقيم والمسافات، امتثالاً لإرشادات CTIA التي تتطلب احترام الفروق البسيطة. قبل المطابقة، يطبّع النظام الكلمة الأولى ونص الرسالة كله: يزيل علامات الترقيم والمسافات المحيطة ويحّول حروف ASCII إلى كبيرة. لذلك تعد Stop وSTOP! و" stop " وSTOP. جميعاً STOP.
التطبيع آمن للنصوص غير ASCII: لا تملك العبرية والعربية وغيرهما حالة أحرف، فتمر كما هي؛ ولا يُزال إلا الترقيم أو المسافات المحيطة.
إعادة الاشتراك بعد الإلغاء
تعتمد العودة على طريقة الإلغاء:
- أرسل الشخص STOP أو كلمة إلغاء أخرى. يمكن لجهة الاتصال إرسال
START(أو كلمة اشتراك أخرى) من الهاتف نفسه، فيُرفع الإلغاء عن الرقم. ويمكنك أيضاً إعادة اشتراك جهة الاتصال هذه وحدها صراحةً - عبر الـ API أو SDK أو صفحة جهة الاتصال أو صفحة التفضيلات أو النماذج الخاصة بالشخص نفسه، أو استيراد مع تحديد "Override unsubscribes"؛ راجع جهات الاتصال التي تشترك في بريد إلكتروني أو هاتف. في SMS يُبقي المزوّد (مثل Twilio) عادةً حظره الخاص على الرقم، ولا يرفعه أي API: إلى أن ترسل جهة الاتصالSTARTقد يواصل المزوّد رفض رسائلك. - موافقة من متجر. فقط في الحالات الواردة في موافقة التسويق من المتاجر - مثل عميل مسجّل الدخول يحدد مربع التسويق عند الدفع بعد إلغاء الاشتراك عبر رابط.
- ألغى عبر صفحة مستضافة أو مركز التفضيلات: يمكنه إعادة الموافقة من الموقع. يمكن لمن ألغى عبر رابط أو مركز تفضيلات، لا برسالة نصية، أن يشترك من جديد بالطريقة ذاتها، مثل
{{ resubscribe_url }}أو تفعيل SMS مجدداً في مركز التفضيلات.
الأسبقية والإجراء الآمن
- إلغاء القناة العامة يتغلب على المجموعات. إلغاء SMS أو WhatsApp بالكامل هو مفتاح إيقاف حاسم؛ لا تعيد أي مجموعة لكل رقم تفعيل الإرسال إلى جهة الاتصال.
- الإخفاق الآمن إلى القناة كلها. إذا تعذر حل مجموعة الرقم أو WABA، يطبق النظام الإلغاء على القناة كلها بدلاً من المخاطرة بمواصلة الرسائل.
أمن الرسائل الواردة
- تتحقق توقيعات webhooks الواردة؛ وتُرفض رسائل
STOPوSTARTالمزورة. - يُرفض مزود لا يدعم التحقق من توقيع الوارد للكلمات الواردة.
يمكن ربط رقم الإرسال - رقم SMS أو رقم WhatsApp أو مرسل Viber - بمساحة عمل واحدة فقط في مؤسستك. لا تؤثر المؤسسات الأخرى أبدًا في أرقامك: تُطابَق الرسالة الواردة فقط مع أرقام المؤسسة التي استلمها حساب مزوّدها، ويُتحقق من أرقام WhatsApp مع Meta عند ربطها. يُرفض ربط رقم مربوط بالفعل في مكان آخر؛ افصله هناك أولًا. تُطبَّق رسائل STOP وSTART وHELP والردود الواردة في مساحة العمل التي ينتمي إليها الرقم، وتُرفض الرسالة الموجهة إلى مساحة عمل مختلفة بدل التخمين. أسماء المرسلين الأبجدية الرقمية لا تتلقى ردودًا، لذلك لا تخضع لهذا القيد.
يُتحقق من أرقام SMS في حساب Twilio أو Vonage بالطريقة نفسها: يجب أن يُدرج المزوّد الرقم في الحساب المربوط، وإلا فلن يُربط الرقم. لا يمكن التحقق من الأرقام لدى المزوّدين الآخرين وتظهر بعلامة غير قابل للتحقق - وتظل قاعدة مساحة العمل الواحدة أعلاه سارية عليها.
إلغاء الاشتراك في الهاتف يتبع الرقم داخل مساحة العمل، كما يتبع إلغاء اشتراك البريد العنوان: جهة الاتصال المكررة بالرقم نفسه في مساحة العمل تلك تُحظر أيضًا، وSTART يرفع الحظر في مساحة عمله فقط.
تعمل مجموعة لكل رقم فقط مع مرسل يستطيع تلقي الردود. رقم الهاتف ثنائي الاتجاه ويمكن للمستلم الرد، فتعمل STOP وكلمات الإلغاء. أما الاسم الأبجدي الرقمي فأحادي الاتجاه ولا يستطيع المستلم الرد عليه؛ لذلك لا تعمل كلمات الإلغاء عليه. يعتمد توفر هذه الأسماء على إعداد مزود SMS لديك.
نطاق رابط إلغاء الاشتراك في عقد SMS وViber للرحلات
تحمل خطوة رسالة SMS أو Viber في رحلة رابط إلغاء اشتراك تستطيع اختيار نطاقه لكل عقدة. يحدد مرسل From قائمة الاشتراك؛ ولذلك يزيل الرابط، وSTOP الوارد، جهة الاتصال من قائمة هذا المرسل فقط افتراضياً، وتبقى قابلة للوصول من مرسلين آخرين.
| الاختيار | السلوك |
|---|---|
| قائمة هذا المرسل، الافتراضي | يخرج الرابط جهة الاتصال من قائمة الرقم أو المرسل فقط، تماماً كنطاق STOP. |
| كل SMS / كل Viber، عام | يخرج الرابط جهة الاتصال من القناة كلها، وهو مكافئ لـ STOPALL. |
الخيار الافتراضي هو الأدق والأقل مفاجأة. وسّعه إلى العام فقط إن كانت العقدة تمثل إلغاءً على مستوى القناة. ويعكس ذلك نطاق List-Unsubscribe في Email، global مقابل list، كنموذج عالمي مقابل قائمة يطبق لكل عقدة في SMS وViber.
إلغاء Email يتبع العنوان، جهات اتصال مكررة
يمكن أن يخص عنوان Email نفسه أكثر من جهة اتصال في مساحة عمل واحدة، كأن يُستورد شخص مرتين أو ينشأ من مصادر مختلفة. تُسجل إلغاءات Email والارتدادات الدائمة على عنوان Email ضمن مساحة العمل، لا على سجل جهة الاتصال المستلمة وحده. لذلك يُحترم الإلغاء للشخص ولا يضيع لأن سجلاً مكرراً ما زال يبدو مشتركاً.
ما يعنيه ذلك
- الإلغاء يغطي كل التكرارات. عند الإلغاء من رابطك أو رأس List-Unsubscribe أو صفحة التفضيلات أو شكوى الرسائل المزعجة، تُمنع كل جهات الاتصال في المساحة ذات العنوان نفسه، لا التي وصلتها الرسالة فقط.
- عام مقابل قائمة. الإلغاء العام يمنع العنوان في القناة كلها، بكل الحملات والرحلات. إلغاء قائمة أو موضوع يمنعه من تلك القائمة فقط ويبقى متاحاً للقوائم الأخرى.
- الارتداد الدائم يتبع العنوان أيضاً. يمنع العنوان في مساحة العمل كلها، فلا تستمر جهة اتصال مكررة في الإرسال إلى صندوق بريد ميت. لا يرفعه إعادة الاشتراك أو الـ API أو الاستيراد - بل دعم Joryio فقط (أو تغيير حقيقي للبريد). راجع جهات الاتصال التي تشترك في بريد إلكتروني أو هاتف.
- محدود بمساحة العمل. يرتبط المنع بالمساحة التي أرسلت البريد. لا يصمت العنوان في مساحة عمل أخرى للحساب نفسه.
- تجاوز المعاملات. إرسال المعاملات أو
allالذي يصل إلى كل جهات الاتصال يتجاوز إلغاء الموافقة، لكن لا يرسل أبداً إلى عنوان ارتد دائماً. - شكاوى البريد العشوائي توقف رسائل المعاملات أيضاً. عندما يضع شخص ما بريدك في البريد العشوائي، يتوقف العنوان عن تلقي البريد التسويقي وبريد المعاملات (الإيصالات، إعادة تعيين كلمة المرور) في مساحة العمل تلك - إلا إذا فعّل دعم Joryio إرسال المعاملات لمؤسستك، وعندها توقف الشكاوى التسويق فقط. إن أردت ذلك، أرسل بريد المعاملات من نطاق فرعي منفصل للإرسال وتواصل مع الدعم. إلغاء الاشتراك لا يوقف بريد المعاملات أبداً؛ والارتداد الدائم يوقفه دائماً.
يفحص إرسال الحملات والرحلات ذلك وقت الإرسال، لذلك يبقى سجل مكرر أُنشئ بعد الإلغاء ممنوعاً أيضاً.
جهات الاتصال التي تشترك في بريد إلكتروني أو هاتف
قد تشترك جهتا اتصال أو أكثر في مساحة عمل واحدة في عنوان بريد إلكتروني أو رقم هاتف - شخص استُورد مرتين، أو شخصان يشتركان فعلاً في صندوق بريد أو هاتف (مثل زوجين يستخدمان بريداً عائلياً واحداً). يطبق Joryio عليها القواعد التالية:
- إلغاء الاشتراك يصل إلى كل جهة اتصال بالبريد أو الهاتف نفسه. أياً كان المصدر - رابط إلغاء الاشتراك، أو رأس النقرة الواحدة، أو صفحة التفضيلات، أو تغيير في صفحة جهة الاتصال، أو الـ API، أو SDK، أو استيراد، أو رد
STOP، أو شكوى بريد عشوائي - تُلغى أيضاً كل جهة اتصال في مساحة العمل بالبريد نفسه (للبريد الإلكتروني) أو الهاتف نفسه (لـ SMS وWhatsApp وViber). تُحدَّث حالة اشتراكها (أو عضويتها في القائمة عند الإلغاء من قائمة)، ويُضاف لكل منها سجل: أُلغي الاشتراك عبر جهة اتصال أخرى بالبريد نفسه (أو الهاتف). - يبقى الحظر لجهات الاتصال التي تُنشأ لاحقاً. يُحفظ الإلغاء على العنوان أو الرقم، فتُحظر أيضاً جهة الاتصال التي تُنشأ لاحقاً بالبريد أو الهاتف نفسه.
- إعادة الاشتراك تنطبق فقط على جهة الاتصال التي تمت عليها. إذا أعاد أحد الأشخاص الاشتراك، تصبح هذه الجهة وحدها قابلة للوصول؛ وتبقى الأخرى ملغاة لأنها قد تخص أشخاصاً مختلفين. تحتفظ هذه الجهة بإعادة اشتراكها حتى تلغي أي جهة على العنوان أو الرقم اشتراكها مجدداً - فيُحظر الجميع مرة أخرى.
- حفظ صفحة التفضيلات دون تغيير لا يغير شيئاً. لا يُطبَّق إلا مفتاح غيّره الشخص فعلاً، وعلى جهة الاتصال هذه فقط.
- يمكن تجاوز رد
STOPلجهة اتصال واحدة. إلغاء SMS أو WhatsApp أو Viber جاء من كلمةSTOP(من أي مزوّد، بما فيه Delivyr) يمكن إعادة اشتراكه عبر الـ API (تحديث اشتراك عادي - دون علامة إضافية) أو SDK أو صفحة جهة الاتصال أو صفحة التفضيلات أو النماذج الخاصة بالشخص نفسه، وعبر استيراد فقط مع تحديد "Override unsubscribes". ينطبق ذلك على جهة الاتصال هذه وحدها - وتبقى جهات الاتصال الأخرى على الرقم محظورة - ولا يزال ردSTARTيرفع الإلغاء عن الرقم كما في السابق. يسجّل سجل جهة الاتصال أن التغيير تجاوزSTOPومن أجراه (مفتاح الـ API أو مهمة الاستيراد أو عضو الفريق أو صفحة التفضيلات). - SMS فقط: قد يواصل المزوّد الحظر. إعادة اشتراك جهة اتصال SMS أرسلت
STOPتعرض تحذيراً أينما حدثت (في صفحة جهة الاتصال قبل الحفظ، وفي صفحة الاستيراد وملخصها، وفي رد الـ API): This contact opted out by texting STOP. Your SMS provider may keep blocking messages until they text START. لا يوجد مثل هذا التحذير في WhatsApp وViber. - عندما يواصل مزوّد SMS الحظر. الإرسال الذي يرفضه مزوّد SMS بسبب حظر
STOPالخاص به (مثل خطأ Twilio 21610 أو رفض opted-out من Delivyr) يظهر بوصفه محظوراً من المزوّد (ألغى الاشتراك)، لا كفشل، ولا يُحتسب في تنبيهات معدل الارتداد أو الفشل. يُطبَّق الإلغاء مجدداً، ويقول سجل جهة الاتصال provider still blocks: re-opted out. - الارتدادات الدائمة وشكاوى البريد العشوائي لا يرفعها إلا دعم Joryio. لا تمسحها أبداً إعادة الاشتراك أو الـ API أو الاستيراد. تواصل مع الدعم عند التأكد من أن العنوان يعمل مجدداً.
- مساحة عمل واحدة في كل مرة. يحدث كل ذلك داخل مساحة العمل التي تم فيها الإلغاء؛ ولا تتأثر أبداً مساحات العمل والعلامات التجارية الأخرى.
- الرحلات تتبع قواعد الحملات نفسها. إلغاء الاشتراك من قائمة بريد يتبع العنوان في الرحلات أيضاً: خطوة البريد في رحلة تستخدم قائمة اشتراك تتخطى كل جهة اتصال غادر عنوانها تلك القائمة.
تعرض بطاقة الاشتراكات في صفحة جهة الاتصال متى تكون الجهة محظورة بسبب جهة أخرى بالبريد أو الهاتف نفسه، والسبب (إلغاء اشتراك، أو STOP، أو ارتداد دائم، أو شكوى بريد عشوائي)، ومتى يكون لها إعادة اشتراك خاصة بها بينما تبقى الجهات الأخرى محظورة. وعندما لا تملك أي جهة اتصال أخرى في مساحة العمل العنوان نفسه، تذكر البطاقة فقط أن جهة الاتصال أُعيد اشتراكها بعد إلغاء اشتراك البريد الإلكتروني أو رقم الهاتف.
موافقة التسويق من المتاجر (Shopify وWooCommerce وMagento وPrestaShop)
طلب المتجر أو عملية الدفع لا يستبدلان أبدًا الهاتف الحالي لجهة الاتصال (بل يملآن الهاتف الفارغ فقط) - لا يستبدله إلا بيانات حساب العميل في المتجر، وفي Magento طلب العميل المسجّل الدخول. وموافقة SMS المقدَّمة برقم آخر لا تؤدي إلى اشتراك رقم جهة الاتصال. راجع كيف تحدّث بيانات المتجر جهة الاتصال في Shopify وWooCommerce وMagento.
تتبع موافقة التسويق التي يرسلها المتجر القواعد أعلاه - وهذه القواعد، وهي نفسها لكل المتاجر (ولنشرة PrestaShop البريدية حدود خاصة بها - راجع النشرة البريدية في PrestaShop):
| ما يرسله المتجر | ما يفعله Joryio |
|---|---|
| تحديد موافقة عند الدفع كـضيف | يشترك جهة اتصال ليس لها اشتراك في تلك القناة بعد. ما لم يكن إعداد المتجر أدناه مفعّلًا، لا يعيد أبدًا اشتراك من ألغى اشتراكه - فعند الدفع كضيف يمكن لأي شخص كتابة أي بريد إلكتروني. |
| موافقة من عميل مسجّل الدخول (WooCommerce: طلب تم أثناء تسجيل الدخول، الإضافة 1.6.1 أو أحدث؛ Magento: طلب من عميل مسجّل الدخول)، بتاريخ لاحق لآخر إلغاء اشتراك لجهة الاتصال | يعيد أيضًا اشتراك جهة اتصال ألغت اشتراكها عبر رابط إلغاء الاشتراك أو زر الإلغاء بنقرة واحدة، أو صفحة التفضيلات، أو الـ API، أو عضو في الفريق، أو إلغاء هذا المتجر نفسه. |
| أي موافقة من Shopify (الإعداد معطّل) | تُعامل كتحديد ضيف. يربط Shopify الدفع كضيف بالعميل الموجود الذي له البريد الإلكتروني نفسه ولا يخبر ما إذا كان المشتري مسجّل الدخول، لذا لا تعيد موافقة من Shopify أبدًا اشتراك من ألغى اشتراكه. |
| موافقة عند الدفع أو في سجل العميل، مع تفعيل إعداد المتجر السماح لموافقات الدفع بإعادة اشتراك من ألغوا اشتراكهم (معطّل افتراضيًا؛ Shopify وWooCommerce وMagento وPrestaShop) | يعيد اشتراك جهة اتصال ألغت اشتراكها - حتى بعد الدفع كضيف - عندما يكون وقت الموافقة لدى المتجر بعد آخر إلغاء اشتراك لها. الخطر: لا يمكن للدفع كضيف إثبات هوية المشتري، لذا يمكن لمن يكتب بريد شخص آخر أن يعيد اشتراكه؛ ويمكنه دائمًا إلغاء الاشتراك مجددًا بنقرة واحدة. |
| مربع غير محدد | لا تغيير - لا يُعد أبدًا إلغاءً للاشتراك. |
| إلغاء في المتجر | يلغي الاشتراك، إلا إذا سجّل Joryio تغييرًا لاحقًا لجهة الاتصال هذه. |
| ما لا تلغيه أبدًا أي موافقة من المتجر، سواء كان الإعداد مفعّلًا أو معطّلًا | شكوى البريد العشوائي، والارتداد الدائم، والحظر على مستوى المؤسسة، ومساحة عمل أخرى، وإلغاء اشتراك مسجّل على جهة اتصال أخرى بالبريد أو الهاتف نفسه، وSTOP في SMS. |
- الإعداد لكل اتصال متجر، في الإعدادات → التكاملات → <المتجر>، معطّل افتراضيًا؛ يمكن للمسؤولين فقط تغييره، ويُسجَّل كل تغيير في سجل التدقيق. عند تفعيل التأكيد المزدوج لقائمة البريد أو التأكيد المزدوج لـ SMS، يُرسل التأكيد أولًا وتبقى جهة الاتصال قيد الانتظار حتى تؤكد.
- إعادة الاشتراك تخص جهة الاتصال هذه وحدها؛ وتبقى جهات الاتصال الأخرى بالبريد أو الهاتف نفسه غير مشتركة. ويذكر سجل جهة الاتصال السبب، مثل أُعيد الاشتراك عبر صفحة الدفع في المتجر (عميل مسجّل الدخول) بعد إلغاء الاشتراك عبر صفحة التفضيلات.
- SMS: عند تفعيل التأكيد المزدوج (double opt-in) لـ SMS، ترسل إعادة الاشتراك رسالة واحدة "رد بـ YES" وتبقى جهة الاتصال قيد الانتظار حتى ترد. ولا تعود جهة اتصال أرسلت
STOPإلا بهذه الطريقة - وعند إيقاف التأكيد المزدوج لـ SMS لا تعيد موافقة المتجر اشتراكها أبدًا. - موافقة المتجر تشترك في القناة لا في قائمة: القائمة التي تتطلب التأكيد المزدوج ترسل رسالة التأكيد عند انضمام الشخص إليها.
النشرة البريدية في PrestaShop
الموافقة في PrestaShop هي اشتراك العميل في النشرة البريدية، للبريد الإلكتروني فقط. راجع أيضًا PrestaShop: الموافقة التسويقية.
- سجل العميل. العلامة
newsletterتشترك جهة الاتصال في البريد الإلكتروني، بتاريخnewsletter_date_addفي PrestaShop. إلغاء الاشتراك في المتجر (صفحة الحساب أو لوحة الإدارة) إلغاء صريح من المتجر ويلغي الاشتراك، إلا إذا سجّل Joryio تغييرًا لاحقًا لجهة الاتصال هذه. والتغيير المحفوظ على العميل من واجهة المتجر بواسطة شخص غير مسجّل الدخول بصفته هذا العميل يمكنه إلغاء الاشتراك، لكنه لا يشترك أبدًا. - كتلة النشرة البريدية (ps_emailsubscription) نموذج مجهول: يمكن لأي شخص كتابة أي بريد إلكتروني. الاشتراك عبر الكتلة يُعد موافقة فقط لـصاحب الحساب المسجّل لذلك البريد وهو مسجّل الدخول، أو بعد تأكيد البريد الإلكتروني من PrestaShop عندما تكون رسائل التحقق مفعّلة في المتجر؛ ولا يُطبَّق أي اشتراك آخر عبر الكتلة. أما إلغاء الاشتراك عبر الكتلة فيُطبَّق حسب عنوان البريد الإلكتروني.
- المزامنة الأولية تستورد المشتركين كموافقات فقط: لا تلغي اشتراك أي أحد أبدًا، ولا تعيد أبدًا اشتراك جهة اتصال ألغت اشتراكها.
- بعد إلغاء الاشتراك، لا تعيد موافقة النشرة البريدية من PrestaShop اشتراك جهة الاتصال - قاعدة العميل المسجّل الدخول أعلاه لا تنطبق على PrestaShop. الاستثناء الوحيد هو مربع النشرة البريدية المحدد عندما ينشئ الدفع كضيف حساب الضيف للمشتري، مع تفعيل إعداد السماح لموافقات الدفع بإعادة اشتراك من ألغوا اشتراكهم.
- عروض الشركاء (
optin) ليست موافقة تسويقية ويتم تجاهلها.
التفاصيل لكل متجر: Shopify، WooCommerce، Magento، PrestaShop.
إلغاء الاشتراك يكون لكل قناة على حدة
تُمنح الموافقة لكل قناة على حدة، لذا يؤثر إلغاء الاشتراك فقط في القناة التي جاء منها.
- رابط إلغاء الاشتراك في البريد وترويسة النقرة الواحدة. يتوقف الشخص عن تلقي البريد الإلكتروني (وعندما يكون للحملة موضوع اشتراك، يغادر ذلك الموضوع على البريد أيضًا). لا تتغير اشتراكاته في SMS وWhatsApp والإشعارات الفورية وViber. وتخبره الصفحة: "تم إلغاء اشتراكك في رسائل البريد الإلكتروني. ستظل تتلقى رسائل SMS/WhatsApp التي اشتركت فيها."
- إلغاء الاشتراك من كل القنوات. بعد ذلك تعرض الصفحة زرًا صريحًا إلغاء الاشتراك من كل القنوات. هذا الزر وحده يلغي الاشتراك من كل القنوات والمواضيع؛ ويُسجَّل كإلغاء اشتراك بالنطاق
global، منسوبًا إلى الحملة والمتغير نفسيهما. - SMS وWhatsApp وViber. يؤثر
STOPورابط إلغاء الاشتراك في تلك القناة فقط (أو في قائمة المرسل فقط)؛ ويتسعSTOPALLليشمل كل الأرقام على تلك القناة، ولا يمتد أبدًا إلى قنوات أخرى. - الروابط المرسلة قبل 2026-10-04. تستمر روابط إلغاء الاشتراك الموجودة بالفعل في صناديق البريد في فعل ما كانت تفعله عند إرسالها: رابط بريد أقدم لا يزال يلغي الاشتراك من كل شيء.
- صفحة التفضيلات. تبقى لكل قناة ولكل موضوع.
الأساس القانوني. تُجمع الموافقة لكل قناة، وإلغاء الاشتراك يسحبها لتلك القناة: من ذلك الحين لا تسويق على تلك القناة. ولا يجوز استخدام القنوات الأخرى إلا إذا كان الشخص مشتركًا فيها.
رأس List-Unsubscribe، RFC 8058
نظرة عامة
يعرف RFC 8058 طريقة قياسية لعملاء البريد لتقديم إلغاء بنقرة واحدة. يضيف Joryio هذه الرؤوس تلقائياً إلى البريد الصادر.
مفعّل افتراضياً. الرأس مفعّل في كل مساحة عمل، بما في ذلك مساحة عمل لم تحفظ إعدادات الاشتراكات قط - كل بريد تسويقي (الحملات والرحلات) يحمله. لا يُزال إلا عند إيقاف مفتاح List-Unsubscribe في إعدادات الاشتراكات، أو عندما تضبط حملة معاملاتية تجاوزها الخاص بدون إلغاء اشتراك - للمعاملات فقط. يشترط Gmail وYahoo إلغاء الاشتراك بنقرة واحدة على المرسلين بكميات كبيرة، لذا أبقه مفعّلاً في البريد التسويقي.
الرؤوس المضافة
List-Unsubscribe: <https://api-eu1.joryio.com/api/u/{token}>
List-Unsubscribe-Post: List-Unsubscribe=One-Click
الإعداد
يُحفظ في إعدادات مساحة العمل (غياب كائن listUnsubscribe، أو وجوده دون enabled، يعني مفعّلاً؛ فقط enabled: false يوقفه):
subscriptionSettings: {
listUnsubscribe: {
enabled: true,
includeMailto: true, // Include mailto: link (recommended for Gmail)
scope: 'global' // 'global' or 'list'
}
}
خيارات النطاق
| النطاق | السلوك |
|---|---|
global | يلغي الاشتراك بنقرة واحدة من جميع اتصالات Email |
list | يلغي الاشتراك من القائمة المحددة التي أُرسل منها Email فقط |
تحكم على مستوى الحملة
في حملة Email، تحتوي خطوة الإنشاء على اختيار إلغاء الاشتراك يتحكم في وجود الرابط والرأس بنقرة واحدة وفي ما يزيله:
- إلغاء عام، الافتراضي: يُضاف الرأس ويزيل الإلغاء المستلم من Email كله في مساحة العمل. وهو الخيار المعتاد للبريد التسويقي.
- إلغاء الاشتراك من:
<topic>، يظهر فقط مع قوائم اشتراك: يُضاف الرأس ويزيل المستلم من هذا الموضوع فقط، مع بقاء المواضيع الأخرى. ويؤدي اختيار الموضوع أيضاً إلى تخطي من ألغوه بالفعل. - لا إلغاء اشتراك، للمعاملات فقط: يلغي رأس List-Unsubscribe لهذه الرسالة، مثل الإيصالات وإعادات تعيين كلمة المرور والرموز لمرة واحدة، وهي معفاة من متطلبات إلغاء الاشتراك.
الاستهداف مقابل نطاق الإلغاء. هذا التحكم يتعلق بالرابط أو الرأس فقط ولا يصفّي المستلمين. للإرسال إلى مشتركي موضوع فقط، أضف فلتر عضو في قائمة في خطوة الجمهور؛ فهو يستثني من ألغوا القائمة ويقيّم عند الإرسال.
لا تملك SMS وWhatsApp رأس RFC 8058، لذا تعرضان بدلاً منه اختيار موضوع إلغاء الاشتراك، عام أو موضوع محدد، بالمعنى نفسه. لا يوجد خيار «لا إلغاء» لأن STOP يُحترم دائماً.
عند الإرسال، يتقدم اختيار الحملة على سياسة مساحة العمل. الشكل المخزن:
campaign.channelConfig = {
// omit listUnsubscribe entirely to inherit the workspace policy (= Global)
listUnsubscribe: {
enabled: false, // "No unsubscribe": suppress the header for this campaign
},
};
// Topic scope is stored separately as the campaign's subscriptionCategoryId.
الامتثال: اختر «لا إلغاء» فقط لرسائل معاملات أو علاقة حقيقية. يتطلب البريد الجماعي والتسويقي رأس List-Unsubscribe وفق قواعد المرسلين الجماعيين في Gmail وYahoo.
صفحة التفضيلات المستضافة وإلغاء الاشتراك
تحمل كل رسالة رابطاً إلى الصفحة المستضافة: رابط إلغاء الاشتراك (/u/:token) ورابط إدارة التفضيلات (/preferences/:token). يشرح هذا القسم ما يراه المستلم هناك.
القنوات التي تظهر
تعرض الصفحة فقط القنوات المنطقية لهذا الشخص:
- القناة مُعدّة في مساحة العمل (لها مزوّد أو مُرسِل مُعدّ)، و
- يمكن الوصول إلى الشخص عليها: عنوان بريد إلكتروني لـ Email؛ رقم هاتف لـ SMS وWhatsApp وViber؛ جهاز إشعارات فورية نشط واحد على الأقل أو اشتراك Web Push لـ Push.
القناة التي يشترك فيها الشخص حالياً تظهر دائماً، حتى إن لم يكن الوصول إليه عليها ممكناً بطريقة أخرى، كي يستطيع مغادرتها دائماً. تتبع صفوف القوائم القاعدة نفسها. ويظهر Viber بتسميته الخاصة مثل أي قناة أخرى.
رابط إلغاء الاشتراك: نقرة واحدة في الصفحة، والتراجع
فتح رابط إلغاء الاشتراك لا يغيّر شيئًا بحد ذاته. تسأل الصفحة أولًا:
- تذكر ما الذي سيتوقف ومن أي جهة - مثلًا "لن تتلقى بعد الآن رسائل البريد الإلكتروني من Acme." - والعنوان الذي أُرسلت إليه الرسالة.
- يضغط الشخص على إلغاء الاشتراك. وحدها النقرة الحقيقية أو ضغطة لوحة المفاتيح على هذا الزر ترسل إلغاء الاشتراك: الصفحة لا تلغي الاشتراك من تلقاء نفسها أبدًا، مهما بقيت مفتوحة. ويمكن اختيار سبب اختياري فوق الزر مباشرة.
- تغيير التفضيلات بدلًا من ذلك يفتح عناصر التحكم الكاملة في القنوات والقوائم بدلًا من إلغاء الاشتراك.
يطرح مركز التفضيلات السؤال نفسه. زر إلغاء الاشتراك فيه لا يلغي الاشتراك بحد ذاته: بل يفتح هذا السؤال مع السبب الاختياري، ووحده الضغط على إلغاء الاشتراك هناك يرسل إلغاء الاشتراك. يُطلب السبب في هذا السؤال فقط - حفظ التفضيلات وإيقاف قناة أو قائمة وإعادة الاشتراك لا تطلب سببًا ولا ترسله أبدًا.
نطاق الرابط لم يتغير: القناة التي وصلت عبرها الرسالة، أو قائمة واحدة؛ والرابط الأقدم الذي يسبق الروابط لكل قناة ما زال يلغي الاشتراك من كل شيء.
بعد إلغاء الاشتراك، يعرض أعلى الصفحة تم إلغاء اشتراكك وما الذي أُزيل، ويقدّم:
- تراجع - يظهر لمدة 10 دقائق. يعيد الاشتراك في ما أُزيل للتو بالضبط، عبر المسار الموثّق نفسه لحفظ التفضيلات (يُسجَّل كـ
undo_unsubscribe)، ويعيد تفعيل الرابط. - إدارة التفضيلات - يُظهر أسفلها عناصر التحكم في القنوات والقوائم.
نتيجة كل إجراء (إلغاء الاشتراك، إلغاء الاشتراك من كل شيء، الحفظ، إعادة الاشتراك) تظهر أعلى الصفحة وتنتقل الصفحة إليها. ويعمل هذا أيضًا في صفحة بتصميم مخصص (يوضع السؤال وعناصر التحكم في موضع {{ preferences_form }}) وفي وضع إعادة التوجيه (يضغط الشخص على إلغاء الاشتراك أولًا، ويُسجَّل الإلغاء قبل نقله إلى عنوان URL الخاص بكم).
من 2026-10-11 إلى 2026-10-15 كانت الصفحة تلغي الاشتراك من تلقاء نفسها بعد أن تظهر لنحو ثانية. لم يعد ذلك يحدث - راجعوا القسم التالي.
لماذا تطلب الصفحة نقرة
لماذا يهم ذلك. تشغّل شركات كثيرة أنظمة أمان بريد مؤسسية تفتح كل رابط في الرسالة ("safe links" أو فحص الروابط) قبل أن يقرأها الشخص. وبعض هذه الماسحات يفتح الروابط في متصفح حقيقي يبدو للخادم تمامًا مثل إنسان. لذلك فإن صفحة تلغي الاشتراك من تلقاء نفسها بمجرد فتحها ألغت اشتراك أشخاص لم يطلبوا ذلك قط - في إحدى الحالات بعد 48 ثانية من الإرسال، مباشرة بعد أن نقر الماسح على كل روابط الرسالة.
ما الذي يفعله Joryio.
- فتح الرابط لا يغيّر شيئًا. يجب أن يضغط شخص على إلغاء الاشتراك في الصفحة.
- لا يعمل الزر إلا بنقرة حقيقية أو ضغطة لوحة مفاتيح. لا يستطيع سكربت يعمل في الصفحة أن يضغطه نيابة عن الشخص.
- يُعرض التراجع لمدة 10 دقائق، ليتمكن من غادر بالخطأ من العودة بنقرة واحدة.
- إلغاء الاشتراك الذي ما زال يبدو تلقائيًا (حدث خلال ثوانٍ من إرسال الرسالة، أو تبدو حركة المرور كأنها ماسح) يُسجَّل، لكنه يُعلَّم بـ ربما تلقائي في سجل اشتراكات جهة الاتصال لتراجعوه.
زر إلغاء الاشتراك في تطبيق البريد يبقى بنقرة واحدة. تعرض Gmail وYahoo وApple Mail زر Unsubscribe خاصًا بها وفق معيار النقرة الواحدة (RFC 8058، الرأس List-Unsubscribe-Post). وهو مطلوب من المرسلين بكميات كبيرة، ويرسله مزوّد صندوق البريد فقط عندما يضغط الشخص ذلك الزر، ولا تشغّله ماسحات الروابط. يعمل تمامًا كما من قبل (راجعوا رأس List-Unsubscribe). ويستخدم عنوانًا مختلفًا عن زر الصفحة، لذا يُسجَّل الاثنان كلٌّ على حدة.
أين تظهر أسباب إلغاء الاشتراك
يعرض السؤال عن إلغاء الاشتراك (في رابط إلغاء الاشتراك، وبعد زر إلغاء الاشتراك في مركز التفضيلات) سبباً اختيارياً لإلغاء الاشتراك. يظهر السبب، ووسم تلقائي على الأرجح، في ثلاثة أماكن:
- ملف جهة الاتصال - تعرض بطاقة سجل الاشتراك السبب في كل إلغاء ووسم تلقائي على الأرجح على الموسومة.
- تحليلات الحملة - بطاقة إلغاءات الاشتراك حسب السبب بجانب عدد الإلغاءات: صف لكل شخص حسب آخر سبب له، وأهم الأسباب مع "أخرى"، و"لم يُذكر سبب". الإلغاءات المسجلة قبل أكتوبر 2026 ليس لها سبب في التحليلات وتُحسب "لم يُذكر سبب".
- Settings > Subscriptions > Unsubscribe reasons - قائمة مساحة العمل لأحدث الإلغاءات التي لها سبب أو وسم: الوقت، وجهة الاتصال (تُقنَّع البيانات الشخصية للأعضاء الذين لا يملكون صلاحية
pii:view)، والقناة أو القائمة، والسبب والحملة، مع مرشح التلقائية على الأرجح فقط.
كيف حدث كل إلغاء اشتراك. منذ 2026-10-15 يسجّل كل إلغاء اشتراك أيضًا الطريقة التي وصل بها - زر إلغاء الاشتراك في تطبيق البريد، أو زر إلغاء الاشتراك في الصفحة، أو مركز التفضيلات، أو الإلغاء من كل شيء، أو الـ API، أو عضو في الفريق من لوحة التحكم، أو الـ SDK، أو الاستيراد، أو رد STOP، أو شكوى بريد عشوائي، أو الإلغاء عبر مزوّد البريد، أو مزامنة المتجر - إضافة إلى المتصفح (المتصفح ونظام التشغيل فقط، وليس السلسلة الكاملة أو عنوان IP أبدًا) وكم من الوقت بعد الإرسال حدث ذلك. يعرض سجل الاشتراكات لجهة الاتصال ذلك في كل إلغاء تحت الطريقة. أما الإلغاءات التي نفذتها الصفحة دون نقر بين 2026-10-11 و2026-10-15 فتظهر كـ "فُتحت صفحة إلغاء الاشتراك دون نقر".
أسئلة شائعة: إلغاءات الاشتراك التلقائية
هل يمكن لماسح روابط إلغاء اشتراك جهات اتصالي؟ ليس من الصفحة: فتح الرابط لا يغيّر شيئًا، ولا تلغي الصفحة الاشتراك إلا عندما يضغط شخص على إلغاء الاشتراك بنقرة حقيقية أو ضغطة لوحة مفاتيح. أما الإلغاءات التي نفذتها الصفحة من تلقاء نفسها بين 2026-10-11 و2026-10-15 فتظهر كـ "فُتحت صفحة إلغاء الاشتراك دون نقر" في سجل اشتراكات جهة الاتصال.
أرى موجة مفاجئة من إلغاءات الاشتراك. ماذا أفعل؟ افتح Settings > Subscriptions > Unsubscribe reasons، وفعّل التلقائية على الأرجح فقط، وراجع المدخلات الموسومة وحملتها. أعد اشتراك الشخص فقط بموافقته (مثلاً يخبرك أنه كان خطأ، أو يشترك من جديد). لا تُعِد اشتراك الأشخاص جماعياً أبداً: إلغاء الاشتراك سحب للموافقة حتى يقول الشخص خلاف ذلك.
هل يغيّر هذا زر Unsubscribe في Gmail أو Yahoo أو Apple Mail؟ لا. زر النقرة الواحدة آلية قياسية منفصلة ولم يتغير.
يفتح شخص رابط إلغاء الاشتراك نفسه مرة أخرى. ماذا يحدث؟ يظل الرابط يعمل حتى تنتهي صلاحيته. إذا كان الشخص لا يزال ملغى اشتراكه، تؤكد الصفحة ذلك ولا يُسجَّل أي شيء مرة أخرى، فلا يُحتسب شيء مرتين. إذا اشترك من جديد في الأثناء (مثلًا من مركز التفضيلات)، يلغي الرابط اشتراكه مرة أخرى: النقر على إلغاء الاشتراك يعمل دائمًا، مع الحماية نفسها من أدوات الفحص كما في المرة الأولى.
صفحة التفضيلات بتصميم مخصص
يرى المستلمون افتراضياً مركز تفضيلات Joryio المدمج عند النقر على إلغاء الاشتراك أو إدارة التفضيلات. يمكنك استبداله بصفحتك ذات العلامة التجارية.
المكان: الإعدادات ← الاشتراكات ← صفحة التفضيلات.
الصفحة لكل مساحة عمل ولها ثلاثة أوضاع:
- افتراضي مدمج: مركز تفضيلات Joryio القياسي، بمفاتيح القنوات والقوائم؛ يعمل دائماً ولا يحتاج إعداداً.
- HTML مخصص: محرر HTML/Liquid كامل مع معاينة مباشرة ببيانات تجريبية.
- إعادة التوجيه إلى URL: تجاوز الصفحة كلياً وإرسال المستلم إلى صفحتك. يسجل رابط الإلغاء الإلغاء أولاً ثم يعيد التوجيه إلى URL مع
?email=…&status=unsubscribed. أما رابط إدارة التفضيلات فيعيد التوجيه مع?token=…لتستخدمه صفحتك في قراءة التفضيلات وكتابتها عبر API العام. يظل الامتثال محفوظاً في الحالتين.
كيف تعمل
- اكتب جسم الصفحة في HTML، ويمكنه استخدام Liquid: التخصيص مثل
{{ firstName }}و{{ email }}، وكتل المحتوى مثل{{ blocks.<slug> }}، ووسوم الاشتراك أدناه. - ضع الوسم
{{ preferences_form }}حيث يجب أن تظهر أدوات الاشتراك الفعلية، مفاتيح القنوات والقوائم وحفظ وإلغاء الاشتراك من الكل. يعرض Joryio النموذج العامل في هذا الموضع. - إذا حذفت الوسم، تُلحق الأدوات تلقائياً في النهاية، ليتمكن المستلم دائماً من الإلغاء، وينبهك المحرر إلى غيابه.
- تُعرض الصفحة من الخادم لكل مستلم، فتكون روابط الإلغاء والتخصيص حقيقية، ثم تُنقح قبل وصولها إلى المتصفح: يبقى التخطيط والصور والأنماط المضمنة وكتلة
<style>محددة النطاق، وتزال البرامج ومعالجات الأحداث وiframes وعناصر<form>وCSS الذي يحمل برامج.
الوسوم المتاحة
| الوسم | الوصف |
|---|---|
{{ preferences_form }} | أدوات الاشتراك الفعلية، ضعها مرة واحدة |
{{ unsubscribe_url }} | رابط الإلغاء العام |
{{ preferences_url }} | رابط العودة إلى الصفحة |
{{ resubscribe_url }} | رابط إعادة الاشتراك |
{{ firstName }} / {{ email }} | تخصيص المستلم |
{{ blocks.<slug> }} | كتلة محتوى قابلة لإعادة الاستخدام |
ملاحظات
- يقبل الترميز الكامل للصفحة،
<html>و<head>و<body>؛ فالصفحة شاشة مستقلة، ويُعرض محتوى الجسم وأنماطه. - تخدم الصفحة نفسها رابط الإلغاء بنقرة واحدة،
/u/:token، ورابط إدارة التفضيلات،/preferences/:token. - تقدم الصفحة المدمجة أيضاً إجراء إعادة الاشتراك في الكل. ويعيد
{{ resubscribe_url }}، الذي يضيف?action=resubscribe، الاشتراك عند فتحه. أما سبب إلغاء الاشتراك الاختياري، الذي يسجل في سجل التدقيق وحدثmessage.unsubscribed، فيُطلب في سؤال إلغاء الاشتراك فقط، وليس أبداً بجانب الحفظ أو إعادة الاشتراك في الكل.
معالجة الارتدادات
أنواع الارتداد
| النوع | الوصف | الإجراء |
|---|---|---|
| ارتداد مؤقت | فشل تسليم مؤقت، مثل امتلاء الصندوق أو توقف الخادم | يُعد خلال نافذة، ثم يتحول إلى ارتداد دائم إن زاد عن الحد |
| ارتداد دائم | فشل تسليم دائم، مثل عنوان غير صالح أو نطاق غير موجود | يُعلّم Email بأنه غير صالح ويمنع الإرسال إليه |
يعلّم الارتداد الدائم العنوان غير صالح ويوقف الإرسال، لكنه لا يلغي اشتراك جهة الاتصال، لأنها لم تطلب الإلغاء وتبقى موافقتها كما هي. إزالة حالة الارتداد، مثلاً بعد تغيير Email، تجعله قابلاً للإرسال مجدداً. يتبع المنع عنوان Email عبر كل جهات الاتصال المكررة في مساحة العمل. يتحمل النظام الارتداد المؤقت حتى softBounceMaxRetries مرة ضمن softBounceRetryHours، وبعدها يعامله كارتداد دائم.
الإعداد
subscriptionSettings: {
bounceHandling: {
softBounceRetryHours: 24, // Window in which soft bounces are counted
softBounceMaxRetries: 5, // Soft bounces in-window before escalating to a hard bounce
resubscribeOnEmailChange: true // Clear the invalid flag when the email changes
}
}
تكامل webhook
يعالج Joryio تلقائياً webhooks الارتداد من:
- Amazon SES عبر إشعارات SNS.
- SendGrid عبر Event webhooks.
- Mailgun عبر Webhooks.
تُضبط webhooks الأحداث والارتداد من الموفر أثناء التهيئة، ثم تتدفق الأحداث تلقائياً.
مسح الارتداد يدوياً
يمكن للمشرفين مسح حالة الارتداد من الواجهة أو API:
await subscriptionsApi.clearBounceStatus(userId, 'Email confirmed valid by user');
مسح الارتداد من لوحة التحكم أو الـ API يمسح الارتداد المؤقت فقط. الارتداد الدائم أو شكوى البريد العشوائي لا يرفعهما إلا دعم Joryio - راجع جهات الاتصال التي تشترك في بريد إلكتروني أو هاتف.
إذا ارتد البريد المرسل إلى عناوين @privaterelay.appleid.com أو @private.icloud.com لأن نطاق الإرسال الخاص بك لم يُسجَّل لدى Apple، فقد تكون هذه العناوين قد وُسمت بأنها غير صالحة. أصلح التسجيل أولاً، ثم امسح الارتدادات. راجع Apple Private Email Relay.
متغيرات قوالب Liquid
المتغيرات المتاحة
استخدم هذه في قوالب Email:
| المتغير | الوصف |
|---|---|
{{ unsubscribe_url }} | رابط الإلغاء العام |
{{ unsubscribe_url_list }} | رابط إلغاء خاص بالقائمة |
{{ preferences_url }} | رابط مركز التفضيلات |
{{ resubscribe_url }} | رابط إعادة الاشتراك لحملات الاستعادة |
مثال للاستخدام
<p>Don't want to receive these emails?</p>
<p>
<a href="{{ unsubscribe_url_list }}">Unsubscribe from this list</a>
or
<a href="{{ preferences_url }}">Manage your preferences</a>
</p>
فلاتر الشرائح
أنواع الفلاتر
توجد ثلاثة فلاتر جديدة للتقسيم.
فلتر اشتراك القناة
استهدف المستخدمين بحالة اشتراك القناة:
{
type: 'channel_subscription',
operator: 'subscribed_to_channel', // or 'not_subscribed_to_channel'
channel: 'email',
subscriptionStatus: 'opted_in' // optional: specific status
}
فلتر عضوية القائمة
استهدف المستخدمين بعضوية القائمة:
{
type: 'list_membership',
operator: 'member_of_list', // or 'not_member_of_list'
listId: 'list-uuid',
channel: 'email' // optional: specific channel
}
فلتر حالة الارتداد
استهدف المستخدمين حسب صلاحية Email:
{
type: 'bounce_status',
operator: 'email_valid' // 'email_valid', 'email_bounced',
// 'email_hard_bounced', 'email_soft_bounced'
}
حالات الاستخدام
- الإرسال إلى من وافقوا فقط:
{ type: 'channel_subscription', operator: 'subscribed_to_channel',channel: 'email', subscriptionStatus: 'opted_in' }
- استبعاد عناوين Email المرتدة:
{ type: 'bounce_status', operator: 'email_valid' }
- استهداف مشتركي النشرة:
{ type: 'list_membership', operator: 'member_of_list',listId: 'newsletter-list-id' }
مرجع API
يوجد مرجع REST الكامل لإدارة موافقة القنوات وقوائم الاشتراك وعضوية القوائم، بكل نقاط النهاية وأمثلة الطلب والاستجابة والنطاقات المطلوبة، في صفحة Subscriptions API.
نقطتان مهمتان قبل الاستدعاء:
- يمكنك الاشتراك في الاستدعاء نفسه الذي يُنشئ جهة الاتصال. كل عنصر في
attributesضمنPOST /users/trackيقبلsubscriptions- راجع الاشتراك في القوائم. وتبقى نقاط النهاية المخصصة أدناه طريقة تغيير الموافقة لاحقاً. لا يُعاد إحياء إلغاء قائم أبداً بهذا الاستدعاء أو باستيراد: بل يُحتفظ به ويُبلَّغ عنه، وتتطلب إعادة الموافقة لجهة اتصال ألغت اشتراكها استدعاءً صريحاً لنقطة نهاية الاشتراك دائماً. :userIdفي هذه المسارات هوidالداخلي لجهة الاتصال في Joryio، كما يعيده Users API، لا معرّف المستخدم الخارجي لديك.
مثال لموافقة اعتيادية: اشتراك جهة اتصال في قائمة على قناة Email:
curl -X POST https://api-eu1.joryio.com/api/subscriptions/contacts/665f1c2ab3d4e5f6a7b8c9d0/lists/3f6c1a2e-9d4b-4f0a-8c7e-1b2d3e4f5a6b \
-H "Authorization: Bearer jry_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{ "channel": "email", "source": "api", "consentText": "Weekly newsletter signup" }'
نقاط نهاية عامة، بلا مصادقة
// One-click unsubscribe (RFC 8058): the mail app's List-Unsubscribe-Post
POST /u/:token
// The hosted page's Unsubscribe button (a person's click only, see #automatic-unsubscribe)
// Body: { reason?: string, view?: 'unsubscribe' | 'preferences' }
POST /u/:token/confirm
// Get preferences
GET /preferences/:token
// Save preferences
POST /preferences/:token
Body: { channels: [...], lists: [...], reason?: string, undo?: boolean }
نقاط نهاية SDK، مصادقة مفتاح SDK
تستخدم Web SDK هذه النقاط وتصادق عبر رأس X-SDK-Key:
// Update channel subscription
POST /v1/subscriptions/channel
Headers: { 'X-SDK-Key': 'jry_sdk_web_...' }
Body: {
channel: 'email' | 'sms' | 'whatsapp' | 'push' | 'viber',
status: 'optedIn' | 'subscribed' | 'unsubscribed',
userId?: string, // Use if user is identified
anonymousId?: string // Use if user is anonymous
}
// Update subscription group (list) membership
POST /v1/subscriptions/group
Headers: { 'X-SDK-Key': 'jry_sdk_web_...' }
Body: {
groupId: string, // List ID
channel: 'email' | 'sms' | 'whatsapp' | 'push' | 'viber',
action: 'subscribe' | 'unsubscribe',
userId?: string,
anonymousId?: string
}
إذا لم يكن هناك ملف بعد لـ userId أو anonymousId، ينشئه الخادم - حسب userId عند إرساله، وإلا كملف مجهول - تمامًا كما يفعل /v1/alias/add، فلا يضيع تغيير الموافقة الذي يتم قبل تخزين الحدث الأول. كانت الخوادم الأقدم تجيب بـ 404 بدلًا من ذلك. رموز الحالة لهذه المسارات مذكورة في استجابات مسارات الكتابة الأخرى.
الإعداد
إعدادات مساحة العمل
اضبط إعدادات الاشتراك في الإعدادات > الاشتراكات:
interface SubscriptionSettings {
listUnsubscribe?: {
enabled: boolean;
includeMailto: boolean;
scope: 'global' | 'list';
};
bounceHandling?: {
softBounceRetryHours: number; // Window for counting soft bounces
softBounceMaxRetries?: number; // Soft bounces in-window before escalating to hard
resubscribeOnEmailChange: boolean; // Clear the invalid flag when the email changes
};
doubleOptIn?: {
defaultEnabled: boolean;
confirmationEmailTemplateId?: string;
};
bccEmail?: string; // For compliance archiving
}
الامتثال
ضمان تذييل إلغاء الاشتراك
حتى لا يخرج Email تسويقي من دون وسيلة للإلغاء:
- كتلة تذييل الامتثال: كتلة محتوى
compliance_footer، تُنشأ تلقائياً بافتراض منطقي عند تفعيل الإلحاق التلقائي للمرة الأولى، وتحمل عنوانك وروابط الإلغاء والتفضيلات. أشر إليها في أي مكان بـ{{ blocks.compliance_footer }}أو عدلها ضمن Content Blocks. - مفتاح الإلحاق التلقائي: الإعدادات ← الاشتراكات ← «إلحاق تذييل إلغاء اشتراك تلقائياً عند غيابه». عند تفعيله، يلحق مسار إرسال Email التذييل بكل Email تسويقي يحمل رأس List-Unsubscribe ولا يحتوي نصه على رابط إلغاء أو تفضيلات. لا يمنع الإرسال أبداً.
- تحذير أداة الإنشاء: يعرض منشئ حملة Email تحذيراً إذا لم يحمل النص رابط إلغاء، كي تكتشف ذلك قبل الإرسال. يقدم اختصارين: إضافة رابط لفتح المحرر، وتفعيل الإلحاق التلقائي للتذييل للانتقال إلى هذه الصفحة. يمكن تجاهله للجلسة؛ وعند تشغيل الإلحاق يصبح ملاحظة هادئة لأن التذييل يضاف لك.
يمكن أيضاً اختيار قوائم الاشتراك في عقد رحلات SMS وWhatsApp وViber، لا Email فقط؛ فتتخطى بوابة الإرسال في كل عقدة جهات الاتصال التي ألغت تلك القائمة في أي قناة.
GDPR، أوروبا
- استخدم موافقة مزدوجة لمستخدمي الاتحاد الأوروبي.
- خزّن نص الموافقة وطابعها الزمني.
- وفّر وصولاً سهلاً إلى مركز التفضيلات.
- احترم طلبات الإلغاء فوراً.
- احتفظ بسجل تدقيق لكل تغييرات الاشتراك.
CAN-SPAM، الولايات المتحدة
- ضمّن عنواناً بريدياً فعلياً في Email.
- احترم طلبات الإلغاء خلال 10 أيام عمل، ويطبقها Joryio فوراً.
- عرّف Email التجاري بوضوح.
- لا تستخدم سطور موضوع مضللة.
TCPA، الولايات المتحدة وSMS
- احصل على موافقة كتابية صريحة قبل إرسال SMS.
- احترم كلمات STOP فوراً.
- قدّم تعليمات إلغاء في الرسائل.
- يعالج Joryio تلقائياً:
STOPوSTOPALLوUNSUBSCRIBEوCANCELوENDوQUITوREVOKEوOPTOUTوOPT OUTوOPT-OUT، أي الأساس الإنجليزي الدائم، إضافة إلى الافتراضيات المحلية، مثلהסרبالعبرية، وأي كلمات مخصصة تضيفها.
معالجة كلمات SMS وWhatsApp
يعالج Joryio الكلمات الواردة تلقائياً مع تسامح حالة الأحرف والترقيم؛ فـ Stop وSTOP! و" stop " كلها مطابقة. STOPALL هي كلمة الإلغاء الوحيدة المدمجة على مستوى القناة، إضافة إلى أي كلمات عامة مخصصة؛ أما كل كلمة أخرى فتخص مجموعة الاشتراك لكل رقم أو WABA التي استقبلت الرسالة، وSTART يعيد اشتراك المجموعة نفسها.
SMS
| الكلمة | الإجراء |
|---|---|
STOP, UNSUBSCRIBE, CANCEL, END, QUIT, REVOKE, OPTOUT, OPT OUT, OPT-OUT | إلغاء مجموعة الرقم المستلم |
STOPALL | إلغاء القناة كلها، كل الأرقام |
START, YES, UNSTOP, SUBSCRIBE, OPTIN | إعادة اشتراك مجموعة الرقم المستلم |
HELP, INFO | إرسال رسالة مساعدة |
| الافتراضيات المحلية والإضافات المخصصة | الإجراء نفسه لفئتها |
| الكلمة | الإجراء |
|---|---|
STOP, UNSUBSCRIBE, CANCEL, END, QUIT, OPTOUT, OPT-OUT | إلغاء مجموعة WABA المستلمة |
STOPALL | إلغاء القناة كلها، كل WABA |
START, UNSTOP, SUBSCRIBE, YES, OPTIN, OPT-IN | إعادة اشتراك مجموعة WABA المستلمة |
تتحقق توقيعات webhooks الواردة، فتُرفض STOP وSTART المزورة والمزودون غير الداعمين للتحقق. وعند تعذر حل المجموعة، يطبق الإلغاء بأمان على القناة كلها. يُضبط webhook SMS الوارد على أرقامك أثناء التهيئة وتعالج الكلمات تلقائياً.
أفضل الممارسات
- استخدم رؤوس List-Unsubscribe دائماً لتحسين التسليم وإظهار Gmail زر الإلغاء.
- نفذ الموافقة المزدوجة للتسويق لجودة قائمة وامتثال أفضل.
- راقب معدلات الارتداد لأن الارتدادات العالية تضر سمعة المرسل.
- قسّم حسب حالة الاشتراك وأرسل فقط لمن وافقوا.
- سهّل الإلغاء بنقرة واحدة ومن دون تسجيل دخول.
- احتفظ بسجلات التدقيق فهي مطلوبة للامتثال ومفيدة للنزاعات.
- اختبر مركز التفضيلات لتضمن قدرة المستخدمين على إدارة تفضيلاتهم.
- استخدم إلغاء خاصاً بالقائمة كي يظل المستخدم مشتركاً في بعض المحتوى.
استكشاف الأخطاء وإصلاحها
مشاكل شائعة
لا يُرسل Email
- تحقق مما إذا كانت حالة Email للمستخدم
unsubscribed. - تحقق مما إذا كان Email معلّماً غير صالح بسبب الارتدادات.
- تحقق من حالة الارتداد في ملف المستخدم.
إلغاء الاشتراك لا يعمل
- تحقق من انتهاء الرمز، الافتراضي 90 يوماً.
- تحقق من صحة توقيع الرمز.
- راجع سجل التدقيق بحثاً عن الأخطاء.
لا تُعالج الارتدادات
- تحقق من ضبط URL لـ webhook في موفر Email.
- تحقق من مصادقة webhook.
- راجع سجلات الأخطاء.
التصحيح
تحقق من حالة الاشتراك:
# API call
curl -X GET "https://api-eu1.joryio.com/api/subscriptions/contacts/{userId}" \
-H "Authorization: Bearer {token}"
اعرض سجل التدقيق:
curl -X GET "https://api-eu1.joryio.com/api/subscriptions/contacts/{userId}/history" \
-H "Authorization: Bearer {token}"