דלג לתוכן הראשי

ניהול הרשמות

מסמך זה מתאר את המערכת המקיפה של Joryio לניהול הרשמות והסכמות. המערכת מטפלת בהרשמות לפי ערוץ, בהרשמות לפי רשימה או נושא, בכותרות List-Unsubscribe לפי RFC 8058, בהחזרות וביכולות תאימות.

תוכן העניינים

  1. סקירה כללית
  2. מודלי נתונים
  3. הרשמות לערוץ
  4. אינטגרציה עם Web SDK
  5. רשימות הרשמה
  6. קבוצות הרשמה לפי מספר (SMS ו־WhatsApp)
  7. כותרת List-Unsubscribe (RFC 8058)
  8. דף העדפות (עיצוב מותאם אישית)
  9. טיפול בהחזרות
  10. משתני תבניות Liquid
  11. מסנני סגמנטים
  12. הפניית API
  13. תצורה
  14. תאימות

סקירה כללית

מערכת ניהול ההרשמות של Joryio מספקת:

  • הרשמות לפי ערוץ: מעקב אחר מצב Opt-In/Opt-Out באימייל, ב־SMS, ב־WhatsApp, בהודעות Push וב־Viber
  • הרשמות לפי רשימה: מאפשרות למשתמשים להירשם לנושאים או לרשימות דיוור מסוימים
  • תאימות ל־RFC 8058: כותרות לביטול הרשמה בלחיצה אחת, לשיפור יכולת מסירת האימייל
  • טיפול בהחזרות: טיפול אוטומטי בהחזרות רכות וקשות
  • יומן ביקורת: היסטוריה מלאה של שינויי הרשמה לצורכי תאימות
  • מסנני סגמנטים: התמקדות במשתמשים לפי מצב ההרשמה

מודלי נתונים

הרשמה לערוץ (לכל משתמש)

לכל משתמש יש סטטוס הרשמה לכל ערוץ תקשורת:

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המשתמש השלים אישור double opt-in
subscribedהמשתמש מנוי (single opt-in)
unsubscribedהמשתמש ביטל הרשמה

עדכון סטטוס ערוץ

// Via API
await subscriptionsApi.updateChannelSubscription(userId, 'email', {
status: 'unsubscribed',
source: 'preference_center',
reason: 'User requested via preference center'
});

שיטות עבודה מומלצות

  • תעדו תמיד את המקור של שינויי ההרשמה
  • שמרו את טקסט ההסכמה כאשר משתמשים מבצעים opt-in
  • לצורך תאימות ל־GDPR, השתמשו ב־double opt-in עבור משתמשים באירופה

אינטגרציה עם Web SDK

ה־Web SDK של Joryio מאפשר לכם לנהל העדפות הרשמה ישירות מהאתר או מאפליקציית האינטרנט שלכם.

התקנה

<!-- Via script tag (served from the Joryio API) -->
<script src="https://api-eu1.joryio.com/sdk/web/latest/joryio.min.js"></script>

<!-- Or via npm -->
npm install @joryio/web-sdk

סוגי סטטוס הרשמה

ה-SDK מספק שלושה ערכי סטטוס:

סטטוסתיאור
SubscriptionStatus.OPTED_INהמשתמש ביצע opt-in מפורש (למשל, אישר double opt-in)
SubscriptionStatus.SUBSCRIBEDהמשתמש מנוי אך לא ביצע opt-in מפורש
SubscriptionStatus.UNSUBSCRIBEDהמשתמש ביטל הרשמה

הגדרת הרשמות לערוצים

import { JoryioSDK, SubscriptionStatus } from '@joryio/web-sdk';

// Initialize 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
  • ה־SDK תמיד פועל בשם "המשתמש הנוכחי" - setSubscription / addToSubscriptionGroup אינם מקבלים מזהה יעד; הם חלים על מי שה־SDK מזוהה כמותו כרגע (המזהה של מבקר אנונימי, או המשתמש שהעברתם ל־identify()). אין דרך שמבקר אחד ישנה את ההרשמות של אחר דרך ה־SDK.
  • כאשר SDK Authentication מופעל, שינויי הרשמה מחייבים משתמש מזוהה. anonymousId נוצר בצד הלקוח ואי אפשר לקשור אותו קריפטוגרפית לטוקן החתום שלכם, ולכן לאחר הפעלת SDK Authentication שינוי הרשמה אנונימי בלבד נדחה - קראו קודם ל־identify(userId) כדי שהשינוי יהיה קשור לטוקן. כאשר SDK Authentication כבוי, opt-in/opt-out אנונימי מתקבל כמו קודם.

תמיכה ב-TypeScript

import {
JoryioSDK,
SubscriptionStatus,
SubscriptionChannel,
SubscriptionPreferences
} from '@joryio/web-sdk';

const sdk = new JoryioSDK({ sdkKey: 'jry_sdk_web_...' });

