חדר כושר: מנוי, הקפאה, ביטול וגבייה באותו מצב לקוח
חזרה לבלוג
automation·6 בספטמבר 2026·5 דק' קריאה·מאת יהונתן סעדיה

חדר כושר: מנוי, הקפאה, ביטול וגבייה באותו מצב לקוח

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

עיקרי הדברים

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

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

חמישה מצבים, ומה כל אחד עושה לשלוש מערכות

מצב אחד צריך לענות בו-זמנית לשלוש שאלות: האם לחייב, האם לפתוח את הדלת, ומה המנוי רואה באפליקציה.

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

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

המעברים, ומה כל מעבר עושה לחיוב הבא

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

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

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

למה מנוי מוקפא ממשיך להתחייב?

כמעט תמיד בגלל אחת משתי סיבות, ושתיהן ניתנות לזיהוי מיידי.

הראשונה: הרצת הגבייה קראה את המצב ברגע שהיא התחילה לרוץ, ולא את המצב שתקף בתאריך החיוב. אם ההקפאה נרשמה ב-28 בחודש והתחילה ב-1, והרצה יצאה ב-31, מצב "פעיל" הוא מה שהרצה ראתה. התיקון אינו בתזמון אלא בשאילתה: המצב שנשאל הוא המצב בתאריך החיוב.

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

תיארוך אפקטיבי: מצב הוא טווח, לא ערך

השורה שמחזיקה את המצב צריכה להיראות כך:

  • membership_id - המנוי, לא הלקוח. ללקוח יכולים להיות שני מנויים לאורך זמן.
  • state - אחד מחמשת הערכים, מרשימה סגורה.
  • valid_from ו-valid_to - טווח התוקף. valid_to ריק פירושו המצב הנוכחי.
  • requested_by ו-approved_by - מי ביקש ומי אישר. לפעמים אותו אדם, ואז שני השדות מלאים באותו ערך.
  • reason - סיבה מרשימה, לא טקסט חופשי.
  • document_ref - הפניה לבקשה שהתקבלה, אם הייתה כזו.

השאלה "מה המצב ב-1 באוקטובר" הופכת לשאילתה על טווח ולא לניחוש. הצד השני של המטבע הוא שאסור לעדכן שורה קיימת: שינוי הוא סגירת הטווח הקודם ופתיחת חדש. מודלים מסחריים בונים את זה כך במפורש, וניתן לראות איך זה נראה במערכת חיצונית ב-Stripe Billing subscriptions.

האם פיגור הוא מצב או דגל?

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

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

הגישה בדלת היא החלטה נפרדת שנשענת על המצב ועל היתרה:

  1. חסימה מיידית - נדירה, ובדרך כלל מיותרת ליום אחד של איחור.
  2. חסימה אחרי סף ימים - הסף הוא הגדרה במערכת, לא כלל בקוד.
  3. התראה בקבלה בלי חסימה - הכניסה נפתחת, ומופיעה הודעה לפקיד.

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

התאמה יומית בין הדלת לספר החיובים

בסוף כל יום שווה להריץ בדיקה קצרה שמחפשת רק סתירות:

  • מנויים במצב מוקפא שנרשמה להם כניסה.
  • מנויים במצב מבוטל שנוצר להם חיוב.
  • חיובים שנוצרו לתאריך שבו המצב לא היה פעיל.
  • מנויים בפיגור מעל הסף שהכניסה שלהם נפתחה.
  • מנויים פעילים בלי אמצעי גבייה תקף.

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

מה נשבר בפועל

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

מקורות

#state machine#memberships#billing#Masav#automation#אוטומציה לעסקים

שאלות נפוצות

כמה מצבים באמת נדרשים למועדון קטן?

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

איפה שומרים את מצב המנוי, במערכת הגבייה או במערכת הכניסה?

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

מה עושים כשמנוי מבקש להקפיא באמצע חודש שכבר חויב?

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

האם נכון לחסום כניסה אוטומטית בפיגור?

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

להמשך קריאה

שירות רלוונטי

אוטומציה לעסקים

אני בונה אוטומציות מותאמות שמורידות עבודה חוזרת מקצה לקצה.

מידע נוסף →←

על הכותב

יהונתן סעדיה

מפתח פרילנסר לאוטומציה, אתרים ו-MVP

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

בוא נעבוד יחד

יש לך פרויקט דומה?

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