מה אנחנו שולחים החוצה.
אפיון בר-בנייה לפטיה. מוצר לזוג גרושים בלבד. פיילוט ראשון ב-iOS דרך TestFlight, קוד דו-פלטפורמי מהיום הראשון. המטרה: גרסה עובדת שאפשר להחזיק בכף היד תוך ימים.
01תקציר ושינוי גבולות
פטיה היא מערכת הפעלה רגועה להורים גרושים. ה-MVP הופך את הוואטסאפ שסביב הילדים ליחידות עבודה מובנות — לכל הוצאה, סעיף בלו״ז והחלטה יש אחראי, סטטוס ודדליין.
המוצר מיועד לזוג הגרוש בלבד. אין תפקיד מגשר, אין גישת עו״ד/מתאם, אין סיכומים משותפים בתוך האפליקציה. המגשרים נשארים ערוץ ההפצה — הם ממליצים על פטיה ללקוחות שלהם — אבל הם לא משתמשים.
בתוך MVP / לא בתוך MVP
בתוך MVP פיילוט
- אימות במייל OTP (עברית + אנגלית) — פיילוט. אימות בטלפון מתווסף ב-Phase 1.5.
- יצירת משפחה · הזמנת הורה שני
- CRUD ילדים (שדות מינימליים)
- מודול הוצאות — מכונת מצבים מלאה
- העלאת קבלות (Supabase Storage)
- דאשבורד — 4 מצבי-העל
- יתרה רצה (מי חייב למי)
- התראות פוש (טריגרים בסיסיים)
- החלפת עברית / אנגלית בתוך האפליקציה
לא בתוך MVP פיילוט (דחוי)
- יומן משותף והחלפות שהות
- תהליך החלטות הוריות
- מודול מחלוקות
- ספריית מסמכים (רק קבלות ב-MVP)
- הודעות מובנות / רגועות
- ניסוח מחדש ב-AI
- תשלומים בתוך האפליקציה
- דוחות / ייצוא מעבר ל-CSV בסיסי
- תפקיד מקצוען / מגשר כלשהו
02סטאק וארכיטקטורה
קוד-בייס אחד ב-TypeScript. אפליקציות נייטיב אמיתיות דרך Expo. בקאנד מנוהל ב-Supabase. דו-פלטפורמי מהשורה הראשונה; את צינור הבנייה של iOS בלבד נריץ לפיילוט הראשון.
| שכבה | בחירה | למה |
|---|---|---|
| ריצה | Expo (managed) · React Native · TypeScript | קוד-בייס אחד, נייטיב אמיתי ל-iOS ול-Android, EAS Build / Submit / Update פותר את החלקים הקשים. |
| ניווט | expo-router | ניווט מבוסס קבצים תואם להיררכיית המסכים. |
| אימות + DB + אחסון + Realtime | Supabase | Postgres תואם למודל היחסי שלנו; OTP במייל לפיילוט (בלי תלות ב-Twilio), RLS לבידוד משפחה, Realtime לדאשבורד, Storage לקבלות. |
| מטמון שרת בלקוח | @tanstack/react-query | סטנדרט, עובד נכון עם פסילת cache מ-Realtime. |
| UI state | zustand (light) | סטייט קל ברמת אפליקציה (שפה, משפחה נוכחית). בלי Redux. |
| טפסים ואימות | react-hook-form + zod | סכמות type-safe משותפות בין הלקוח ל-Edge Functions. |
| i18n | i18next + expo-localization | דו-לשוני מהיום הראשון. נגזר מ-locale המכשיר — עברית כברירת מחדל בישראל. |
| התראות | expo-notifications → APNs / FCM | Expo מנהל את מחזור החיים של ה-cert/token. |
| קבצים | expo-image-picker + Supabase Storage | מצלמה / גלריה → העלאה חתומה ל-Supabase. |
| תאריכים וכסף | date-fns (he locale) + minor-unit ints | סכומים נשמרים כשלמים ביחידות מינוריות (אגורות) כדי למנוע באגי float. |
| בנייה ושילוח | EAS Build · EAS Submit · TestFlight | פקודה אחת מהקוד לטלפון של הבודק. |
| מקור ו-CI | GitHub (Nirkoso/patia) · GitHub Actions later | תחילה ריפו, CI כשיש בדיקות ששוות שער. |
מה במכוון לא בסטאק
- Redux, MobX (יותר מדי — TanStack Query + zustand מספיקים).
- Firebase (נתונים יחסיים, RLS וג׳וינים מתאימים יותר ל-Postgres).
- בקאנד מותאם / שרת Node (Edge Functions של Supabase מטפלים בצרכי השרת הספורים).
- מודולים נייטיב מחוץ ל-Expo prebuild (יאט את זרימת EAS).
- OneSignal / ספק פוש חיצוני (expo-notifications מספיק).
03מודל הנתונים ובידוד משפחה
הכל מתויג למשפחה. מדיניות Row-Level Security של Postgres אוכפת זאת ברמת השרת — אי-אפשר לשכוח שכבת הגנה בלקוח. משתמש רואה רק שורות ש-family_id שלהן שייך למשפחות שהוא חבר בהן.
טבלאות (MVP פיילוט)
users id (uuid, = auth.users.id) · phone · display_name · preferred_lang · created_at · last_seen_at
families id · display_name · default_split_jsonb · timezone · currency · created_by · created_at
family_members family_id · user_id · role ('parent_a'|'parent_b') · joined_at · (PK: family_id, user_id)
invites id · family_id · phone · code · invited_by · expires_at · used_at
children id · family_id · display_name · birthdate · framework · notes · created_at
expenses id · family_id · title · category · child_ids[] · amount_minor · currency
· paid_by_user_id · requested_from_user_id
· split_type ('equal'|'percent'|'fixed') · share_paid_by_minor · share_other_minor
· due_date · status · receipt_path · created_by · created_at · updated_at
expense_events id · expense_id · actor_user_id · action · comment · created_at
notifications id · user_id · type · entity_table · entity_id · body_he · body_en · read_at · created_at
תמיד שומרים סכומים כשלמים ביחידות מינוריות (אגורות). amount_minor = 42000 → ₪420.00. בלי floats בסכמה.
מכונת מצבים — הוצאה
| מצב | מי יכול לפעול | עובר ל |
|---|---|---|
| טיוטה | יוצר/ת | ממתין_לאישור |
| ממתין_לאישור | ההורה השני | אושר נדחה הבהרה |
| הבהרה | כל אחד | ממתין_לאישור נדחה |
| אושר | המשלם/ת | שולם |
| נדחה | יוצר/ת | ממתין_לאישור נסגר_ללא_הסכמה |
| שולם | כל אחד (לפתיחה) | במחלוקת |
כל מעבר רושם שורה ב-expense_events עם הפועל והערה. 4 מצבי-העל של הדאשבורד נגזרים: פתוח / ממתין_לך / ממתין_לצד / נסגר.
מדיניות RLS (Postgres)
-- helper: families the auth user belongs to
create function patia.my_family_ids() returns setof uuid
language sql security definer stable as $$
select family_id from family_members where user_id = auth.uid();
$$;
-- every table follows this shape
alter table expenses enable row level security;
create policy "read own family" on expenses
for select using (family_id in (select patia.my_family_ids()));
create policy "write own family" on expenses
for insert with check (family_id in (select patia.my_family_ids()));
create policy "update own family" on expenses
for update using (family_id in (select patia.my_family_ids()))
with check (family_id in (select patia.my_family_ids()));
create policy "delete own family (creator only)" on expenses
for delete using (family_id in (select patia.my_family_ids())
and created_by = auth.uid());
בידוד משפחה זוכה לסבב בדיקה משלו: ננסה לקרוא שורות של כל משפחה אחרת עם משתמשים מזויפים; הציפייה: 0 תוצאות. זה המקום היחיד שבו באג שווה דליפת פרטיות.
04מודולי MVP פיילוט
המוצר הקטן ביותר שמוכיח את רעיון יחידת-העבודה. חמישה מודולים, מקצה לקצה.
אימות — OTP במייל (פיילוט שלב 1)
מסכים
- פתיחה — CTA יחיד "להתחיל ברוגע"
- הזנת מייל (אימות, lowercase בשליחה)
- הזנת OTP (קוד 6 ספרות מהמייל, שליחה מחדש אחרי 30 שנ׳)
- שם תצוגה + שפה מועדפת (מסך אחד)
הערות
- Supabase Auth Email מטפל ב-OTP דרך ה-mailer המובנה. בלי Twilio בפיילוט — ראו Section 02 הערת "Option B".
- סשן נשמר; ביומטריה ל-V2.
- Phase 1.5 (לפני פרודקשן App Store): הוספת OTP בטלפון דרך Twilio כאופציית כניסה שנייה לצד מייל.
משפחה — יצירה והזמנת ההורה השני
לפיילוט של 10 משפחות ב-TestFlight, הזמנת ההורה השני היא ידנית: הורה א׳ מזין את המייל של הורה ב׳, האפליקציה יוצרת רשומת הזמנה ומציגה להורה א׳ קישור משתף, שהוא מעביר איך שמתאים (וואטסאפ, מייל, פגישה). ניר מבצע onboarding אישי לכל משפחה בפיילוט. שליחה אוטומטית (SMS דרך Twilio, או מייל טרנזקציוני דרך Resend) חוזרת ב-Phase 1.5, לקראת פרודקשן ב-App Store — שם הזרימה לקולד-סטארט הופכת ל-UX השברירי ביותר. בפיילוט, הסעיף הזה במכוון פשוט יותר.
צעד 1 · המזמין/ה מקים
- יצירת משפחה (שם, מטבע=ILS, אזור=Asia/Jerusalem, חלוקה 50/50).
- להוסיף לפחות ילד אחד קודם.
- הזנת מייל ההורה השני. אישור שם תצוגה.
- האפליקציה יוצרת רשומת invites (קוד 6 תווים) ומציגה למזמין מסך שיתוף הקישור.
צעד 2 · מסך שיתוף הקישור
"קישור ההזמנה מוכן: https://patia.koso.one/i/?c=AB12CD. שלחו למאיה איך שנוח — וואטסאפ, מייל, פגישה. תפתח אותו, תתקין דרך TestFlight אם צריך, ותצטרף אוטומטית למשפחה."
- כפתור העתקה + כפתור שיתוף דרך גיליון השיתוף של iOS. המזמין בוחר ערוץ.
- אין שליחה אוטומטית בצד האפליקציה. Phase 1.5 יוסיף שליחה אוטומטית.
צעד 3 · עמוד הנחיתה (וובי, לפני הרשמה)
- כותרת: "מאיה הזמינה אותך לתאם סביב דניאל ויונתן." שם המזמין/ה + שמות הילדים תמיד מוצגים.
- כרטיס תצוגה מקדימה של מה שממתין (לדוגמה: "הוצאה · ₪420 · דניאל · כדורסל"). אין צורך להתחבר כדי לראות.
- "למה קיבלתי את זה?" פותח הסבר של 30 מילים בעברית פשוטה.
- CTA: "פותח את פטיה" → קישור עמוק patia://invite/CODE שמפנה לאפליקציה (או לקישור התקנת TestFlight, לפיילוט).
- בלי "הרשמה במייל", בלי שיווק, בלי CTA נוסף. העמוד עושה דבר אחד.
צעד 4 · מעקב בפיילוט (ידני)
- אין תזכורות אוטומטיות ב-Phase 1. ניר פונה אישית בוואטסאפ להורי ב׳ שמתעכבים.
- אחרי 7 ימים הקוד פג. המזמין יכול לבקש קוד חדש (קישור שיתוף חדש).
- Phase 1.5 מחזיר תזכורות אוטומטיות ב-24/72 שעות (SMS או מייל) — נשמרות בתוכנית כ-"Task E6" דחוי.
סטטוסים
- הזמנה_נשלחה · שניהם_הצטרפו · הזמנה_פגה (7 ימים)
מדד יחיד שמגדר את כל המוצר
- שיעור הזמנה → הצטרפות ≥ 60% תוך 7 ימים (פיילוט). יעד 72 שעות תקף ל-Phase 1.5 (כשהשליחה אוטומטית). בפיילוט הקצב תלוי בקצב הפנייה של ניר ושל הורה א׳.
קצוות
- משתמש שנרשם בלי הזמנה → מצב לבד. אפשר לפעול; ההורה השני יראה כשיצטרף.
- להורה השני יש כבר חשבון פטיה ממשפחה קודמת → בעת ההצטרפות נשאל איזו משפחה נוכחית (בורר משפחה, הליטוש לדחות).
- מייל שגוי → הורה א׳ פשוט מזין מחדש ויוצר הזמנה חדשה (קודים זולים).
ילדים — CRUD מינימלי
מסכים
- רשימת ילדים · הוספה · עריכה · ארכוב (בלי מחיקה קשיחה)
שדות (MVP)
- שם, תאריך לידה, מסגרת (טקסט חופשי — שם גן/בית-ספר)
הערות
- קופות חולים, רופאים, חוגים, רגישויות → השלמת MVP, לא פיילוט.
- ארכוב במקום מחיקה כדי לשמור על קשרי הוצאות היסטוריים.
הוצאות — יחידת העבודה
מסכים
- רשימה (סינון לפי מצב-על, ילד, קטגוריה)
- פירוט — כותרת, סכום, חלוקה, קבלה, היסטוריית אירועים, סרגל פעולות
- הוצאה חדשה (מסך אחד, מחולק לחלקים)
- צופה קבלה (מסך מלא)
שדות
- כותרת, ילד/ים, קטגוריה (enum), סכום, מטבע=ILS
- חלוקה (equal ברירת מחדל · percent · fixed), חלקים נגזרים
- מי שילם, ממי דורשים, דדליין
- קבלה (תמונה אחת; מרובות בהשלמת MVP)
- הערה אופציונלית (240 תווים, רמז לשפה רגועה)
פעולות פר מצב
- טיוטה → שליחה לאישור / זריקה
- ממתין_לאישור → (ההורה השני) מאשר · דוחה (סיבה חובה) · מבקש הבהרה (טקסט)
- אושר → (משלם) סימון כשולם (תאריך · תמונת אסמכתא אופציונלית)
- שולם → פתיחה מחדש כמחלוקת (נדיר)
ווידג׳ט יתרה
- סיכום אושר-לא-שולם - שולם_על_ידי_השני → מי חייב למי, חודשי ומצטבר.
הוצאות + דאשבורד הם ההוכחה הקטנה ביותר למכניזם יחידת-העבודה. כל השאר יכול לחכות מחזור אחד בלי לפגוע בהדגמה.
דאשבורד — מה דורש אותך עכשיו
סקציות
- טאבים: ממתין לך · ממתין לצד · נסגר
- פעולה מהירה: + הוצאה חדשה (FAB)
- כרטיס יתרה: מי חייב למי (החודש + מצטבר)
- לוג פעילות (10 אירועים אחרונים)
התנהגות
- משיכה לרענון + מנוי Realtime ל-expense_events.
- מצבי ריק בשפה רגועה ופשוטה לפי קול המותג.
הגדרות — מינימליות אבל אמיתיות
כולל
- שם תצוגה, שפה, חלוקה ברירת מחדל, יציאה
- מצב הרשאת פוש + איך להפעיל
- פרטיות ותנאים (אינטרנט)
- גרסה + "שלח משוב" (mailto)
לא כלול (דחוי)
- מחיקת חשבון (דרישת Apple לפרודקשן — מוסיפים לפני סקירת פרודקשן).
- העדפות התראה (מתג גלובלי אחד ב-MVP).
05מפת דרכים שלבית — מתוכננת, לא מותנית
MVP פיילוט הוא ההתחלה של בנייה שלבית, לא הימור חד-פעמי. השלבים למטה מחויבים במפת הדרכים; מה שמותנה הוא הקצב, הנגזר מהפאנל של הפיילוט. לכל שלב יש טריגר "מוכן כאשר" ברור, כדי שלא נשלח עוד מוצר לתוך ואקום של משוב.
| שלב | מודולים | מוכן כאשר |
|---|---|---|
| שלב 1 · MVP פיילוט | אימות · משפחה + הזמנה · ילדים · הוצאות · דאשבורד · הגדרות | קוד מוכן, ב-TestFlight, 10 משפחות מגויסות |
| שלב 2 · יומן והחלפות | תבנית שהות חוזרת · חגים · בקשות החלפה מובנות עם מכונת מצבים משלהן | פאנל שלב 1 עובר ≥ 4 מתוך 5 ספים, או שתוקנו ההכשלות והרצה שנייה עברה |
| שלב 3 · החלטות ומחלוקות | החלטות הוריות מובנות · מודול מחלוקות שסופג פריטים תקועים משלבים 1-2 | לפחות 2 ממשפחות הפיילוט דיווחו על מחלוקת אמיתית שדורשת יותר מ"מאשר/דוחה" |
| שלב 4 · מסמכים, הודעות מובנות, ייצוא | ספריית מסמכים (מעבר לקבלות) · סוגי הודעות מוצמדות לרשומה · ייצוא עצמי CSV / PDF | ≥ 3 משפחות מבקשות, או מועצת המגשרים אומרת שזה נדרש להעברה למקצוענים מחוץ לאפליקציה |
| שלב 5 · השכבה הרגועה (V2) | ניסוח מחדש ב-AI · תבניות הודעה למצבי עולם · ביומטריה · זיהוי נושאים חוזרים · אינטגרציות תשלום | שלבים 1–4 מגיעים ל-50+ משפחות פעילות, ופטיה היא הערוץ הראשי (לא וואטסאפ) אצל לפחות 30% |
קודם כתבנו "השלמת MVP אחרי שאוהבים הוצאות." זה היה מותנה — וגרם לשלב 2 להרגיש אופציונלי. הוא לא. מפת הדרכים מחויבת לכל חמשת השלבים; הפאנל רק קובע קצב. זה מגן עלינו מלהשקיע יתר במסלולי הוצאות בלבד, כשהמוצר האמיתי הוא המסילה הרב-מודולית.
פירוט פר שלב (שלב 2 ואילך)
יומן משותף ובקשות החלפה
- תבנית שהות חוזרת (שבוע א/ב/מותאם) + חגים + אירועים חד-פעמיים.
- בקשת החלפה = יחידת עבודה: מתאריך, לתאריך, סיבה, דדליין, תגובה מובנית.
- מצבים: הוצע · אושר · נדחה · הצעת-נגד · נסגר.
החלטות הוריות
- תחומים: חינוך, בריאות, מסכים, נסיעות, אורח חיים, אחר.
- אותה זרימה: הצעה → תגובה (מסכים / לא מסכים / חלופה / הבהרה) → תיעוד תוצאה.
- התוצאה מאושרת ע״י השניים בלחיצה. בלי חתימה משפטית.
מודול מחלוקות
- פתיחה מכל הוצאה / החלטה / אירוע. נושאת את שתי העמדות, מה מוסכם, צעד הבא.
- מצבים: פתוחה · בהבהרה · ממתינה_להצעה · נפתרה · נסגרה_ללא_הסכמה.
- פותחת מחדש את הרשומה ההורית אוטומטית בפתרון.
הודעות מובנות (רגועות יותר)
- בלי צ׳אט חופשי. הודעה תמיד מוצמדת ליחידת עבודה, עם סוג (מידע · בקשה · עדכון · סגירה).
- תקרה של 240 תווים. התקרה עצמה מורידה את הטמפרטורה.
- רמז לשפה רגועה בתוך התיבה (לא יצירתי — זה V2).
מסמכים (קל)
- מעבר לקבלות: הסכם גירושין PDF, מכתבי בית משפט, אישורים רפואיים.
- כל מסמך נקשר לילד/ים / הוצאות / החלטות לפי הצורך.
ייצוא בסיסי (CSV / PDF)
- דוח הוצאות חודשי CSV.
- PDF של לוג פעילות (להורה שרוצה תיעוד לעצמו).
- ייצוא עצמי בלבד. אין דוח לצד מקצועי (לפי הגבולות).
06בקלוג V2 / V3
- ניסוח מחדש ב-AI ("בלי העוקץ")
- תבניות הודעה למצבי עולם (20+)
- העדפות פוש פר אירוע
- ביומטריה (Face ID / קוד)
- זיהוי נושאים חוזרים ("שוב כדורסל")
- אינטגרציות תשלום (ביט / פייבוקס / בנק)
- קבלות במספר תמונות והערות בתוך התמונה
- הסכמות חיות: הפיכת מחלוקות חוזרות שנפתרו לכללי בית חדשים בין ההורים.
- ניתוח דפוסים והצעות כדחיפות עדינות (לא ייעוץ).
- ייצוא וובי לקריאה להורים עצמם (קישורים חתומים).
כל פיצ׳ר שנותן לאיש מקצוע גישה לנתוני המשפחה. דאשבורד מגשר / עו״ד / מתאם הורי, ייצוא מקצועי, מרקטפלייס, העברה לבית משפט. מגשרים נשארים שותף הפצה — לא תפקיד במוצר.
07התראות (MVP פיילוט)
| טריגר | נמען | טקסט (עב) |
|---|---|---|
expense.created | ההורה השני | "בקשת אישור חדשה — {child} · {title} · ₪{amount}" |
expense.approved | היוצר/ת | "{name} אישר/ה את ההוצאה — {title}" |
expense.declined | היוצר/ת | "{name} השיב/ה — נדרשת הבהרה" |
expense.clarification | היוצר/ת | "{name} ביקש/ה הבהרה — {title}" |
expense.paid | ההורה השני | "{name} סימן/ה ששולם — {title}" |
expense.due_24h | המשיב/ה | "דדליין מחר — {title} ממתין לתגובתך" |
invite.accepted | המזמין/ה | "{name} הצטרף/ה למרחב המשפחה" |
שעות שקט (22:00–07:00 שעון ישראל) דלוקות כברירת מחדל, יהיו ניתנות לכיבוי מ-V2. עברית קודם; טקסט אנגלי משמש כש-preferred_lang הוא en.
08בעלות על מידע ומחיקה
הורים גרושים יכולים להישבר שוב. הורה יכול לדרוש לעזוב את פטיה בזמן שההורה השני עדיין נשען על הרשומה המשותפת. המדיניות למטה מאזנת בין פרטיות אישית לבין שלמות הרשומה המשותפת, ומתוכננת להיות בלתי-ניתנת לנשק: הורה אחד לא יכול להשתמש ב"מחק את החשבון שלי" כדי למחוק את היסטוריית המציאות המוסכמת של ההורה השני.
שלוש קטגוריות, שלושה מחזורי חיים
| קטגוריה | דוגמאות | בעת מחיקת חשבון |
|---|---|---|
| אישי | מייל, שם תצוגה, שפה, תמונת פרופיל, טוקן פוש, last_seen_at | מחיקה_קשיחה מטבלאות auth + users |
| סולו, ללא מעורבות הצד השני | טיוטות הוצאה שלא נשלחו, טיוטות החלטה שלא הוצעו, הערות פרטיות | מחיקה_קשיחה |
| רשומות משותפות (הליבה המוגנת) | הוצאות שנשלחו (לא משנה מה הסטטוס), החלטות מוסכמות, אירועי יומן ששני הצדדים נגעו בהם, היסטוריית מחלוקות, כל שורה ב-expense_events | נשמרות — ההורה היוצא מוצג כ"הורה לשעבר" ב-UI; השם המקורי נשמר בלוג ביקורת בלבד. |
זרימת היציאה (≥ 7 מסכים, בכוונה לא חלקה)
- הגדרות → מחיקת חשבון פטיה. הסבר פשוט בעברית למה קורה לשלוש הקטגוריות.
- חבילת ייצוא חובה: PDF + JSON של כל רשומה שנגעו בה. לוקחים את העותק שלהם של ההיסטוריה.
- אנונימיזציה אופציונלית: החלפת שם התצוגה ב-UI של ההורה הנשאר ל"הורה לשעבר" (אחרת השם המקורי נשאר).
- תקופת התקררות: 7 ימים שבהם החשבון מושעה (לא נמחק). הקלקה אחת לביטול.
- ביום 8: מחיקה קשיחה של קטגוריות אישי + סולו. הרשומות המשותפות נשמרות. הטוקנים מבוטלים. ההתראות נפסקות. שורת auth נמחקת.
מקרי קצה
- שני ההורים מבקשים מחיקה: המשפחה נמחקת כליל, כולל רשומות משותפות. תקופת התקררות של 7 ימים; שני הצדדים חייבים להישאר במצב "ביקש מחיקה" כדי שהשעון ירוץ.
- הפעלה מחדש: הורה שמחק וחוזר מאוחר יותר מתחיל חשבון חדש. ההיסטוריה המשותפת שהשאיר היא לקריאה בלבד עבורו, ולא יוכל ליצור רשומות חדשות במשפחה ההיא בלי הזמנה חדשה.
- מעצר משפטי: אם אחד הצדדים מסמן רשומה כ"עשויה להיות נחוצה בבית משפט", היא לא נמחקת בשום זרימת מחיקה ונשמרת עד שהשניים משחררים, או 7 שנים.
שמירת רשומות משותפות אחרי בקשת מחיקה נשענת על סעיף 17(3)(e) ל-GDPR ("הקמה, מימוש או הגנה של תביעות משפטיות"). תחת חוק הגנת הפרטיות בישראל, ההצדקה היא ניהול רשומה הדרוש לאינטרס הלגיטימי של נושאי המידע האחרים (ההורה הנשאר והילדים). מדיניות הפרטיות באפליקציה מציגה זאת בעברית פשוטה, עם דוגמה אמיתית.
09מדידה ויעדים
מה לוגים (PostHog או Supabase analytics)
- פאנל: התקנה → OTP → משפחה → הזמנה → הצטרפות → הוצאה ראשונה → סגירה ראשונה.
- חותמות זמן פר אירוע, בלי PII מעבר ל-user_id ול-family_id. קבלות לא נכנסות ללוג בשום צורה.
יעדי פיילוט — 10 משפחות, 21 יום, נעולים לפני גיוס
פאנל קשיח עם ספי המשך / עצירה. קובעים את המספרים עכשיו, רושמים, ומחויבים לפעול לפיהם — להרוג או לפבט, לא "בוא ניתן עוד חודש".
| צעד | חלון | סף המשך | סיגנל כישלון כן |
|---|---|---|---|
| הזמנה → ההורה השני הצטרף | 72 שעות | ≥ 60% | < 40% → זרימת ההזמנה שבורה; המוצר לא יכול לעבוד |
| שני ההורים הצטרפו | 7 ימים | ≥ 6/10 משפחות | < 4/10 → צריך לחשוב מחדש על נוסח / ערוץ ההזמנה |
| הוצאה ראשונה הגיעה ל"נסגר" (לא נוצרה — נסגרה) | 14 יום | ≥ 5/10 משפחות | < 3/10 → המכניזם לא ברור או לא נחוץ |
| ≥ 3 הוצאות נסגרו פר משפחה | יום 21 | ≥ 4/10 משפחות | < 2/10 → אין הרגל; שימוש חד-פעמי |
| שני ההורים פעילים בשבוע 3 (≥ פעולה אחת כל אחד) | יום 14–21 | ≥ 4/10 משפחות | < 2/10 → הורה אחד נטש; המוצר מת בחיים אמיתיים |
חוק ההחלטה
- כל חמשת ספי ההמשך נחצו → בונים את Phase 2 (יומן והחלפות) כמתוכנן.
- 3–4 ספים נחצו, 1–2 כישלונות מבודדים → מתקנים את הצעד שכשל (נוסח הזמנה, UX של הוצאה, פתיחת מחלוקת וכו׳) ומריצים שוב עם משפחות חדשות. לא מתקדמים ל-Phase 2.
- ≤ 2 ספים נחצו, או ששני ההורים לא פעילים ביותר מ-6/10 משפחות → השערת יחידת-העבודה לא נוחתת. פותחים מחדש את האידאציה לפני עוד קוד.
סיגנלים איכותיים (ראיונות, NPS, "וואטסאפ נרגע") מועילים אבל לעולם לא מכריעים לבד. הפאנל מחליט.
10תוכנית פריסה (iOS תחילה, בשלבים)
הנתיב ל"בכף היד"
- ריפו: Nirkoso/patia ב-GitHub (פרטי).
- Expo + Supabase מוקמים; אימות + משפחה + ילדים + הוצאות + דאשבורד מול Supabase Cloud.
-
eas build --platform ios --profile previewמה-Mac → עולה ל-App Store Connect. - להוסיף אותך (ואת משתמשי הפיילוט) כבודקים פנימיים ב-TestFlight → התקנה דרך אפליקציית TestFlight.
- לחזור על המחזור. EAS Update שולח שינויי JS בלבד OTA בלי בנייה חדשה.
Apple — מה מצפים
- TestFlight פנימי (עד 100 בודקים): בלי סקירה, מיידי. זה נתיב הפיילוט.
- TestFlight חיצוני: סקירה קלה בבנייה הראשונה (~24 שעות).
- סקירת פרודקשן ב-App Store: 24–72 שעות בדרך כלל.
- חובה לפרודקשן: privacy manifest, מחיקת חשבון בתוך האפליקציה, טקסט הרשאת פוש, מחרוזת ATT (גם אם לא בשימוש).
Google Play — מסלול מקביל בהמשך
- $25 חד-פעמי. נפתח כשנהיה מוכנים לפיילוט אנדרואיד.
- בדיקה סגורה (חשבונות אישיים פוסט-2023): 12+ בודקים שאישרו, 14 ימים רצופים, לפני שאפשר לבקש גישה לפרודקשן. אי-אפשר לדלג.
- סקירת פרודקשן: 1–3 ימים, לפעמים 7+ לאפליקציות חדשות.
- EAS Build בונה AAB; שליחה בפקודה אחת.
- אני עושה: כל הקוד, סכמת Supabase/RLS, פיילודי פוש, אייקונים, splash, טקסטים ל-App Store, תוכנית בדיקה.
- רק אתה: הרצת
eas buildב-Mac (cert של Apple חי שם), יצירת רשומה ב-App Store Connect, הקלקה על "שלח ל-TestFlight", הזמנת בודקים. - אכתוב פלייבוק צעד-אחר-צעד לצעדים הידניים — שעה בפעם הראשונה, דקות לאחר מכן.
11שאלות פתוחות
- סימן מסחר / דומיין .il — האם "פטיה" / "Patia" פנוי? בדיקה מהירה לפני יצירת רשומת App Store.
- Sign-in-with-Apple — נדרש אם יש Social sign-in אחר (Google/Facebook וכו׳). OTP במייל דרך Supabase לא נחשב "Social", אז אפשר לדלג בפיילוט. אישור שזה עדיין תקף כשנוסיף OTP בטלפון ב-Phase 1.5.
- אזור אירוח — Supabase EU (Frankfurt) לעומת US East. EU מומלץ להורים בישראל ולעמדת GDPR בעתיד.
- ספק טלמטריה — PostHog Cloud EU לעומת לוגים של Supabase. ל-PostHog פאנלים טובים יותר OOTB.
- דיווח קריסות — Sentry בחינם לנייד, אישור?
- מגשר פיילוט — האם מפנה 3–5 זוגות לבדיקה הסגורה? מתי?