// Type-safe subscription updates
const preferences: SubscriptionPreferences = {
email: SubscriptionStatus.OPTED_IN,
sms: SubscriptionStatus.UNSUBSCRIBED,
};

sdk.user.setSubscriptions(preferences);

// Type-safe channel selection
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): מנוהלות רק בידי מנהלים ואינן מוצגות למשתמשים

קבוצות הרשמה לפי מספר (SMS ו־WhatsApp)

רשימת הרשמה שמשויכת לשולח מסוים - כלומר, רשימה שנושאת senderId - משמשת כקבוצת הרשמה לפי מספר. ב־SMS הקבוצה היא לפי מספר; ב־WhatsApp הקבוצה היא לפי WABA (חשבון WhatsApp Business). כך איש קשר יכול לבטל את ההרשמה להודעות ממספר או מ־WABA מסוימים ולהישאר רשום לאחרים.

כיצד ביטולי הרשמה מוגבלים ונשמרים

  • ביטולי הרשמה נשמרים לכל קבוצה. כל קבוצה לפי מספר עוקבת אחר מצב ביטול ההרשמה שלה בנפרד מהסכמת איש הקשר לערוץ כולו ובנפרד ממספרים או מחשבונות WABA אחרים.
  • גם שליחות מקמפיין וגם שליחות ממסע מכבדות ביטולי הרשמה. לפני השליחה, המערכת בודקת את מצב ביטול ההרשמה של הנמען בקבוצה של המספר או ה־WABA השולחים. אם איש הקשר ביטל את ההרשמה לקבוצה, מדלגים על השליחה. במסע איש הקשר עדיין מתקדם לשלב הבא - מדלגים רק על ההודעה, לא על המסע.
  • מספר ברירת המחדל ב־SMS. כששולחים מהמספר המוגדר כברירת מחדל של סביבת העבודה, ביטולי ההרשמה מוגבלים לקבוצה של אותו מספר.

תיחום STOP / START נכנס

כשנמען משיב במילת מפתח, היא מוחלת על המספר המסוים (SMS) או ה־WABA המסוים (WhatsApp) שאליהם הגיעה ההודעה:

  • STOP (וכל מילת opt-out אחרת מלבד STOPALL) מוגבלת לקבוצה לפי מספר או לפי WABA - היא מבטלת לאיש הקשר את ההרשמה להודעות מאותו מספר או WABA בלבד.
  • STOPALL חלה על הערוץ כולו - היא מבטלת לאיש הקשר את ההרשמה לכל מספר או WABA באותו ערוץ.
  • START רושמת מחדש את איש הקשר לקבוצה של אותו מספר או WABA.
כתובת webhook נכנס קשורה לסביבת עבודה אחת

סביבות עבודה הן מותגים נפרדים, ולכן STOP מסיר את איש הקשר מאותו מותג - לא מכל החשבון. התיחום הזה מגיע מכתובת ה-webhook הנכנס, שנושאת סביבת עבודה אחת.

Joryio אינו יכול להסיק את המותג מתוך ההודעה עצמה. שולחים מזוהים לפי שם (למשל Acme), בעוד שתשובה מגיעה למספר טלפון - אין על מה להצליב ביניהם.

לכן כל תשובה וכל הסרה שמגיעות לכתובת נכנסת מסוימת נרשמות בסביבת העבודה של אותה כתובת. אם חשבון ספק אחד משרת יותר ממותג אחד, הגדירו כתובת נכנסת נפרדת לכל מספר בפורטל הספק, או תנו לכל מותג חשבון ספק משלו. אחרת STOP שנועד למותג ב' יירשם על מותג א', ומותג ב' ימשיך לשלוח.

מילות מפתח

הטיפול במילות מפתח נכנסות ב־SMS בנוי משלוש שכבות: בסיס באנגלית שפועל תמיד, ברירות מחדל מקומיות שפועלות כברירת מחדל ותוספות מותאמות אישית משלכם. כל השכבות משולבות בעת ההתאמה.

בסיס באנגלית (פועל תמיד ואי אפשר להסירו)

מילים אלה נדרשות לתאימות ל־FCC ול־CTIA ואי אפשר להשבית אותן:

סוגמילות מפתח
Opt-outSTOP, STOPALL, UNSUBSCRIBE, CANCEL, END, QUIT, REVOKE, OPTOUT
Opt-inSTART, YES, UNSTOP, SUBSCRIBE, OPTIN
HelpHELP, INFO
בסיס FCC אפריל 2025

REVOKE ו־OPTOUT הן חלק מבסיס ה־opt-out (כלל ה־FCC לביטול הסכמה ל־SMS מאפריל 2025). הן מכובדות תמיד - אין צורך להוסיף או להפעיל אותן.

ברירות מחדל מקומיות (פעילות כברירת מחדל ונוספות לבסיס)

מילות opt-out,‏ opt-in ועזרה נפוצות בשפות אחרות מזוהות מראש, כך שאיש קשר יכול לבטל הרשמה בשפתו. לדוגמה:

