דלג לתוכן הראשי
    אינסטגרם

    OpenReply: החלופה החינמית ל-ManyChat

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

    12 דקות קריאהרמה: טכניעודכן

    מה זה בעצם#

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

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

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

    חשוב להבין: זה API רשמי, לא טריק

    OpenReply משתמש ב-private replies הרשמיים של Meta. הוא לא עושה scraping, לא מפעיל דפדפן ברקע, ולא מבקש מכם סיסמת אינסטגרם אף פעם. זה מה ששומר על החשבון שלכם בתוך הכללים של Meta, וזה משמעותי אם אכפת לכם לא לחטוף חסימה.

    את הכלי בנה Diwen, מפתח בן 17 שנמאס לו לשלם על המנוי וכתב לעצמו תחליף. הקוד נמצא ב-github.com/diwenne/openreply תחת רישיון MIT.

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

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

    כמה זה עולה, בכנות#

     ManyChatOpenReply
    תוכנה15 עד 69 דולר לחודשחינם
    תקרת אנשי קשר25 בחינמי, מדורג בתשלוםאין
    מה קורה כשרילס עףהחשבון עולהנשאר אותו דבר
    אחסוןכלולכמה דולרים בחודש
    זמן הקמהדקותאחר צהריים אחד, פעם אחת
    מי מחזיק את הטוקן שלכםManyChatאתם

    הקוד עצמו חינמי. מה שכן עולה זה להשאיר את המכונה דולקת: תהליך worker שרץ ברקע, מסד נתונים Postgres ותור Redis. השכבות החינמיות של Vercel ו-Railway מספיקות לחשבון אחד. תוסיפו נפח אמיתי או כמה חשבונות, ואתם בכמה דולרים בחודש, לא בכמה עשרות.

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

    מה צריך לפני שמתחילים#

    • חשבון Facebook. ההרשמה כמפתח ב-Meta בנויה עליו, ואין מסלול שעובר רק דרך אינסטגרם.
    • חשבון אינסטגרם עסקי או יוצר (Business או Creator). חשבון פרטי לא יכול לקבל את ה-webhook. אפשר להחליף באפליקציה: Settings ← Account type.
    • חשבון Resend עם דומיין שולח מאומת. ההתחברות למערכת עובדת רק דרך קישורי קסם במייל. בלי דומיין מאומת אף אחד לא יוכל להיכנס, כולל אתם. זה הסעיף שהכי הרבה אנשים מדלגים עליו.
    • Vercel לאפליקציית הווב, Railway ל-worker, ל-Postgres ול-Redis. השכבות החינמיות מספיקות לחשבון אחד.

    אתם לא צריכים לקנות דומיין. הכתובת החינמית שתקבלו מ-Vercel בסגנון your-app.vercel.app היא מה שהכול מצביע אליו, ו-OpenReply מגיש בעצמו את דפי מדיניות הפרטיות, התנאים ומחיקת הנתונים על אותה כתובת. אם בעתיד תרצו דומיין משלכם, אפשר להוסיף.

    איך זה בנוי#

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

    • אפליקציית הווב ו-API (Next.js). מגישה את הדשבורד, את חזרת ה-OAuth ואת ה-webhook הנכנס. רצה מצוין על Vercel.
    • ה-worker (npm run worker). תהליך Node שרץ ברציפות, מושך מהתור ושולח את ההודעות. הוא לא יכול לרוץ על Vercel, כי פונקציות serverless חיות שניות ספורות ותהליך שצורך תור צריך להישאר דלוק. Railway, Render, Fly או כל שרת שרץ 24/7 מתאימים.
    • PostgreSQL. קמפיינים, לוגים, חשבונות, סשנים.
    • Redis. תור השליחה ומגביל הקצב לכל חשבון.

    מישהו מגיב לפוסט

    Meta שולחת webhook למערכת שלכם

    המערכת בודקת את התגובה מול הקמפיינים הפעילים

    התאמה למילת מפתח יוצרת משימה בתור

    ה-worker שולח את ההודעה הפרטית, ואת התגובה הפומבית אם הפעלתם אותה

    הכלל שחייבים לזכור

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

    ההתקנה, בסדר שעובד#

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

    1 Railway: מסד נתונים, Redis ו-worker
    1. פתחו חשבון Railway וצרו New Project.
    2. בתוך הפרויקט: New ← Database ← Add PostgreSQL.
    3. שוב: New ← Database ← Add Redis.
    4. הוסיפו את ה-worker: New ← GitHub Repo, ובחרו את ה-fork שלכם לריפוזיטורי. Railway יזהה אפליקציית Node.
    5. פתחו את ה-Settings של שירות ה-worker והגדירו:
      Build Command:  npm run db:generate
      Start Command:  npm run worker
      ה-worker צריך רק את לקוח Prisma המיוצר, לא next build. אל תשאירו את ברירת המחדל: היא מריצה בנייה מיותרת, וכל שלב בנייה שנוגע במסד הנתונים ייכשל כאן, כי ה-worker לא יכול להתחבר ל-Postgres בזמן הבנייה. המיגרציות מתבצעות דרך אפליקציית הווב ודרך הפקודה הידנית בשלב הבא, אף פעם לא דרך ה-worker.
    6. פתחו Variables של ה-worker והוסיפו את כל משתני הסביבה מהטבלה למטה. ל-worker תנו את הכתובות הפנימיות של Railway, אלה שנראות כמו postgres.railway.internal ו-redis.railway.internal. בתוך הרשת של Railway הן מהירות יותר וללא עלות תעבורה.

    איפה מוצאים את כתובות החיבור

    פתחו את שירות ה-Postgres, ואז את הטאב Variables או Connect. תראו שם שתי כתובות:

    משתנהמארחלמי הוא מיועד
    DATABASE_URLpostgres.railway.internalל-worker ב-Railway בלבד
    DATABASE_PUBLIC_URL*.proxy.rlwy.netל-Vercel, ולהרצת מיגרציות מהמחשב שלכם

    אותו דבר ב-Redis: REDIS_URL הפנימי ל-worker, REDIS_PUBLIC_URL הציבורי ל-Vercel.

    Vercel רץ מחוץ לרשת הפרטית של Railway. אם תיתנו ל-Vercel כתובת פנימית, הוא יתקע ויקבל timeout. תמיד תנו ל-Vercel את הכתובות הציבוריות.

    2 מיגרציה למסד הנתונים בפרודקשן

    הריצו פעם אחת מהמחשב שלכם, עם כתובת ה-Postgres הציבורית:

    DATABASE_URL="postgresql://...proxy.rlwy.net.../railway" npm run db:migrate
    3 Vercel: אפליקציית הווב והכתובת שלכם
    1. פתחו חשבון Vercel, Add New Project, וייבאו את ה-fork שלכם. הוא יזהה Next.js לבד.
    2. תחת Settings ← Environment Variables, הוסיפו כל משתנה מהטבלה למטה, עם הערכים האלה:
      • NEXTAUTH_URL: הדומיין שלכם ב-Vercel, למשל https://your-app.vercel.app.
      • DATABASE_URL ו-REDIS_URL: הכתובות הציבוריות של Railway, כלומר DATABASE_PUBLIC_URL ו-REDIS_PUBLIC_URL.
      • ENCRYPTION_KEY: בדיוק אותו ערך שנתתם ל-worker.
    3. Deploy. הבנייה מריצה prisma generate לפני next build, כך שלקוח Prisma נוצר גם אם הוא לא בריפוזיטורי.
    4. ה-cron היומי לרענון הטוקן כבר מוגדר בקובץ vercel.json.

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

    דומיין משלכם (רשות): אם תרצו openreply.yoursite.com במקום הכתובת של Vercel, הוסיפו אותו תחת Domains והפכו אותו ל-primary. אחר כך עדכנו את NEXTAUTH_URL, את שתי הכתובות ב-Meta (שלבים 6 ו-7), וגם את NEXTAUTH_URL של ה-worker, אחרת הלינקים עם המעקב בהודעות יצביעו לדומיין הישן.

    4 יצירת אפליקציית Meta

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

    היכנסו ל-developers.facebook.com/apps וצרו אפליקציה:

    • סוג האפליקציה: Business.
    • מייל ליצירת קשר: כזה שאתם באמת בודקים.

    כשהוא מבקש להוסיף use case, סננו ל-All ובחרו Manage messaging and content on Instagram.

    שתי בחירות שישברו לכם את התהליך

    אל תבחרו "Create and manage ads with Marketing API", ואל תבחרו "Authenticate with Facebook Login". OpenReply משתמש ב-Instagram Login. הבחירה בגרסת Facebook Login גורמת לתהליך ה-OAuth להיכשל בהמשך עם שגיאת client לא תואם. אם בטעות הוספתם את ה-Marketing API, הסירו אותו: יש לו דרישות ביקורת כבדות שיכולות לחסום לכם את הפרסום.

    5 איסוף שלושת הסודות

    יש שני app secrets ושני app IDs, וזה מבלבל. הנה מה מתאים למה:

    משתנה סביבהאיפה הוא נמצא
    INSTAGRAM_APP_IDInstagram ← API setup with Instagram login. מספר בסגנון 2036...
    INSTAGRAM_APP_SECRETאותו עמוד, לחצו Show
    FACEBOOK_APP_SECRETApp settings ← Basic ← App secret, לחצו Show

    שימו לב: ה-Instagram app ID הוא לא אותו מספר כמו ה-Facebook App ID שמופיע בעמוד Basic settings. קחו את זה שמתחת למוצר Instagram.

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

    6 הזמנת tester, שני החצאים

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

    חצי ראשון, בצד של Meta

    בדשבורד האפליקציה פתחו App roles ← Roles. בגרסאות החדשות אפשר להגיע לשם גם מתוך מוצר Instagram, תחת "Generate access tokens". מצאו את המקטע של Instagram testers, לחצו add, והזינו את שם המשתמש המדויק של חשבון האינסטגרם שתרצו לחבר. שלחו את ההזמנה.

    חצי שני, בצד של אינסטגרם

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

    1. לכו לפרופיל ← התפריט ← Settings and activity.
    2. פתחו Apps and websites. בגרסאות ישנות: Website permissions ← Apps and websites.
    3. פתחו Tester invites.
    4. אשרו את ההזמנה מהאפליקציה שלכם.

    עד שתאשרו כאן, החשבון לא באמת tester וההתחברות תמשיך להיכשל. אם אתם לא רואים את ההזמנה, בדקו שוב ששלחתם לשם המשתמש המדויק ושהחשבון הוא Business או Creator.

    7 רישום כתובת החזרה של OAuth

    במוצר Instagram, פתחו Set up Instagram business login ← Business login settings. בשדה OAuth redirect URIs הוסיפו בדיוק את זה, עם הדומיין שלכם:

    https://your-app.vercel.app/api/instagram/callback

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

    ה-"Embed URL" ש-Meta מציגה כאן לא נחוץ לכם. OpenReply בונה את כתובת ההתחברות שלו לבד. משתמשים מתחברים דרך Settings ← Connect Instagram באפליקציה שלכם.

    8 הגדרת ה-webhook

    עדיין במוצר Instagram, מצאו את שלב Configure webhooks:

    • Callback URL: https://your-app.vercel.app/api/webhook
    • Verify token: הערך של WEBHOOK_VERIFY_TOKEN ממשתני הסביבה שלכם.
    • לחצו Verify and save. זה אמור להצליח מיד, כי האפליקציה עונה לאתגר האימות של Meta. אם הכפתור אפור, לחצו בתוך שדה ה-verify token והדביקו את הטוקן שוב: עריכה של ה-callback URL מנקה אותו לעיתים קרובות.
    • הירשמו לשדה comments.

    כדי לבדוק מסירה בלי תגובה אמיתית, לחצו Test ליד comments, ואז Send to My Server. שימו לב שאלה שני כפתורים: הראשון רק מציג תצוגה מקדימה של המטען, והשני הוא זה ששולח אותו בפועל. אחרי השליחה אמורה להופיע שורה בטבלה WebhookEvent.

    אם הדומיין הראשי שלכם משתנה אי פעם, עדכנו את ה-callback URL. דומיין שאינו primary יבצע הפניה 307 לבקשה, ו-Meta לא עוקבת אחרי הפניות באופן אמין, כך שה-webhooks פשוט יפסיקו בשקט.

    9 פרסום האפליקציה

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

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

    https://your-app.vercel.app/privacy
    https://your-app.vercel.app/data-deletion
    https://your-app.vercel.app/terms

    ואז פרסמו. לפי רמת הגישה שלכם, Meta עשויה לאפשר לכם לעלות ל-Live עבור חשבונות ה-tester שלכם מיד, או לדרוש App Review קודם. אם אתם מריצים את זה לעצמכם, בדרך כלל לא תצטרכו ביקורת.

    10 בדיקה מקצה לקצה
    1. ודאו שהחשבון הוא tester ושאישר את ההזמנה (שלב 6), ושהאפליקציה מפורסמת (שלב 9).
    2. חברו אותו באפליקציה: Settings ← Connect Instagram. אתם אמורים להגיע למסך ההסכמה של אינסטגרם, לא לשגיאת "Insufficient Developer Role".
    3. צרו קמפיין על אחד הפוסטים שלכם עם מילת מפתח כמו TEST.
    4. מחשבון אינסטגרם אחר, הגיבו TEST על אותו פוסט. זה חייב להיות חשבון אחר, כי OpenReply מתעלם מהתגובות שלכם בכוונה.
    5. חכו להודעה. אם כלום לא מגיע, בדקו את עמוד DM Logs ואת /api/health.

    אפשר לפנות ל-/api/health בכל רגע. הוא מדווח על מסד הנתונים, Redis, התור ופעימת הלב של ה-worker. אם worker.healthy מחזיר false, ה-worker לא רץ או לא מצליח להגיע ל-Redis, ואף הודעה לא תישלח גם אם ה-webhooks מגיעים כרגיל.

    אם תרצו לבדוק איפה בדיוק נעצרה תגובה, הטבלאות ב-Postgres מספרות את הסיפור: WebhookEvent למסירה, DmLog לסטטוס השליחה ולשגיאות, OperationalEvent לקריסות של ה-worker וללוגים של סריקת התגובות.

    משתני הסביבה במלואם#

    העתיקו את .env.example ל-.env לעבודה מקומית, או הגדירו את אלה ב-Vercel וב-Railway.

    משתנהמה זה
    NEXTAUTH_URLהכתובת הציבורית שלכם. הדומיין ב-Vercel בפרודקשן, כתובת המנהרה בעבודה מקומית.
    NEXTAUTH_SECRETסוד אקראי. openssl rand -base64 32
    CRON_SECRETסוד אקראי שמגן על ה-cron שמרענן את הטוקן.
    ENCRYPTION_KEY32 בייט בהקסדצימלי. openssl rand -hex 32. מצפין את טוקני האינסטגרם. חייב להיות זהה באפליקציית הווב וב-worker, ובאורך של בדיוק 64 תווים הקסדצימליים, אחרת האפליקציה קורסת בעלייה.
    DATABASE_URLמחרוזת חיבור ל-PostgreSQL. הכתובת הציבורית של Railway ב-Vercel, הפנימית ב-worker.
    REDIS_URLמחרוזת חיבור ל-Redis. חייב לתמוך בפקודות חוסמות, כך ש-Redis שעובד רק דרך HTTP לא יעבוד עם BullMQ.
    RESEND_API_KEYהמפתח מ-Resend. ההתחברות היא רק קישורי קסם במייל, אז בלי זה אף אחד לא נכנס.
    EMAIL_FROMכתובת שולח על דומיין שאימתתם ב-Resend. ערך ברירת המחדל לא יימסר.
    META_GRAPH_API_VERSIONגרסת ה-Graph API, למשל v25.0.
    INSTAGRAM_APP_IDמאפליקציית Meta, מעמוד מוצר Instagram (לא מ-Basic settings).
    INSTAGRAM_APP_SECRETמאותו עמוד.
    FACEBOOK_APP_SECRETApp settings ← Basic.
    WEBHOOK_VERIFY_TOKENמחרוזת אקראית שאתם ממציאים. את אותו ערך תדביקו בהגדרות ה-webhook ב-Meta.

    לכוונון סריקת התגובות (ברירות המחדל בסדר להתחלה)

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

    הקיצור: לתת ל-Claude Code לעשות את זה#

    הריפוזיטורי כולל פרומפט מוכן במקטע "Set it up with an AI assistant". משכפלים את הקוד, פותחים אותו ב-Claude Code או ב-Cursor, מדביקים את הפרומפט, והעוזר מוביל את כל ההקמה ושואל אתכם ערכים תוך כדי.

    זה המסלול המיועד, לא עקיפה. המדריך של הריפוזיטורי עצמו ממליץ עליו.

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

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

    הפרומפט עצמו (מתוך הריפוזיטורי)

    You are helping me self-host OpenReply, an open source Instagram comment-to-DM
    automation tool, in this repository. Read README.md and docs/setup.md first, then
    help me get it running end to end.
    
    My goal: <describe it. For example: run it for my own Instagram account only,
    or host it for other people to sign up.>
    
    Work through this in order and stop to ask me whenever you need a value or an
    action only I can do:
    
    1. Local or hosted. Ask me which I want. If hosted, we use Vercel for the web
       app (its domain becomes my public URL) and Railway for the worker plus
       Postgres and Redis. If local, we use docker-compose and a tunnel.
    
    2. Datastores. Help me get a Postgres and a Redis running, then run the Prisma
       migration against them.
    
    3. Environment. Generate NEXTAUTH_SECRET, CRON_SECRET, ENCRYPTION_KEY, and
       WEBHOOK_VERIFY_TOKEN for me. Ask me for my Resend API key and a verified
       sender address, and for the three Meta secrets once I create the app. Make
       sure ENCRYPTION_KEY is identical on the web app and the worker.
    
    4. Deploy both processes and confirm /api/health returns ok with the worker
       healthy.
    
    5. Meta app. Walk me through the Meta app section of docs/setup.md one step at a
       time. This is the slow part. Tell me exactly what to click and what to paste,
       using my Vercel domain for the OAuth redirect and webhook. Remember the
       account ID trap (store user_id, not id) and that the app must be published
       for real webhooks to arrive.
    
    6. Test. Have me create a campaign and comment a keyword from a second account,
       then confirm the DM sent by checking the DmLog table and the DM Logs page.
    
    Rules for you:
    - Never invent Meta dashboard steps. If a screen does not match the guide, ask
      me to screenshot it.
    - Diagnose failures by querying the Postgres tables directly: WebhookEvent for
      delivery, DmLog for send status, OperationalEvent for worker errors. This is
      faster than logs.
    - Remind me to rotate any secret I paste to you before real use.
    
    Start by reading the docs, then ask me question 1.

    בסוף התהליך, /api/health אמור להחזיר status: ok עם worker.healthy: true, ותגובה עם מילת המפתח שלכם מחשבון שני אמורה לייצר שורת SENT בלוגים. אם הגעתם לשם, סיימתם.

    שבעת הכשלים השקטים#

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

    1. האפליקציה עדיין במצב Development. זו הסיבה הכי נפוצה ל"הגדרתי הכול ושום דבר לא קורה". במצב פיתוח, webhooks של תגובות אמיתיות פשוט לא נמסרים. רק כפתור הבדיקה בקונסולה עובד, וזה בדיוק למה אנשים חושבים שהם אימתו את המערכת. הפתרון: פרסמו את האפליקציה.
    2. הזמנת ה-tester אושרה רק בחצי. להוסיף את עצמכם כ-tester בדשבורד של Meta זה חצי אחד. לאשר בתוך אפליקציית אינסטגרם זה החצי השני. בלי האישור, ההתחברות נכשלת עם "Insufficient Developer Role".
    3. ENCRYPTION_KEY לא זהה בין שני השירותים. אפליקציית הווב מצפינה את טוקן האינסטגרם. ה-worker מפענח אותו. אם המפתח לא זהה ב-Vercel וב-Railway, כל שליחה נכשלת בזמן שכל השאר נראה בריא לחלוטין.
    4. נתתם ל-Vercel את הכתובות הפנימיות של Railway. כתובות *.railway.internal עובדות בין שירותים בתוך Railway ונתקעות מכל מקום אחר. ה-worker רוצה פנימי. Vercel רוצה ציבורי.
    5. ל-Resend יש מפתח API אבל אין דומיין שולח מאומת. ההתחברות היא רק קישורי קסם. בלי דומיין מאומת אין מייל, ובלי מייל אין התחברות, לאף אחד.
    6. סלאש מיותר בסוף כתובת ה-OAuth. הכתובות .../api/instagram/callback/ ו-.../api/instagram/callback הן שתי כתובות שונות מבחינת Meta. החיבור נכשל עם redirect_uri mismatch.
    7. בדקתם מהחשבון שלכם. התגובות שלכם עצמכם מסוננות בכוונה, כי Meta ממילא לא מרשה לשלוח הודעה לעצמכם. השתמשו בחשבון שני, אחרת האוטומציה לא תופעל לעולם, כמה שכל השאר יהיה נכון.

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

    מה המערכת נותנת, לפי סדר חשיבות#

    רוב רשימות הפיצ'רים שטוחות. הנה הגרסה המסודרת לפי מה שבאמת משנה.

    1. מילת מפתח להודעה פרטית, בלי תקרת אנשי קשר. מגדירים מילת מפתח על פוסט, וכל מי שמגיב אותה מקבל את הלינק תוך שניות. זה כל המוצר וזו כל הסיבה לעזוב כלי מנוי. הכלכלה מפסיקה לעבוד נגדכם ברגע שרילס מצליח.
    2. לינקים עם מעקב. מחליפים לינק בלינק עם הפניה מנוטרת ורואים בדיוק מי לחץ, לא רק למי נשלח. זה מה שהופך את המנגנון מכלי מסירה לכלי ייחוס, וזה ההבדל בין "לרילס היו צפיות" לבין "הרילס ייצר לידים". אפשר לשלוח עד שני כפתורי לינק בהודעה אחת, כל אחד עם סטטיסטיקת קליקים משלו.
    3. כמה חשבונות אינסטגרם מדשבורד אחד. מריצים כמה חשבונות דרך פריסה אחת. במנוי לפי מושב, זה בדיוק המקום שבו החשבון מתנפח הכי מהר.
    4. גישה לצוות. העורך או העוזרת שלכם יכולים להקים קמפיינים בלי שתמסרו להם את פרטי ההתחברות לאינסטגרם. יש תפקידי Owner, Admin ו-Member עם קישורי הזמנה.
    5. הטוקן נשאר אצלכם. אירוח עצמי משמעותו שטוקן הגישה לאינסטגרם יושב במסד הנתונים שלכם, מוצפן במפתח שלכם, ולא אצל ספק. אם ספק משנה מחירים, נרכש או נסגר, אצלכם כלום לא קורה.
    6. נקודת בריאות שאומרת את האמת. /api/health מדווח על מסד הנתונים, Redis, התור ופעימת הלב של ה-worker. worker.healthy: false אומר שאף הודעה לא תישלח, גם אם ה-webhooks מגיעים כרגיל. הנקודה הזאת מחליפה את רוב הדיבאגינג.

    עוד דברים שיש בקופסה

    • תגובה פומבית אופציונלית. אפשר לפרסם תגובה גלויה מתחת לתגובה של הגולש, במקביל להודעה הפרטית.
    • שער מעקב (follow gate). אפשר לדרוש מעקב לפני מסירת הלינק. ההודעה מבקשת מהמגיב לעקוב וללחוץ על כפתור, והמערכת בודקת מול Meta אם הוא באמת עוקב. אם אינסטגרם לא מחזירה סטטוס מעקב, המערכת שולחת את הלינק בכל מקרה, כדי שעוקב אמיתי לא ייתקע.
    • פרסונליזציה. אפשר להשתמש ב-{username} בהודעה כדי לפנות למגיב בשמו.
    • מגבלת קצב לכל חשבון. נשאר מתחת לתקרה המתועדת של Meta, 750 הודעות פרטיות בשעה, ומכניס את העודף לתור במקום לאבד אותו.
    • תיבת הודעות. אפשר לקרוא שיחות אינסטגרם ולהשיב מהדשבורד, בתוך חלון 24 השעות של Meta.
    • תבניות קמפיין ולוגים. מתחילים מתבנית מוכנה במקום מטופס ריק, וכל שליחה, דילוג וכישלון נרשמים עם סיבה.

    מגבלות שכדאי להכיר#

    • זה כלי למפתחים. אתם פורסים שני שירותים, מגדירים אפליקציית Meta ומנהלים משתני סביבה. אחר הצהריים הזה אמיתי, אבל הוא אחר צהריים טכני.
    • הזמינות עליכם. אין תורנות. אם ה-worker נופל, ההודעות נעצרות, ואתם תגלו את זה מהתגובות שלכם אלא אם תבדקו את נקודת הבריאות.
    • זו אוטומציה לא רשמית על פלטפורמה של מישהו אחר. היא משתמשת ב-webhook וב-API ההודעות המאושרים של Meta, וזו הדרך הנכונה, אבל המדיניות וגרסאות ה-API של אינסטגרם משתנות, ואתם אלה שצריכים להתעדכן.
    • App Review לא נדרש לכם, ונדרש לגרסה מארחת. להריץ את זה לחשבון שלכם או לקומץ testers אף פעם לא דורש App Review מ-Meta. אם אתם רוצים שזרים יירשמו למופע שלכם, זה מוצר אחר: הוא דורש הרשאת Advanced Access, אימות עסקי עם מסמכי רישום חברה, והקלטת מסך של כל התהליך בלקיחה אחת. Meta בודקת אפליקציות לאוטומציה של הודעות בקפדנות ולעיתים קרובות דוחה את ההגשה הראשונה.
    • פיתוח מקומי דורש מנהרה. ה-webhooks של Meta לא יכולים להגיע ישירות למחשב שלכם. הריצו ngrok http 3000 והפנו את NEXTAUTH_URL ואת שתי הכתובות ב-Meta לכתובת המנהרה.

    משהו לא עובד? טבלת פתרונות#

    התסמיןמה לבדוק
    ה-webhooks מגיעים אבל אף הודעה לא נשלחת פנו ל-/api/health. אם worker.healthy הוא false, ה-worker נפול או מוגדר לא נכון וכלום לא יישלח. אם הוא true, ודאו ש-ENCRYPTION_KEY זהה בית-בית ב-Vercel וב-Railway.
    "Insufficient Developer Role" בהתחברות הזמנת ה-tester לא אושרה בתוך אפליקציית אינסטגרם. Settings and activity ← Apps and websites ← Tester invites.
    בדיקת הקונסולה עובדת אבל תגובות אמיתיות לא עושות כלום האפליקציה עדיין במצב Development. פרסמו אותה.
    redirect_uri mismatch בחיבור אינסטגרם בדקו סלאש מיותר בסוף כתובת ה-callback הרשומה.
    אף אחד לא מצליח להתחבר, כולל אתם ל-Resend אין דומיין שולח מאומת.
    כפתור ה-Verify ב-webhook אפור הדביקו מחדש את ה-verify token. עריכה של ה-callback URL מנקה אותו.
    בקשות מ-Vercel נתקעות או מקבלות timeout נתתם לו כתובות פנימיות של Railway. החליפו לציבוריות.
    הבנייה נכשלת ב-Railway פקודת הבנייה עדיין ברירת המחדל. הגדירו npm run db:generate לבנייה ו-npm run worker להפעלה.
    חשבון מחובר אבל הודעות נכשלות עם שגיאת זיהוי ל-Meta יש שני מזהים בתגובת /me: השדה id משויך לאפליקציה, והשדה user_id הוא מזהה החשבון המקצועי באינסטגרם. OpenReply שומר את user_id, כך שחיבור חדש מתאים נכון. אם שדרגתם מגרסה ישנה מאוד, נתקו את החשבון וחברו אותו מחדש פעם אחת.

    לסיכום#

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

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

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

    מה לעשות עכשיו

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

    קרדיטים ומקורות

    OpenReply נבנה ומתוחזק על ידי Diwen Huang (@diwenne ב-GitHub), ברישיון MIT. הוא fork של instagram-comment-to-dm מאת Anish Raj. בדקו את תנאי הרישיון העדכניים לפני שאתם בונים משהו מסחרי מעליו.

    המדריך הזה מבוסס על התיעוד הרשמי בריפוזיטורי (docs/setup.md) ועל הניתוח של Steve Tan, שמיפה את שבעת הכשלים השקטים.

    אלמוג פישלרFishler AI