मुफ़्त APK बनाएँ

नोटिफ़िकेशन

AppMint Push - अपने यूज़र को सूचित करें

अपना ऐप इंस्टॉल करने वाले हर किसी को सीधे AppMint से, अपने Firebase प्रोजेक्ट पर नोटिफ़िकेशन भेजें - शेड्यूल करें, भेजने के बाद बदलें, रद्द करें, डीप लिंक

1यह कैसे काम करता है#

AppMint Push आपके ऐप को इंस्टॉल करने वाले हर किसी को AppMint के अंदर से नोटिफ़िकेशन भेजता है - अभी भेजें, शेड्यूल करें, भेजने के बाद बदलें, रद्द करें, डीप लिंक।

हर संदेश डिज़ाइन किया जा सकता है: 8 टेम्पलेट, आपका अपना रंग, 3 बटन तक जो हर एक अपना पेज खोलता है, आवाज़ और पॉप-अप के विकल्प, और ऐप खुला होने पर नेटिव इन-ऐप बैनर, कार्ड, शीट या फ़ुल स्क्रीन। लाइव प्रीव्यू इसे ठीक वैसा दिखाता है जैसा यूज़र के फ़ोन पर दिखेगा।

यह आपके अपने Firebase प्रोजेक्ट पर चलता है: आपके यूज़र, आपका प्रोजेक्ट, कोई साझा सीमा नहीं, और आपका कुछ भी AppMint पर होस्ट नहीं होता। Firebase Cloud Messaging मुफ़्त है और संदेशों की कोई सीमा नहीं है।

उस प्रोजेक्ट से आपको दो फ़ाइलें चाहिए - google-services.json (बिल्ड के लिए) और एक service-account key (भेजने के लिए)। अगले चरण दोनों दिलाते हैं। यह हर बिल्ड मोड में काम करता है: वेबसाइट, ZIP, HTML और AI।

AppMint Push और OneSignal एक-दूसरे के विकल्प हैं: एक चालू करने से दूसरा बंद हो जाता है।

2Firebase प्रोजेक्ट बनाएँ#

Firebase Console पर जाएँ और 'Add project' दबाएँ (या कोई मौजूदा प्रोजेक्ट खोलें)। मुफ़्त Firebase प्रोजेक्ट काफ़ी है - नोटिफ़िकेशन के लिए बिलिंग की ज़रूरत नहीं।

एक प्रोजेक्ट में आपके कई ऐप हो सकते हैं।

3अपना ऐप जोड़ें और google-services.json डाउनलोड करें#

अपने Firebase प्रोजेक्ट में:

  • 'Add app' दबाएँ और Android चुनें
  • पैकेज नाम ठीक वैसा ही डालें जैसा AppMint विज़ार्ड में सेट है (जैसे com.yourname.yourapp) - अलग होने पर नोटिफ़िकेशन कभी नहीं पहुँचेंगे, और AppMint इसी कारण बिल्ड मना कर देता है
  • 'Register app' दबाएँ और google-services.json डाउनलोड करें
  • आप बाकी SDK चरण छोड़ सकते हैं - AppMint उन्हें संभाल लेता है

4इसे चालू करें और फ़ाइल अपलोड करें#

बिल्ड विज़ार्ड के Push Notifications कार्ड में:

  • 'AppMint Push' चालू करें
  • 'Upload google-services.json' दबाएँ और पिछले चरण की फ़ाइल चुनें

विज़ार्ड जाँचता है कि फ़ाइल में आपका पैकेज नाम है। फिर अपना APK सामान्य तरीके से बनाएँ - बिल्ड के दौरान आपका ऐप आपके प्रोजेक्ट के लिए पुश पर रजिस्टर हो जाता है।

यूज़र को बस ऐप इंस्टॉल करके एक बार खोलना है। Android 13+ पर पहली स्क्रीन लोड होने के बाद उनसे नोटिफ़िकेशन की अनुमति माँगी जाती है।

टेम्पलेट, बटन और इन-ऐप स्टाइल के लिए AppMint के इस वर्ज़न या नए वर्ज़न से बना ऐप चाहिए। पुराना बिल्ड हर संदेश पाता है - बस उसे उसी सादी स्टाइल में दिखाता है जिसमें वह हमेशा दिखाता था।

5अपनी सर्विस-अकाउंट Key अपलोड करें (एक बार)#

AppMint आपके प्रोजेक्ट के ज़रिए भेजता है, इसलिए उसे उसी की एक Key चाहिए - वही फ़ाइल जो OneSignal माँगता है।