שפהOpt-outOpt-inHelp
עבריתהסר, הסרה, עצור, ביטול, הפסקהתחל, הצטרף, כןעזרה, מידע
ספרדיתPARE, BASTA, CANCELAR, ALTOSI, ALTAAYUDA
צרפתיתARRET, ARRÊT, DESABONNEROUIAIDE
גרמניתSTOPP, ABBESTELLENJAHILFE
פורטוגזיתPARAR, SAIR--

תוספות מותאמות (לכל ארגון)

תחת Settings → SMS / Subscriptions תוכלו להוסיף מילות opt-out,‏ opt-in ועזרה משלכם (וכן מילות opt-out משלכם שחלות על הערוץ כולו). הבסיס וברירות המחדל המקומיות מוצגים לקריאה בלבד לצד הרשימה המותאמת שניתנת לעריכה, כך שאתם מנהלים רק את התוספות שלכם. מילות המפתח ל־SMS מוגדרות ברמת הארגון.

WhatsApp

סוגמילות מפתח
Opt-outSTOP, STOPALL, UNSUBSCRIBE, CANCEL, END, QUIT, OPTOUT, OPT-OUT
Opt-inSTART, UNSTOP, SUBSCRIBE, YES, OPTIN, OPT-IN

רק STOPALL חלה על הערוץ כולו; כל מילת opt-out אחרת שלמעלה מוגבלת לקבוצה לפי מספר או לפי WABA. אותו הדבר חל על כל מילת opt-out מותאמת ל־SMS שתגדירו כחלה על הערוץ כולו - היא מתנהגת כמו STOPALL, ואילו מילות opt-out רגילות נשארות מוגבלות למספר שאליו הגיעה ההודעה.

כיצד ההתאמה סובלנית ל"שינויים זניחים" (de minimis)

ההתאמה של הודעות נכנסות אינה רגישה לרישיות וסובלת הבדלי פיסוק ורווחים, בהתאם להנחיית CTIA שלפיה יש לכבד גם הבדלים קטנים ("זניחים"). לפני ההתאמה, גם המילה הראשונה וגם גוף ההודעה כולו מנורמלים: סימני פיסוק ורווחים מסביב מוסרים ואותיות ASCII מומרות לאותיות גדולות. לכן Stop, STOP!, " stop " ו־STOP. נחשבות כולן ל־STOP.

הנרמול בטוח לתווים שאינם ASCII - בעברית, בערבית ובמערכות כתב אחרות אין אותיות גדולות וקטנות, ולכן הן עוברות ללא שינוי (הסר נשאר הסר); רק סימני הפיסוק והרווחים שמסביב מוסרים.

הרשמה מחדש לאחר ביטול הרשמה

אופן ההרשמה מחדש תלוי בדרך שבה איש הקשר ביטל את ההרשמה:

  • שלח STOP בהודעה (או מילת opt-out אחרת) → חייב לשלוח START. כשאיש קשר מבטל הרשמה בתשובת SMS, הספק (למשל Twilio) מציב חסימה ברמת הספק על אותו מספר. אין API שמסיר אותה - הדרך היחידה להירשם מחדש היא שאיש הקשר ישלח START (או מילת opt-in אחרת) מאותו טלפון. Joryio לעולם אינה רושמת מחדש בכפייה אדם ששלח STOP; ההרשמה מחדש היא תמיד ביוזמת איש הקשר.
  • ביטל הרשמה בדף מתארח או במרכז ההעדפות → יכול להירשם מחדש באתר. איש קשר שביטל הרשמה דרך קישור או מרכז העדפות (ולא בהודעת טקסט) יכול להירשם מחדש באותה דרך - למשל באמצעות {{ resubscribe_url }} או הפעלה מחדש של SMS במרכז ההעדפות.

קדימות ורשת ביטחון

  • ביטול הרשמה גלובלי מהערוץ גובר על קבוצות. ביטול הרשמה גלובלי מהערוץ - למשל כשכל ערוץ ה־SMS או ה־WhatsApp של איש הקשר מוגדר כ־unsubscribed - הוא מתג השבתה קשיח שגובר על הרשמה לקבוצה כלשהי. אם ההרשמה לערוץ בוטלה באופן גלובלי, אף קבוצה לפי מספר אינה יכולה לחדש את השליחות לאותו איש קשר.
  • ברירת מחדל בטוחה לכל הערוץ. אם אי אפשר לזהות את הקבוצה לפי מספר או לפי WABA, המערכת פועלת באופן בטוח ומחילה את ביטול ההרשמה על הערוץ כולו, במקום להסתכן בהמשך שליחת הודעות לאיש קשר שניסה לבטל הרשמה.

אבטחת תעבורה נכנסת

  • הודעות Webhook נכנסות מאומתות באמצעות חתימה; הודעות STOP או START מזויפות נדחות.
  • ספקים שאינם תומכים באימות חתימה להודעות נכנסות אינם מתקבלים לעיבוד מילות מפתח נכנסות.
שמות שולח אלפאנומריים אינם יכולים לקבל STOP

קבוצה לפי מספר פועלת רק עם שולח שיכול לקבל תשובות. מספר טלפון הוא דו־כיווני - נמענים יכולים להשיב, ולכן STOP ו־opt-out פועלים. שם שולח אלפאנומרי הוא חד־כיווני - נמענים אינם יכולים להשיב, ולכן מילות STOP ו־opt-out לא יפעלו איתו. הזמינות של שמות שולח אלפאנומריים תלויה בהגדרות ספק ה־SMS שלכם.

היקף קישור ביטול ההרשמה בצמתי SMS ו־Viber במסע

צעד הודעת SMS או Viber במסע נושא קישור ביטול הרשמה שאת היקפו אפשר לבחור לכל צומת. השולח ב"מאת" מגדיר את רשימת ההרשמה, ולכן כברירת מחדל קישור ביטול ההרשמה (וגם STOP נכנס) מסיר את איש הקשר מרשימת אותו שולח בלבד - הוא נשאר נגיש מהשולחים האחרים שלכם.

בצמתי הודעת SMS ו־Viber, הבורר "קישור ביטול ההרשמה מסיר מ:" מציע:

בחירההתנהגות
רשימת השולח הזה (ברירת מחדל)קישור ביטול ההרשמה מבטל את הרשמת איש הקשר מרשימת המספר/השולח השולח בלבד - בהתאמה לאופן שבו STOP שנשלח בהודעה ממוקד.
כל ה־SMS / כל ה־Viber (גלובלי)קישור ביטול ההרשמה מבטל את הרשמת איש הקשר מהערוץ כולו - שקול ל־STOPALL.

ברירת המחדל (רשימת השולח) היא הבחירה הצפויה והממוקדת ביותר, והיא שומרת על עקביות בין קישור ביטול ההרשמה לבין היקף STOP הנכנס. הרחיבו אותו לגלובלי רק כאשר צומת אכן מייצג ביטול הרשמה בכל הערוץ. זה משקף את מודל הגלובלי־מול־רשימה של ביטול ההרשמה באימייל (List-Unsubscribe) - אותו מודל, מיושם לכל צומת עבור SMS ו־Viber.


ביטולי הרשמה באימייל חלים לפי הכתובת (אנשי קשר כפולים)

אותה כתובת אימייל יכולה להשתייך באופן לגיטימי ליותר מאיש קשר אחד בסביבת עבודה - למשל אדם שיובא פעמיים או נוצר ממקורות שונים. ביטולי הרשמה והחזרות קשות באימייל נרשמים לפי כתובת האימייל (בתוך סביבת העבודה), ולא רק לפי רשומת איש הקשר שקיבלה את ההודעה. כך פועלות פלטפורמות בשלות למעורבות לקוחות, והדבר מבטיח שביטול ההרשמה יכובד עבור האדם ולא יאבד מפני שרשומה כפולה עדיין נראית רשומה.

מה זה אומר

  • ביטול הרשמה מכסה כל כפילות. כשאדם מבטל הרשמה - באמצעות קישור ביטול ההרשמה, כותרת List-Unsubscribe בלחיצה אחת, דף העדפות או תלונת ספאם - כל אנשי הקשר באותה סביבת עבודה ובעלי אותה כתובת אימייל נחסמים, לא רק איש הקשר שאליו נשלחה ההודעה.
  • גלובלי מול רשימה. ביטול הרשמה גלובלי משתיק את הכתובת בכל הערוץ (כל קמפיין ומסע). ביטול הרשמה מרשימה/נושא משתיק את הכתובת עבור אותה רשימה בלבד - האדם נשאר בר-השגה ברשימות אחרות.
  • גם החזרות קשות חלות לפי הכתובת. החזרה קשה חוסמת את הכתובת בכל סביבת העבודה, כך שאיש קשר כפול לא יאפשר להמשיך לשלוח לתיבת דואר שאינה פעילה. חסימה מטעמי יכולת מסירה אינה מוסרת בעקבות הרשמה מחדש מאוחרת יותר (רק שינוי אמיתי של כתובת האימייל או הסרה ידנית של החסימה משחזרים אותה) - כך נשמר מוניטין השולח שלכם.
  • מוגבל לסביבת העבודה. החסימה משויכת לסביבת העבודה ששלחה לכתובת. ביטול הרשמה בסביבת עבודה אחת אינו חוסם את הכתובת בסביבת עבודה אחרת באותו חשבון.
  • עקיפה טרנזקציונית. שליחה המוגדרת להגיע לכל אנשי הקשר (העדפת all / טרנזקציונית) עדיין עוקפת ביטולי הרשמה מסוג הסכמה, אך כתובת שהוחזרה בהחזרה קשה לעולם לא תקבל דיוור - אין טעם לשלוח לתיבת דואר מתה.