Firebase Console में:

  • ⚙ Project settings → 'Service accounts' टैब
  • 'Generate new private key' दबाएँ और पुष्टि करें - एक JSON फ़ाइल डाउनलोड होगी

AppMint में: Home > Notifications → अपना ऐप चुनें → 'Upload key' → वह JSON चुनें।

AppMint key को सेव करने (एन्क्रिप्ट करके) से पहले आपके प्रोजेक्ट पर एक टेस्ट भेजकर जाँचता है, इसलिए हरा टिक मतलब अगला संदेश सच में जाएगा। हर ऐप के लिए एक अपलोड; ऐप रीबिल्ड करने पर इसे दोबारा नहीं चाहिए, जब तक आप Firebase प्रोजेक्ट न बदलें।

⚠️ यहाँ SERVICE-ACCOUNT key अपलोड करें, google-services.json नहीं - अगर आप दोनों में गड़बड़ करें तो स्क्रीन बता देती है। बाद में पहुँच रद्द करने के लिए Firebase Console में key हटा दें।

6अपना पहला नोटिफ़िकेशन भेजें#

Home > Notifications में:

  • अपना ऐप चुनें
  • शीर्षक लिखें (संदेश, इमेज और लिंक वैकल्पिक हैं)
  • Live preview कार्ड देखें
  • 'Send Notification' पर टैप करें

आपका ऐप इंस्टॉल किए हर फ़ोन को यह मिलता है।