גם שליחות קמפיין וגם שליחות מסע בודקות זאת בזמן השליחה, כך שאיש קשר כפול שנוצר אחרי ביטול ההרשמה עדיין מושתק.


כותרת List-Unsubscribe (RFC 8058)

סקירה

RFC 8058 מגדיר דרך תקנית שבה לקוחות אימייל יכולים לספק ביטול הרשמה בלחיצה אחת. Joryio מוסיפה את הכותרות האלה אוטומטית לאימיילים יוצאים.

כותרות שנוספות

List-Unsubscribe: <https://api-eu1.joryio.com/u/{token}>
List-Unsubscribe-Post: List-Unsubscribe=One-Click

תצורה

להפעיל בהגדרות סביבת העבודה:

subscriptionSettings: {
listUnsubscribe: {
enabled: true,
includeMailto: true, // Include mailto: link (recommended for Gmail)
scope: 'global' // 'global' or 'list'
}
}

אפשרויות טווח

טווחהתנהגות
globalביטול הרשמה בלחיצה אחת מסיר את המשתמש מכל תקשורת האימייל
listמבטל הרשמה רק מהרשימה הספציפית שממנה נשלח האימייל

פקד ברמת הקמפיין

בקמפיין אימייל, שלב חיבור ההודעה (Compose) כולל פקד ביטול הרשמה יחיד ששולט גם בנוכחות קישור/כותרת ביטול ההרשמה בלחיצה אחת וגם ממה הוא מסיר את הנמענים:

  • ביטול הרשמה גלובלי (ברירת מחדל) - הכותרת נכללת, וביטול הרשמה מסיר את הנמען מכל האימיילים (ביטול הרשמה בכלל סביבת העבודה). זו הבחירה הרגילה לאימייל שיווקי.
  • ביטול הרשמה מ: <נושא> (מוצג רק כשלסביבת העבודה יש רשימות מנויים) - הכותרת נכללת, וביטול הרשמה מסיר את הנמען מהנושא הזה בלבד, מבלי לפגוע בנושאים האחרים שלו. בחירת נושא גם גורמת לשליחה לדלג על מי שכבר ביטל את הרשמתו ממנו.
  • ללא ביטול הרשמה - טרנזקציוני בלבד - מדכא לחלוטין את כותרת List-Unsubscribe בשליחה הזו (קבלות, איפוס סיסמה, קודים חד-פעמיים), שפטורים מדרישות ביטול הרשמה.

מיקוד לעומת היקף ביטול ההרשמה. הפקד הזה נוגע רק לקישור/כותרת ביטול ההרשמה. הוא אינו מסנן נמענים. כדי לשלוח רק למנויי נושא מסוים, הוסיפו סינון 'חבר ברשימה' בשלב הקהל - הסינון כבר מחריג כל מי שביטל את הרשמתו לרשימה ומחושב בזמן השליחה.

ל-SMS / WhatsApp אין כותרת RFC 8058, ולכן שלב ה-Compose שלהם מציג במקום זאת פקד נושא ביטול הרשמה (גלובלי לעומת נושא מסוים) עם אותה משמעות של היקף; אין אפשרות "ללא ביטול הרשמה" מכיוון שביטול הרשמה באמצעות 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).


דף העדפות (עיצוב מותאם אישית)

כברירת מחדל, נמענים שלוחצים על קישור לביטול הרשמה או לניהול העדפות רואים את מרכז ההעדפות המובנה של Joryio. תוכלו להחליף אותו בדף ממותג משלכם.

היכן: Settings → Subscriptions → Preference page.

העמוד הוא לכל סביבת עבודה ויש לו שלושה מצבים:

  • Built-in default - מרכז ההעדפות הרגיל של Joryio (מתגים לערוצים ולרשימות). פועל תמיד ואינו דורש הגדרה.
  • Custom HTML - עורך HTML/Liquid מלא עם תצוגה מקדימה חיה שמוצגת באמצעות נתונים לדוגמה. מתואר בהמשך.
  • Redirect to URL - מדלג לחלוטין על הדף שלנו ושולח את הנמען לדף שלכם. בקישור ביטול ההרשמה אנחנו רושמים תחילה את ביטול ההרשמה, ואז מפנים לכתובת שלכם עם ?email=…&status=unsubscribed מצורף; הקישור לניהול העדפות מפנה עם ?token=…, שבו הדף שלכם יכול להשתמש כדי לקרוא ולכתוב העדפות דרך ה־API הציבורי. התאימות נשמרת בשני המקרים.

איך זה עובד

  • אתם כותבים את גוף הדף ב־HTML. אפשר להשתמש בו ב־Liquid: התאמה אישית ({{ firstName }}, {{ email }}), רכיבי תוכן ({{ blocks.<slug> }}) ותגיות כתובות ההרשמה שלהלן.
  • הציבו את התגית {{ preferences_form }} במקום שבו צריכים להופיע פקדי ההרשמה הפעילים (מתגים לערוצים ולרשימות, Save, Unsubscribe from all) - Joryio תעבד את הטופס הפעיל במקום הזה.
  • אם תשמיטו את התגית, הפקדים יצורפו אוטומטית בסוף, כך שהנמען תמיד יוכל לבטל הרשמה (העורך מזהיר אתכם כשהתגית חסרה).
  • הדף מעובד בצד השרת עבור כל נמען (כך שכתובות ביטול ההרשמה וההתאמה האישית אמיתיות), ולאחר מכן עובר ניקוי לפני שהוא מגיע לדפדפן: הפריסה, התמונות, הסגנונות המוטבעים ורכיב <style> בעל היקף מוגבל נשמרים; סקריפטים, מטפלי אירועים, מסגרות iframe, רכיבי <form> ו־CSS שמסוגל להריץ סקריפטים מוסרים.

תגיות זמינות

תגיתתיאור
{{ preferences_form }}פקדי ההרשמה הפעילים (הציבו פעם אחת)
{{ unsubscribe_url }}ביטול הרשמה גלובלי
{{ preferences_url }}קישור חזרה לעמוד זה
{{ resubscribe_url }}קישור להרשמה מחדש
{{ firstName }} / {{ email }}התאמה אישית של הנמען
{{ blocks.<slug> }}רכיב תוכן לשימוש חוזר

הערות

  • מבנה עמוד מלא (<html>/<head>/<body>) מתקבל; העמוד הוא מסך עצמאי, ולכן תוכן הגוף והסגנונות שלו הם מה שמוצג.
  • אותו דף משמש גם לקישור ביטול ההרשמה בלחיצה אחת (/u/:token) וגם לקישור ניהול ההעדפות (/preferences/:token).
  • דף ברירת המחדל המובנה מציע גם "reason for unsubscribing" אופציונלי (נרשם ביומן הביקורת ובאירוע message.unsubscribed) ופעולה "Re-subscribe to all"; הכתובת {{ resubscribe_url }} (שמוסיפה ?action=resubscribe) מבצעת הרשמה מחדש עם פתיחתה.

טיפול בהחזרות

סוגי החזרות

סוגתיאורפעולה
החזרה רכהכשל זמני במסירה (תיבה מלאה, שרת לא זמין)נספרת בתוך חלון זמן; הופכת להחזרה קשה לאחר יותר מדי כשלים
החזרה קשהכשל קבוע במסירה (כתובת לא תקינה, דומיין לא קיים)סימון האימייל כלא תקין (מושתק משליחה)

החזרה קשה מסמנת את הכתובת כלא תקינה ומפסיקה לשלוח אליה, אך היא אינה מבטלת את הרשמת איש הקשר - הוא מעולם לא ביקש לבטל הרשמה, ולכן ההסכמה שלו נשארת ללא שינוי (ניקוי ההחזרה, למשל לאחר שינוי כתובת האימייל, מאפשר לשלוח אליו שוב). החסימה חלה לפי כתובת האימייל על כל אנשי הקשר הכפולים בסביבת העבודה (ראו ביטולי הרשמה באימייל חלים לפי הכתובת), ולכן גם איש קשר נוסף בעל אותה תיבת דואר שאינה פעילה לא יקבל דיוור. המערכת סובלת החזרה רכה עד 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: Webhooks של אירועים
  • Mailgun: Webhooks

הודעות Webhook של החזרות ואירועים מוגדרות עם ספק האימייל שלכם במהלך הקליטה - לאחר מכן האירועים זורמים פנימה באופן אוטומטי.

ניקוי החזרות ידני

מנהלים יכולים לנקות מצב החזרה דרך הממשק או ה־API:

await subscriptionsApi.clearBounceStatus(userId, 'Email confirmed valid by user');

משתני תבניות Liquid

משתנים זמינים

ניתן להשתמש בהם בתבניות האימייל:

משתנהתיאור
{{ unsubscribe_url }}URL גלובלי לביטול הרשמה
{{ unsubscribe_url_list }}URL לביטול הרשמה ספציפי לרשימה
{{ category_unsubscribe_url }}ביטול הרשמה מרשימת ההרשמה של האימייל (כינוי ל-URL הרשימה; חוזר לגלובלי כברירת מחדל)
{{ preferences_url }}URL למרכז ההעדפות
{{ resubscribe_url }}URL להרשמה מחדש (לקמפיינים של win-back)

דוגמת שימוש

<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
}

מסנן סטטוס החזרה

התמקדו במשתמשים לפי תקינות כתובת האימייל:

{
type: 'bounce_status',
operator: 'email_valid' // 'email_valid', 'email_bounced',
// 'email_hard_bounced', 'email_soft_bounced'
}

מקרי שימוש

  1. שליחה רק למשתמשים שעשו opt-in:

    { type: 'channel_subscription', operator: 'subscribed_to_channel',
    channel: 'email', subscriptionStatus: 'opted_in' }
  2. החרגת אימיילים שחזרו:

    { type: 'bounce_status', operator: 'email_valid' }
  3. התמקדות במנויי הניוזלטר:

    { type: 'list_membership', operator: 'member_of_list',
    listId: 'newsletter-list-id' }