इमेज के लिए Image बॉक्स पर टैप करें: 'Choose from device' (2 MB तक, PNG, JPEG या WebP) या 'Paste an image link' (https://)। चुनी हुई इमेज सिर्फ़ Send दबाने पर अपलोड होती है - उससे पहले आप उसे जितनी बार चाहें चुन, बदल या हटा सकते हैं।

7टेम्पलेट चुनें#

Design → Template नोटिफ़िकेशन का लेआउट तय करता है। टेक्स्ट हमेशा पहले आता है - तस्वीर संदेश को कभी नहीं ढकती:

  • Automatic - संदेश में इमेज हो तो Image card, वरना Standard
  • Standard - शीर्षक और पूरा संदेश; इमेज बगल में छोटा थंबनेल बन जाती है
  • Image card - पढ़ने लायक शीर्षक और संदेश के NEECHE तस्वीर
  • Banner - आपके रंग से भरा कार्ड, वैकल्पिक बैज के साथ
  • Promo - '50% OFF' जैसा बैज और रंगीन बटन (आपका पहला बटन)
  • List - 6 छोटी लाइनों तक, जैसे कई ऑर्डर अपडेट
  • Countdown - लाइव टाइमर जो आपकी चुनी तारीख और समय तक उल्टी गिनती करता है, फिर खुद ट्रे से हट जाता है
  • Progress - प्रोग्रेस बार; नई वैल्यू के साथ edit & resend करें और बार हर फ़ोन पर बिना दोबारा बजे आगे बढ़ जाता है
  • Minimal - शीर्षक और एक लाइन, कोई आवाज़ नहीं, कोई पॉप-अप नहीं

टेक्स्ट और इमेज का साइज़ हर यूज़र के फ़ॉन्ट साइज़ के हिसाब से ढल जाता है, इसलिए बड़े टेक्स्ट वाले फ़ोन पर भी कुछ कटता नहीं।

8रंग चुनें#

Design → Colour नोटिफ़िकेशन के आइकन, बैनर, बटन और काउंटडाउन को रंग देता है। 9 तैयार रंगों में से एक चुनें, या किसी भी #RRGGBB के लिए '+' दबाएँ।

हर तैयार रंग लाइट और डार्क दोनों फ़ोन पर अच्छा पढ़ा जाता है। आपके अपने रंग की दोनों पर जाँच होती है: अगर वह बहुत हल्का या गहरा है, तो रंगों के नीचे का नोट यह बताता है, और कस्टम-रंग बॉक्स में 'Fix contrast' उसकी रंगत बनाए रखते हुए उसे सबसे पास के काम करने वाले शेड पर ले आता है। रंगीन बटन या बैनर पर टेक्स्ट अपने आप काला या सफ़ेद हो जाता है।

दोनों देखने के लिए Live preview में 'Light phone' / 'Dark phone' टाइल इस्तेमाल करें।

9बटन जोड़ें#

Design → Buttons: '+ Add button' (3 तक)। हर एक का एक लेबल (24 अक्षरों तक) और अपना लिंक होता है - जैसे 'Track order' → #/orders/1042 और 'Help' → #/support। मुख्य लिंक खोलने के लिए बटन का लिंक खाली छोड़ें।

बटन नोटिफ़िकेशन के नीचे ट्रे में और इन-ऐप प्रस्तुति में दिखते हैं। Promo टेम्पलेट में पहला बटन कार्ड का बड़ा रंगीन बटन बन जाता है।

10जब ऐप खुला हो#

Design → 'While the app is open' तय करता है कि जब संदेश तब आए जब यूज़र आपका ऐप इस्तेमाल कर रहा हो, तो उसे क्या दिखे:

  • App's own design (डिफ़ॉल्ट) - आपके ऐप का कोड इसे दिखाता है (नीचे In-App Inbox देखें)
  • Top banner - ऊपर से नीचे खिसकता है और कुछ सेकंड बाद खुद छिप जाता है
  • Centre card - धुंधले ऐप के ऊपर एक कार्ड जिसमें इमेज, टेक्स्ट और बटन हैं
  • Bottom sheet - वही कार्ड नीचे से ऊपर आता हुआ
  • Full screen - बड़ी इमेज, और बटन नीचे

प्रस्तुति फ़ोन की लाइट या डार्क थीम के हिसाब से चलती है, और Back दबाने या बाहर टैप करने से बंद हो जाती है। जब यह दिखाई जाती है, तो वही संदेश ट्रे में नहीं डाला जाता - यूज़र पहले से उसे देख रहा है।

'In-app only' (Delivery → Show as) के साथ, ऐप बंद होने पर आया संदेश यूज़र के अगली बार ऐप खोलने पर दिखाया जाता है।

11आवाज़, पॉप-अप और समय#

Design → Behaviour:

  • Sound - बिना आवाज़ वाले नोटिफ़िकेशन के लिए बंद करें
  • Pop up on screen - यूज़र जो कर रहा है उस पर झाँकने से बचने के लिए बंद करें (यह फिर भी ट्रे में आ जाता है)
  • Auto-dismiss - 30 सेकंड से 3 दिन बाद नोटिफ़िकेशन को ट्रे से हटा देता है (Android 8 और नया)

उन्नत विकल्प:

  • आइकन / अवतार इमेज - टेक्स्ट के बगल में गोल तस्वीर (https:// लिंक)
  • Bundle key - इसे साझा करने वाले संदेश एक शीर्षक के नीचे समूहित होते हैं
  • Replace key - उसी key वाला नया संदेश फ़ोन और इनबॉक्स में पुराने संदेश की जगह ले लेता है, जैसे लाइव स्कोर

यूज़र आपके ऐप की Android नोटिफ़िकेशन सेटिंग्स में हर प्रकार की आवाज़ भी बदल सकते हैं।

12टेस्ट करें, सेव करें और दोबारा इस्तेमाल करें#

  • Live preview - Collapsed, Expanded और In-app टाइल, लाइट या डार्क फ़ोन पर, उसी कोड से बनी जो आपके यूज़र के फ़ोन चलाते हैं
  • 'Test on this phone' - संदेश सिर्फ़ आपके फ़ोन पर दिखाता है, असली नोटिफ़िकेशन के रूप में या Notifications स्क्रीन के ऊपर इन-ऐप प्रस्तुति के रूप में। यूज़र को कुछ नहीं भेजा जाता
  • सेव किए टेम्पलेट (ऊपर किताब का आइकन) - 'Save the current message as a template' टेक्स्ट, लिंक, इमेज और हर डिज़ाइन चुनाव को इस फ़ोन पर सेव रखता है; 'Use' इसे एक टैप में वापस लोड कर देता है
  • History में 'Duplicate as a new message' किसी भी पुराने संदेश से नया संदेश शुरू करता है

13बाद के लिए शेड्यूल करें#

Delivery कार्ड में, When के नीचे 'Schedule' पर टैप करें, फिर तारीख और समय चुनें। नोटिफ़िकेशन ठीक उसी समय अपने आप चला जाता है।

जब तक यह चला नहीं है, आप इसे नीचे की History सूची से बदल या रद्द कर सकते हैं।

14भेजने के बाद गलती सुधारें#

History में किसी भी नोटिफ़िकेशन पर टैप करें:

  • 'Edit & resend' - इसे पूरे डिज़ाइन के साथ वापस कंपोज़र में लोड करता है; फिर 'Update & resend' इसे हर डिवाइस पर उसी जगह बदल देता है
  • 'Cancel' - उन सभी फ़ोन से इसे हटा देता है जहाँ यह अभी खोला नहीं गया, स्क्रीन पर चल रही इन-ऐप प्रस्तुति समेत
  • 'Delete' - रद्द करने जैसा ही, और इसे आपकी हिस्ट्री से भी हटा देता है

⚠️ जो नोटिफ़िकेशन यूज़र खोल चुका है या हटा चुका है, उसे वापस नहीं लिया जा सकता।

15कोई ख़ास पेज खोलें#

वैकल्पिक Link फ़ील्ड तय करती है कि टैप करने पर क्या खुले (हर बटन का अपना हो सकता है):

  • पूरा https:// पता (वेबसाइट ऐप के लिए बढ़िया)
  • ऐप के अंदर का route, जैसे #/offers

आपके ऐप का कोड इसे कभी भी पढ़ भी सकता है:

const link = window.WebToApk?.getLaunchUrl?.();
window.addEventListener('appmint:deep-link',
  e => goTo(e.detail.url));

16In-App Inbox (वैकल्पिक)#

हर पुश इंस्टॉल किए गए ऐप के अंदर भी सेव होता है (आखिरी 50), ताकि आपका ऐप अनरीड बैज के साथ अपनी नोटिफ़िकेशन स्क्रीन दिखा सके। यह हर बिल्ड मोड में काम करता है - वेबसाइट (URL) ऐप में भी, जहाँ आप बस ये कुछ लाइनें अपनी साइट में जोड़ते हैं।

जब शेल पहले ही स्क्रीन पर संदेश दिखा चुका हो ('While the app is open' के नीचे की कोई स्टाइल), तो इवेंट में presented: true आता है - तब दूसरा बैनर न बनाएँ। जो ऐप अपने सारे बैनर खुद बनाता है, वह setPushPresentation('none') से शेल के बैनर बंद कर सकता है।

Dismiss एक स्वाइप है, छोटा ✕ नहीं, और इसे वापस किया जा सकता है - इसके साथ एक छोटा Undo दें:

const B = window.WebToApk;
const inbox = JSON.parse(B?.getPushInbox?.() ?? "[]");
// [{id,title,body,imageUrl,link,receivedAt,read,
//   template?,accent?,buttons?,badge?,inapp?...}]
const unread = inbox.filter(m => !m.read).length;

// live arrival while the app is open
window.addEventListener('appmint:push', e => {
  const d = e.detail;
  if (d.type === 'received' && !d.presented) showBanner(d.message);
  refreshInbox();   // fires for 'revoked' too
});

B?.markPushRead?.(id);        // "" = mark all read
B?.dismissPushMessage?.(id);  // swipe away
B?.restorePushMessage?.(id);  // ...Undo
B?.setPushPresentation?.('none'); // app draws its own

17अगर आपके टेस्ट फ़ोन पर कुछ नहीं आता#

लगभग हमेशा यह TEST PHONE की सीमा होती है, आपके ऐप या आपके यूज़र की नहीं।

Android हर फ़ोन पर लगभग 100 पुश रजिस्ट्रेशन की अनुमति देता है। नोटिफ़िकेशन इस्तेमाल करने वाले ऐप का हर नया इंस्टॉल एक रजिस्ट्रेशन लेता है - इसलिए टेस्ट करते समय एक के बाद एक बिल्ड इंस्टॉल करने से ये सब खत्म हो सकते हैं, और फिर वह फ़ोन नए इंस्टॉल किए ऐप के लिए संदेश पाना बंद कर देता है।

स्लॉट खाली करें (असल में यही काम करता है):

  • जिन टेस्ट ऐप की अब ज़रूरत नहीं उन्हें अनइंस्टॉल करें - Android हर ऐप द्वारा रोका गया स्लॉट छोड़ देता है
  • या टेस्ट ऐप का डेटा साफ़ करें: Settings > Apps > [वह ऐप] > Storage > Clear data - इससे अनइंस्टॉल किए बिना उसका स्लॉट खाली हो जाता है
  • एमुलेटर पर, उसे वाइप करने से हर स्लॉट एक साथ रीसेट हो जाता है

फ़ोन रीस्टार्ट करने से मदद नहीं मिलती: ये रजिस्ट्रेशन हमेशा के लिए सेव रहते हैं, इसीलिए रीबूट के बाद भी बने रहते हैं। Google Play Services का कैश साफ़ करने से भी ये खाली नहीं होते।

टेस्ट करते समय इससे बचें:

  • बार-बार बनाते समय एक ही पैकेज नाम रखें - हर अलग पैकेज नाम अपना अलग स्लॉट लेता है
  • पहले अनइंस्टॉल करने के बजाय नया APK पुराने के ऊपर इंस्टॉल करें - अपडेट मौजूदा रजिस्ट्रेशन बनाए रखता है, जबकि दोबारा इंस्टॉल नया रजिस्ट्रेशन खर्च करता है
  • किसी अतिरिक्त फ़ोन या एमुलेटर पर टेस्ट करें; एमुलेटर वाइप करने से उसके स्लॉट तुरंत रीसेट हो जाते हैं
  • जिन टेस्ट ऐप से आपका काम हो गया उन्हें हटा दें

बुनियादी बातें भी जाँचें: इंस्टॉल के बाद ऐप कम से कम एक बार खोला गया हो, और Android सेटिंग्स में उसके लिए नोटिफ़िकेशन की अनुमति हो। ऐप हर बार खुलने पर दोबारा सब्सक्राइब करता है, इसलिए स्लॉट खाली होते ही यह खुद ठीक हो जाता है - रीबिल्ड की ज़रूरत नहीं।

18सीमाएँ और अच्छे तरीके#

  • आप कितने भी नोटिफ़िकेशन भेजें, कोई सीमा नहीं - Firebase Cloud Messaging मुफ़्त है
  • शीर्षक 120 अक्षरों तक, संदेश 1000 तक; इमेज और आइकन के लिंक https:// से शुरू होने चाहिए
  • 3 बटन तक (लेबल 24 अक्षरों तक) और 6 सूची लाइनों तक
  • मुफ़्त प्लान में हर भेजने से पहले एक छोटा विज्ञापन चलता है
  • टेस्ट ऐप: ऐप सिलेक्टर के बगल के ट्रैश आइकन से इन्हें हटाएँ - इससे सिर्फ़ AppMint में हिस्ट्री और सेव की गई key हटती है; आपका Firebase प्रोजेक्ट वैसा ही रहता है, और रीबिल्ड करने पर ऐप वापस जुड़ जाता है
  • उसी प्रोजेक्ट की नई google-services.json के साथ रीबिल्ड करने से कुछ नहीं बदलता: आपकी key बनी रहती है, मौजूदा इंस्टॉल को संदेश मिलते रहते हैं
  • ⚠️ ऐप को किसी अलग Firebase प्रोजेक्ट में ले जाना पूरी तरह नया शुरू करना है। नई google-services.json के साथ रीबिल्ड करें, नए प्रोजेक्ट की key अपलोड करें (AppMint पुरानी हटा देता है, क्योंकि वह नए प्रोजेक्ट के लिए कभी नहीं भेज सकती थी) - और जान लें कि जिन फ़ोन पर अब भी पुराना वर्ज़न चल रहा है उन्हें तब तक संदेश नहीं मिलेंगे जब तक यूज़र अपडेट न करें। नोटिफ़िकेशन एक प्रोजेक्ट तक पहुँचते हैं, और वे इंस्टॉल अब भी पुराने प्रोजेक्ट को सुन रहे हैं
  • कम भेजें: स्पैम करने वाले ऐप को यूज़र अनइंस्टॉल कर देते हैं

19चुनें किसे भेजना है#

'Who gets it' के नीचे, संदेश Everyone (डिफ़ॉल्ट) को जाता है या आपके चुने फ़ोन को:

  • देश, भाषाएँ, Android वर्ज़न और ऐप वर्ज़न
  • Activity - पिछले N दिनों में ऐप खोला, या N दिनों से नहीं खोला
  • सिर्फ़ वे फ़ोन जहाँ नोटिफ़िकेशन चालू हैं
  • यूज़र ID और टैग जो आपके ऐप का पेज सेट करता है (अगला चरण)

भेजने से पहले, स्क्रीन दिखाती है कि आपका चुनाव कितने फ़ोन तक पहुँचता है।

भेजने के और तरीके:

  • हर फ़ोन का लोकल टाइम (When के नीचे) - जैसे हर फ़ोन की अपनी घड़ी पर 09:00, टाइम ज़ोन दर टाइम ज़ोन
  • A/B टेस्ट - एक वर्ज़न B लिखें; हर वर्ज़न ऑडियंस के एक टेस्ट हिस्से को जाता है, और आपके तय किए इंतज़ार के बाद ज़्यादा ओपन (या टैप) वाला वर्ज़न बाकी सबको भेजा जाता है
  • Daily limit per phone - एक फ़ोन को इस ऐप से एक दिन में मिलने वाले संदेशों की अधिकतम संख्या; इससे ऊपर के संदेश उस फ़ोन के लिए छोड़ दिए जाते हैं और 'skipped (daily limit)' दिखते हैं

History हर संदेश के लिए दिखाती है कि वह कितने फ़ोन को गया, कितनों में विफल रहा और कितने छोड़े गए।

⚠️ Who gets it चुनना, लोकल टाइम, A/B टेस्ट, ऑटोमेशन और रोज़ की सीमा सिर्फ़ उन फ़ोन तक पहुँचते हैं जिन पर 30 Sep 2026 या उसके बाद बना ऐप चल रहा है (वे खुद को रजिस्टर करते हैं)। पुराने बिल्ड वाले फ़ोन को अब भी 'Everyone' वाले संदेश मिलते हैं - इस तरह उन तक पहुँचने के लिए अपडेट बनाकर प्रकाशित करें।

20साइन इन यूज़र और टैग को टारगेट करें#

आपके ऐप का पेज AppMint Push को बताता है कि कौन साइन इन है और इस इंस्टॉल के बारे में क्या जानना है। फिर आप एक यूज़र को भेज सकते हैं, या plan = pro जैसे टैग वाले सभी को।

  • setPushUser - साइन-इन के बाद, आपके अपने अकाउंट id के साथ (डेटाबेस id, कभी ईमेल पता या फ़ोन नंबर नहीं)। अक्षर, अंक और _ @ . : + - (128 तक)। साइन-आउट पर इसे "" के साथ कॉल करें, वरना फ़ोन को उस यूज़र के संदेश मिलते रहेंगे
  • setPushTag / setPushTags - टैग का नाम (अक्षर, अंक और _, 32 तक) और वैल्यू (128 तक)। "" टैग हटा देता है; हर इंस्टॉल पर 50 तक
  • getPushUser / getPushTags - पढ़ें कि यह फ़ोन क्या रखता है

ID और टैग इंस्टॉल के होते हैं, अकाउंट के नहीं: साइन-आउट पर यूज़र-विशेष टैग भी हटा दें। फ़ोन बदलाव कुछ सेकंड बाद बताता है (ऑफ़लाइन हो तो अगली बार ऐप खुलने पर)। दो फ़ोन पर साइन इन किए एक ही यूज़र को दोनों पर संदेश मिलता है।

const B = window.WebToApk;

// after sign-in: your own account id
B?.setPushUser?.(user.id);
B?.setPushTag?.('plan', user.isPro ? 'pro' : 'free');
B?.setPushTags?.(JSON.stringify({ city: 'pune', level: '12' }));

// on sign-out
B?.setPushUser?.('');
B?.setPushTag?.('plan', '');

// read back
const who = B?.getPushUser?.() ?? '';
const tags = JSON.parse(B?.getPushTags?.() ?? '{}');

21ऑटोमेशन#

ऐसे संदेश जो अपने आप जाते हैं। Automations में '+ New' दबाएँ और एक चुनें:

  • Welcome - नए इंस्टॉल के N मिनट बाद (0 मिनट से 30 दिन तक)। हर फ़ोन को यह एक बार मिलता है
  • Win-back - जब कोई N दिनों (1 से 180) तक ऐप न खोले। हर अनुपस्थिति पर एक बार: जो फ़ोन लौटकर फिर दूर रहता है, उसे यह दोबारा मिलता है
  • Tag - आपके ऐप का पेज टैग सेट करने के N मिनट बाद, चाहें तो सिर्फ़ किसी एक वैल्यू के लिए। यह तभी जाता है जब समय पूरा होने पर भी टैग सेट हो

Abandoned cart: जब सामान कार्ट में जाए तो एक टैग सेट करें और चेकआउट पर उसे हटा दें। 60 मिनट की देरी वाला 'cart' ऑटोमेशन फिर सिर्फ़ उन्हें याद दिलाता है जो बिना खरीदे चले गए। वही वैल्यू दोबारा सेट करने से घड़ी दोबारा शुरू नहीं होती; टैग हटाने के बाद उसे फिर सेट करने पर एक बार और भेजा जा सकता है।

ऑटोमेशन फ़ोन की रोज़ की सीमा में गिने जाते हैं, और 30 Sep 2026 या उसके बाद बने बिल्ड वाले फ़ोन तक पहुँचते हैं।

const B = window.WebToApk;

// items added to the cart
B?.setPushTag?.('cart', 'open');

// checkout finished, or the cart emptied: no reminder
B?.setPushTag?.('cart', '');

22नोटिफ़िकेशन बंद वाले यूज़र तक पहुँचें#

जिस फ़ोन पर नोटिफ़िकेशन बंद हैं, वहाँ ट्रे में नोटिफ़िकेशन कभी नहीं दिखता - लेकिन आपका संदेश फिर भी ऐप तक पहुँचता है, और अगली बार यूज़र के ऐप खोलने पर इन-ऐप संदेश दिखता है। इसका इस्तेमाल उन्हें नोटिफ़िकेशन फिर से चालू करने को कहने के लिए करें:

  • Who gets it → Choose who → 'Notifications off' चालू करें
  • Show as → In-app only (Design में Top banner या Centre card)
  • Design → Buttons → '+ “Turn on notifications” button'। इसका लिंक appmint://notifications/enable है: टैप करने पर अनुमति का प्रॉम्प्ट दिखता है, या जब प्रॉम्प्ट अब नहीं दिखाया जा सकता तब ऐप की नोटिफ़िकेशन सेटिंग्स खुलती हैं

जब ऐप के कुछ फ़ोन में नोटिफ़िकेशन बंद हों, तो सेंड सेंटर Firebase key के नीचे 'Reach the N phones with notifications off' दिखाता है - एक टैप तीनों सेट कर देता है। जैसे ही कोई यूज़र नोटिफ़िकेशन चालू करता है, उसका फ़ोन उस ऑडियंस से बाहर हो जाता है।

बटन के लिए AppMint के इस या नए वर्ज़न से बना ऐप चाहिए; पुराने बिल्ड लिंक को आम लिंक की तरह लेते हैं। appmint://notifications/settings सीधे सेटिंग्स स्क्रीन खोलता है।

// Your page can offer the same thing itself:
const r = await window.AppMint?.enableNotifications?.();
// r = { state: 'granted' | 'prompt' | 'blocked' | 'unavailable',
//       changed, openedSettings }

// and hear a push button's result too:
window.addEventListener('appmint:notifications', e => {
  if (e.detail.state === 'granted') hideNotifBanner();
});

23इन-ऐप संदेश#

इन-ऐप संदेश वे कैंपेन हैं जो आप सेंड सेंटर में बनाते हैं: Push Notifications → 'In-app messages' → '+ New'। ऐप इन्हें डाउनलोड करके खुद दिखाता है, बिना किसी पुश के, जब आपका चुना हुआ ट्रिगर होता है:

  • App opens - N-वीं बार ऐप खुलना
  • कोई पेज या route (/checkout, #/cart, /product/*)
  • Time in app - ऐप में N सेकंड
  • आपके पेज द्वारा ट्रैक किया गया इवेंट (अगला चरण)
  • एक पुश टैग
  • नोटिफ़िकेशन बंद हैं - इसके साथ 'Turn on notifications' बटन दें
  • App update - अपडेट के बाद पहली बार खोलना

इसे बैनर, मोडल, शीट या फ़ुल स्क्रीन के रूप में दिखाएँ। हर संदेश की एक फ़्रीक्वेंसी होती है (डिफ़ॉल्ट: हर इंस्टॉल पर एक बार), एक वैकल्पिक ऑडियंस और वैकल्पिक शुरू व खत्म होने का समय। इसके लिए बिल्ड में AppMint Push चाहिए।

24ऐप को बताएँ कि क्या हुआ#

आपके पेज का हिस्सा छोटा है: ज़रूरी पलों को trackEvent से बताएँ। जिस संदेश का ट्रिगर 'When an event happens' है और नाम वही है, वह अभी (या आपके चुने इंतज़ार के बाद) दिखता है। नाम: अक्षर, अंक और _ . : - (64 तक)। इवेंट कहीं गिने या सेव नहीं होते; वे सिर्फ़ तय करते हैं कि संदेश दिखे या नहीं।

Route संदेश असली URL बदलावों (पेज लोड, pushState, #hash route) को खुद फ़ॉलो करते हैं। जो व्यू पते में नहीं दिखता (टैब, विज़ार्ड का चरण) उसे appmint:route इवेंट से route के रूप में बताया जा सकता है।

if (window.AppMint && AppMint.trackEvent) AppMint.trackEvent('checkout_done', { total: 42 });

// raw bridge: props as a JSON string ('' for none)
WebToApk.trackEvent('level:3', '');

// a view the address does not show, reported as a route
window.dispatchEvent(new CustomEvent('appmint:route', { detail: { path: '/cart' } }));

25संदेश खुद दिखाएँ (वैकल्पिक)#

हर संदेश appmint:inapp को { type: 'shown' | 'clicked' | 'dismissed', id, name } के साथ उठाता है (और अगर आपने window.onAppMintInApp(detail) परिभाषित किया है तो उसे कॉल करता है)।

संदेश खुद दिखाने के लिए WebToApk.setInAppPresentation('none') कॉल करें: तब ऐप कुछ नहीं बनाता और 'shown' इवेंट में presented: false और संदेश (शीर्षक, बॉडी, इमेज, बटन) आता है। setInAppPresentation('auto') दिखाने का काम वापस ऐप को दे देता है। WebToApk.getInAppCampaigns() बताता है कि इस इंस्टॉल के पास क्या है ([{id, name}])।

यह सब बिल्ड में AppMint Push होने पर ही चलता है; किसी और बिल्ड में ये तरीके false / "[]" लौटाते हैं।

window.addEventListener('appmint:inapp', e => {
  // e.detail = { type: 'shown' | 'clicked' | 'dismissed', id, name, presented?, message? }
  if (e.detail.type === 'shown' && e.detail.presented === false) drawMyBanner(e.detail.message);
});

WebToApk.setInAppPresentation('none');   // 'auto' gives drawing back to the app
const held = JSON.parse(WebToApk.getInAppCampaigns() || '[]');   // [{id, name}]

26टेम्पलेट से शुरू करें#

'+ New' तैयार संदेशों की गैलरी खोलता है, हर एक लाइव प्रीव्यू के साथ जिसे आप लेआउट से खोज या फ़िल्टर कर सकते हैं: Welcome, Rate us, Turn on notifications, What's new, Flash sale (लाइव काउंटडाउन के साथ), Seasonal promo, New feature, Update available, Abandoned cart, Win back, Star survey, NPS score, Invite friends, Subscription offer, Streak, Tip, Permission explainer, Maintenance (बंद करने तक रहता है), Terms update (बंद करने का बटन नहीं) और Follow us। टेम्पलेट लेआउट, इमोजी या तस्वीर, टेक्स्ट, बटन, ट्रिगर और फ़्रीक्वेंसी भर देता है - सेव करने से पहले कुछ भी बदलें। 'Blank message' खाली शुरू होता है।

Star survey, Rate us और NPS एक सवाल पूछते हैं: 1-5 स्टार की पंक्ति या 0-10 का स्कोर। पहला बटन जवाब का इंतज़ार करता है; जवाब संदेश बंद होने पर एक बार appmint:inapp 'answered' इवेंट { value, question } के रूप में बताया जाता है, और सेंड सेंटर औसत स्टार या NPS स्कोर को बँटवारे के साथ दिखाता है।

बटन लिंक appmint://review (Google Play की रिव्यू शीट), share:text (शेयर शीट), copy:text (क्लिपबोर्ड), route:/page और event:name भी हो सकते हैं। टेक्स्ट में {app}, {store}, {name}, {streak} और {tag:key} इस्तेमाल हो सकते हैं, जो हर फ़ोन पर भरे जाते हैं; {name|friend} तब के लिए एक शब्द देता है जब कोई वैल्यू न हो। जिस संदेश के प्लेसहोल्डर की वैल्यू नहीं है, वह नहीं दिखाया जाता। इसके लिए इस या नए वर्ज़न से बना ऐप चाहिए।

window.addEventListener('appmint:inapp', e => {
  const d = e.detail;
  if (d.type === 'answered') {
    // d.question: 'stars' (1-5) or 'nps' (0-10); d.template e.g. 'survey_stars'
    if (d.question === 'nps' && d.value <= 6) openFeedbackForm();
  }
  if (d.type === 'clicked' && d.link === 'event:allow') askForLocation();
});

// {streak} and {tag:key} come from push tags
WebToApk.setPushTag('streak', '7');

यह पेज ऐप के अंदर की इंटीग्रेशन गाइड से बनाया गया है, इसलिए इसमें वही लिखा है जो मौजूदा बिल्ड में है। इसे Markdown में पढ़ें.

2026-10-03 को शिप की गई गाइड से मिलान किया गया।