הפניית API

ההפניה המלאה ל־REST API לניהול הסכמה לערוצים, רשימות הרשמה וחברות ברשימות - כולל כל נקודת קצה, דוגמאות לבקשה ולתגובה וההרשאות הנדרשות - נמצאת בדף Subscriptions API.

שני דברים שכדאי לדעת לפני שקוראים ל-API:

  • אפשר להירשם כבר בזמן היצירה. POST /users מקבל מערך subscriptions אופציונלי שמוחל באותה קריאה - ראו Users API. הרשמות בזמן היצירה לעולם אינן מבטלות opt-out קיים; רישום מחדש של איש קשר שביטל את ההרשמה עדיין מחייב את נקודת הקצה הייעודית להרשמה שמתוארת בהמשך.
  • :userId בנתיבים האלה הוא ה־id הפנימי של איש הקשר ב־Joryio (כפי שמוחזר מ־Users API), ולא מזהה המשתמש החיצוני שלכם.

הרשמה טיפוסית - צירוף איש קשר לרשימה בערוץ האימייל:

curl -X POST https://api-eu1.joryio.com/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)
POST /u/:token

// Get preferences
GET /preferences/:token

// Save preferences
POST /preferences/:token
Body: { channels: [...], lists: [...] }

נקודות קצה ל-SDK (אימות באמצעות SDK Key)

נקודות קצה אלו משמשות את ה-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
}

תצורה

הגדרות סביבת עבודה

הגדירו את הגדרות ההרשמה תחת Settings → Subscriptions:

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
}

תאימות

רשת ביטחון לכותרת תחתונה של ביטול הרשמה

כדי שאימייל שיווקי לעולם לא יישלח בלי אפשרות לבטל הרשמה:

  • רכיב כותרת תחתונה לתאימות - רכיב התוכן compliance_footer (שנוצר אוטומטית עם ברירת מחדל סבירה בפעם הראשונה שמפעילים הוספה אוטומטית) מכיל את הכתובת שלכם וקישורים לביטול הרשמה ולניהול העדפות. תוכלו להפנות אליו בכל מקום באמצעות {{ blocks.compliance_footer }}, או לערוך אותו תחת Content Blocks.
  • מתג הוספה אוטומטית - Settings → Subscriptions → "Auto-append an unsubscribe footer when missing". כשהוא מופעל, תהליך שליחת האימייל מוסיף את הכותרת התחתונה לכל אימייל שיווקי (אימייל שנושא כותרת List-Unsubscribe) שאין בגופו קישור לביטול הרשמה או לניהול העדפות. הכשל פתוח: המנגנון לעולם אינו חוסם שליחה.
  • אזהרה בעורך - עורך האימייל בקמפיין מציג אזהרה כאשר אין בגוף האימייל קישור לביטול הרשמה, כדי שתבחינו בכך לפני השליחה (הגנה גלויה, לא חסימה קשיחה). האזהרה מציעה שני קיצורי דרך בתוך השורה - Add a link (פותח את העורך כדי להוסיף קישור) ו־enable auto-append footer (עובר לדף Subscriptions הזה) - ואפשר לסגור אותה למשך הסשן. כשהוספה אוטומטית כבר מופעלת, האזהרה הופכת להודעת מידע מתונה יותר, משום שהכותרת התחתונה תתווסף עבורכם.

אפשר לבחור רשימות הרשמה גם בצומתי SMS, WhatsApp ו־Viber במסע (ולא רק באימייל), כך ששער השליחה של כל צומת מדלג על אנשי קשר שביטלו את הרשמתם לרשימה באותו ערוץ.

GDPR (אירופה)

  • להשתמש ב-double opt-in עבור משתמשי האיחוד האירופי
  • לשמור טקסט הסכמה וחותמת זמן
  • לספק גישה נוחה למרכז ההעדפות
  • לכבד בקשות ביטול הרשמה מיד
  • לשמור יומן ביקורת של כל שינויי ההרשמה

CAN-SPAM (ארצות הברית)

  • לכלול כתובת דואר פיזית באימיילים
  • לכבד בקשות ביטול הרשמה תוך 10 ימי עסקים (Joryio עושה זאת מיד)
  • זיהוי ברור של אימיילים מסחריים
  • לא להשתמש בכותרות נושא מטעות

TCPA (ארצות הברית - SMS)

  • לקבל הסכמה כתובה מפורשת לפני שליחת SMS
  • לכבד מילות STOP מיד
  • לספק הוראות opt-out בהודעות
  • Joryio מטפלת אוטומטית ב: STOP, STOPALL, UNSUBSCRIBE, CANCEL, END, QUIT, REVOKE, OPTOUT (הבסיס האנגלי הקבוע), בנוסף לברירות מחדל מתורגמות (למשל הסר בעברית) ולכל מילת מפתח מותאמת שתוסיפו

טיפול במילות מפתח ב-SMS וב-WhatsApp

Joryio מעבדת באופן אוטומטי מילות מפתח נכנסות ומתאימה אותן בלי תלות ברישיות ובסבילות להבדלי פיסוק (Stop, STOP!, " stop " נחשבות כולן). STOPALL היא מילת ה־opt-out המובנית היחידה שחלה על הערוץ כולו (בנוסף למילות opt-out מותאמות שתגדירו כחָלות על הערוץ כולו); כל מילת opt-out אחרת מוגבלת לקבוצת ההרשמה לפי מספר או לפי WABA שאליה הגיעה ההודעה, ו־START רושמת מחדש את הקבוצה של אותו מספר או WABA. לרשימה המלאה - הבסיס באנגלית (כולל REVOKE ו־OPTOUT), ברירות המחדל המקומיות והתוספות המותאמות שלכם - ולכלל ההרשמה מחדש, ראו מילות מפתח למעלה.

SMS

מילת מפתחפעולה
STOP, UNSUBSCRIBE, CANCEL, END, QUIT, REVOKE, OPTOUTביטול הרשמה לקבוצה של המספר המקבל
STOPALLביטול הרשמה בכל הערוץ (כל המספרים)
START, YES, UNSTOP, SUBSCRIBE, OPTINהרשמה מחדש לקבוצה של המספר המקבל
HELP, INFOשליחת הודעת עזרה
ברירות מחדל מתורגמות (למשל הסר, PARE, ARRET) + תוספות מותאמותכמו הקטגוריה שלהן לעיל

WhatsApp

מילת מפתחפעולה
STOP, UNSUBSCRIBE, CANCEL, END, QUIT, OPTOUT, OPT-OUTביטול הרשמה לקבוצה של ה-WABA המקבל
STOPALLביטול הרשמה בכל הערוץ (כל חשבונות ה־WABA)
START, UNSTOP, SUBSCRIBE, YES, OPTIN, OPT-INהרשמה מחדש לקבוצה של ה-WABA המקבל

הודעות Webhook נכנסות מאומתות באמצעות חתימה - הודעות STOP או START מזויפות נדחות, וספקים שאינם תומכים באימות חתימה להודעות נכנסות אינם מתקבלים לעיבוד מילות מפתח נכנסות. אם אי אפשר לזהות את הקבוצה לפי מספר או לפי WABA, ביטול ההרשמה חל כברירת מחדל בטוחה על הערוץ כולו.

ה־Webhook הנכנס ל־SMS מוגדר עבור המספרים שלכם במהלך הקליטה - מילות המפתח מעובדות אוטומטית.


שיטות עבודה מומלצות

  1. השתמשו תמיד בכותרות List-Unsubscribe - משפר את יכולת המסירה ומאפשר ל־Gmail להציג כפתור לביטול הרשמה

  2. הטמיעו double opt-in לשיווק - משפר את איכות הרשימה ואת התאימות

  3. נטרו את שיעורי ההחזרה - שיעורי החזרה גבוהים פוגעים במוניטין השולח

  4. פלחו לפי מצב ההרשמה - שלחו רק למשתמשים שביצעו opt-in

  5. הקלו על ביטול ההרשמה - לחיצה אחת, ללא צורך בהתחברות

  6. שמרו יומני ביקורת - נדרשים לתאימות ומועילים ביישוב מחלוקות

  7. בדקו את מרכז ההעדפות - ודאו שמשתמשים יכולים לנהל את העדפותיהם בקלות

  8. השתמשו בביטול הרשמה לפי רשימה - מאפשר למשתמשים להישאר רשומים לחלק מהתוכן


פתרון תקלות

בעיות נפוצות

אימיילים לא נשלחים

  • בדקו אם למשתמש יש מצב unsubscribed בערוץ האימייל
  • בדקו אם כתובת האימייל מסומנת כלא תקינה עקב החזרות
  • אמתו את מצב ההחזרה בפרופיל המשתמש

ביטול הרשמה לא עובד

  • בדקו אם פג תוקף הטוקן (ברירת המחדל היא 90 יום)
  • ודאו שחתימת הטוקן תקינה
  • בדקו אם יש שגיאות ביומן הביקורת

החזרות לא מטופלות

  • ודאו שכתובת ה־Webhook מוגדרת כראוי אצל ספק האימייל
  • בדקו את האימות של ה־Webhook
  • עיינו ביומני השגיאות

ניפוי באגים

בדיקת סטטוס הרשמה:

# API call
curl -X GET "https://api-eu1.joryio.com/subscriptions/contacts/{userId}" \
-H "Authorization: Bearer {token}"

צפייה ביומן הביקורת:

curl -X GET "https://api-eu1.joryio.com/subscriptions/contacts/{userId}/history" \
-H "Authorization: Bearer {token}"