ऐप रिव्यू क्वालिटी की शर्तें
Stripe मार्केटप्लेस में सबमिट किए गए हर ऐप की जाँच क्वालिटी शर्तों के एक विस्तृत सेट के आधार पर करता है. डेवलपमेंट शुरू करने से पहले इन मानकों को समझ लेने से समय बचता है और रिव्यू के चक्कर कम लगते हैं.
ओवरव्यू
Stripe ऐप रिव्यू आपके ऐप को छह मुख्य क्षेत्रों में परखता है:
- पारदर्शी प्राइसिंग, लागत की साफ़ जानकारी
- ऐप की कार्यक्षमता, भरोसेमंदी और पूर्णता
- डेवलपर मानक, कोड क्वालिटी और API का इस्तेमाल
- UX क्वालिटी, यूज़र इंटरफ़ेस और अनुभव के मानक
- सुरक्षा, डेटा सुरक्षा और सुरक्षित तौर-तरीक़े
- क़ानूनी अनुपालन, प्राइवेसी और नियामक शर्तें
पारदर्शी प्राइसिंग
आपके ऐप को यूज़र्स को हर लागत साफ़-साफ़ बतानी होगी:
- प्राइसिंग की जानकारी: सारी कीमतें मार्केटप्लेस लिस्टिंग में पहले ही बतानी होंगी
- कोई छिपी हुई फ़ीस नहीं: इंस्टॉल करने के बाद यूज़र्स को अनपेक्षित शुल्क नहीं दिखने चाहिए
- ट्रायल की शर्तें: अगर आप ट्रायल दे रहे हैं, तो उसकी अवधि और ख़त्म होने के बाद क्या होगा, यह साफ़ बताएं
- अपग्रेड फ़्लो: कोई भी अपसेल या अपग्रेड प्रॉम्प्ट दख़लंदाज़ी वाला न हो और साफ़ तौर पर वैकल्पिक हो
- करेंसी: जहाँ संभव हो, कीमतें यूज़र की स्थानीय करेंसी में दिखाएं
Caution
जो ऐप्स प्राइसिंग छिपाते हैं या साफ़ सहमति के बिना यूज़र्स से पैसे लेते हैं, उन्हें तुरंत रिजेक्ट कर दिया जाता है.
तारीख़ और समय का फ़ॉर्मेट
आपके ऐप में दिखने वाली सभी तारीख़ें और समय Stripe Dashboard की परंपराओं के अनुसार होने चाहिए:
- जहाँ उपलब्ध हो, तारीख़ के फ़ॉर्मेट के लिए यूज़र की लोकेल इस्तेमाल करें
- समय यूज़र के स्थानीय टाइमज़ोन में दिखाएं
- हाल के इवेंट के लिए सापेक्ष टाइमस्टैम्प इस्तेमाल करें (जैसे “2 घंटे पहले”)
- पुराने इवेंट के लिए पूरी तारीख़ और समय के साथ निरपेक्ष टाइमस्टैम्प इस्तेमाल करें
- API से जुड़े किसी भी तारीख़ फ़ील्ड के लिए ISO 8601 का पालन करें
// Good: Use Stripe's date formatting utilitiesimport { formatDate, formatRelativeTime } from '@stripe/ui-extension-sdk/utils';
const formattedDate = formatDate(timestamp); // Locale-awareconst relativeTime = formatRelativeTime(timestamp); // "2 hours ago"ऐप सेटिंग्स
अगर आपके ऐप को कॉन्फ़िगरेशन की ज़रूरत है:
- ऐप के व्यूपोर्ट से खुलने वाला एक अलग सेटिंग्स व्यू दें
- जहाँ संभव हो, समझदारी भरी डिफ़ॉल्ट वैल्यू पहले से भर दें
- यूज़र के हर इनपुट की जाँच करें और साफ़ एरर मैसेज दिखाएं
- यूज़र्स को ऐप दोबारा इंस्टॉल किए बिना सेटिंग्स बदलने दें
- Stripe Secret Store API के ज़रिए सेटिंग्स को सेशन के बाद भी सुरक्षित रखें
सैंडबॉक्स सपोर्ट
आपके ऐप को Stripe के सैंडबॉक्स (टेस्ट) मोड में सही तरह काम करना चाहिए:
- टेस्ट मोड अनुकूलता: सभी फ़ीचर टेस्ट मोड में काम करने चाहिए
- टेस्ट डेटा: ऐसा वास्तविक जैसा टेस्ट डेटा इस्तेमाल करें जो ऐप की कार्यक्षमता दिखाए
- सैंडबॉक्स में लाइव डेटा नहीं: टेस्ट मोड में प्रोडक्शन डेटा कभी न दिखाएं
- शालीन व्यवहार: अगर कोई फ़ीचर सैंडबॉक्स में उपलब्ध नहीं है, तो साफ़ मैसेज में उसकी वजह बताएं
- अपने मैनिफ़ेस्ट में
sandbox_install_compatible: trueसेट करें
{ "sandbox_install_compatible": true}ऐप की कार्यक्षमता
भरोसेमंदी
- सामान्य इस्तेमाल के दौरान ऐप क्रैश या फ़्रीज़ नहीं होना चाहिए
- जिन फ़ीचर्स का प्रचार किया गया है, वे सब वैसे ही काम करने चाहिए
- नेटवर्क एरर को शालीनता से संभालना चाहिए और रीट्राई का विकल्प देना चाहिए
- बैकग्राउंड ऑपरेशन के दौरान भी ऐप रिस्पॉन्सिव रहना चाहिए
पूर्णता
- कोई प्लेसहोल्डर कंटेंट, “जल्द आ रहा है” वाले फ़ीचर या टूटे हुए लिंक नहीं
- सभी UI एलिमेंट काम करने चाहिए, कोई निष्क्रिय बटन या बंद कंट्रोल नहीं
- हेल्प टेक्स्ट और डॉक्युमेंटेशन लिंक सही पेज पर खुलने चाहिए
- अनइंस्टॉल करने पर ऐप का सारा डेटा और वेबहुक साफ़-सुथरे तरीक़े से हट जाने चाहिए
परफ़ॉर्मेंस
- सामान्य कनेक्शन पर UI 3 सेकंड के भीतर रेंडर होना चाहिए
- बैकग्राउंड सिंक ऑपरेशन से UI रुकना नहीं चाहिए
- बड़े डेटा सेट के लिए पेजिनेशन या लेज़ी लोडिंग इस्तेमाल करें
- रेट लिमिट से बचने के लिए API कॉल कम से कम रखें
डेवलपर मानक
API का इस्तेमाल
- Stripe API का नवीनतम स्थिर वर्शन इस्तेमाल करें
- पेजिनेशन, एरर हैंडलिंग और आइडेम्पोटेंसी के लिए Stripe API की बेस्ट प्रैक्टिस अपनाएं
- रेट लिमिट से आगे न जाएं, रीट्राई के लिए एक्सपोनेंशियल बैकऑफ़ लागू करें
- पोलिंग की जगह इवेंट-आधारित अपडेट के लिए वेबहुक इस्तेमाल करें
कोड क्वालिटी
- प्रोडक्शन बिल्ड में कोई कंसोल एरर या चेतावनी नहीं होनी चाहिए
- सबमिट करने से पहले सारी डीबग लॉगिंग हटा दें
- हर किनारे के मामले को संभालें (ख़ाली स्टेट, ग़ायब डेटा, नेटवर्क फ़ेल्योर)
- एक जैसे UI के लिए Stripe की कंपोनेंट लाइब्रेरी के पैटर्न अपनाएं
वर्शनिंग
- सिमैंटिक वर्शनिंग इस्तेमाल करें (MAJOR.MINOR.PATCH)
- वर्शन अपडेट में ब्रेकिंग चेंज का दस्तावेज़ीकरण करें
- जहाँ संभव हो, पुराने वर्शन के साथ अनुकूलता बनाए रखें
UX क्वालिटी
विज्ञापन
- कोई विज्ञापन नहीं: आपका ऐप किसी भी तरह के विज्ञापन नहीं दिखा सकता
- कोई क्रॉस-प्रमोशन नहीं: ऐप UI में दूसरे प्रोडक्ट या सेवाओं का प्रचार न करें
- ब्रांडेड कंटेंट: सिर्फ़ अपनी ब्रांड पहचान दिखाएं, थर्ड-पार्टी ब्रांड नहीं (Brevo जैसे इंटीग्रेशन पार्टनर को छोड़कर)
भाषा और कंटेंट
- एक जैसी भाषा: पूरे ऐप में एक जैसी शब्दावली इस्तेमाल करें
- पेशेवर लहजा: Stripe Dashboard की पेशेवर और संक्षिप्त शैली से मेल खाएं
- कोई तकनीकी शब्दजाल नहीं: ऐसे तकनीकी शब्दों से बचें जो मर्चेंट को समझ न आएं
- वर्तनी जाँच: पक्का करें कि पूरे टेक्स्ट में कोई वर्तनी या व्याकरण की ग़लती न हो
- सिर्फ़ अंग्रेज़ी: मार्केटप्लेस ऐप्स में यूज़र को दिखने वाला सारा टेक्स्ट अंग्रेज़ी में होना चाहिए
पुष्टि वाले डायलॉग
नुक़सानदेह या अहम कार्रवाइयों के लिए यूज़र से पुष्टि लें:
// Good: Confirm before destructive actionsconst handleDisconnect = async () => { const confirmed = await showConfirmation({ title: 'Disconnect Brevo Integration', message: 'This will stop syncing customer data to Brevo. You can reconnect at any time.', confirmLabel: 'Disconnect', cancelLabel: 'Cancel', destructive: true, });
if (confirmed) { await disconnectIntegration(); }};जिन कार्रवाइयों के लिए पुष्टि ज़रूरी है:
- इंटीग्रेशन डिसकनेक्ट करना
- सिंक किया हुआ डेटा डिलीट करना
- डेटा फ़्लो पर असर डालने वाली सेटिंग्स बदलना
- कॉन्फ़िगरेशन को डिफ़ॉल्ट पर रीसेट करना
लोडिंग स्टेट
एसिंक्रोनस ऑपरेशन के लिए हमेशा लोडिंग इंडिकेटर दिखाएं:
// Good: Show loading state during data fetchconst CustomerSyncStatus = () => { const { data, isLoading, error } = useSyncStatus();
if (isLoading) { return <Spinner label="Loading sync status..." />; }
if (error) { return <Banner type="critical" title="Failed to load sync status"> {error.message} </Banner>; }
return <SyncStatusDisplay data={data} />;};शर्तें:
- डेटा लोड होते समय स्पिनर या स्केलेटन स्क्रीन दिखाएं
- फ़ॉर्म सबमिट होते समय बटन निष्क्रिय कर दें
- लंबे चलने वाले ऑपरेशन के लिए प्रोग्रेस इंडिकेटर दिखाएं
- लोड होते समय कभी ख़ाली स्क्रीन न दिखाएं
एरर मैसेज
साफ़ और काम के एरर मैसेज दें:
// Bad: Generic error"Something went wrong"
// Good: Specific and actionable"Unable to sync customer data to Brevo. Please verify your Brevo API keyin Settings and try again."एरर मैसेज के दिशानिर्देश:
- सरल भाषा में बताएं कि क्या हुआ
- समस्या हल करने के लिए यूज़र कौन सा ठोस क़दम उठा सकता है, यह सुझाएं
- फ़ेल हुए ऑपरेशन को दोबारा आज़माने का तरीक़ा दें
- डीबगिंग के लिए विस्तृत एरर जानकारी लॉग करें (यूज़र को न दिखाएं)
- जहाँ लागू हो, सपोर्ट के संदर्भ के लिए एरर कोड शामिल करें
सुरक्षा
Secret Store API
संवेदनशील डेटा को स्टोर करने के लिए हमेशा Stripe का Secret Store API इस्तेमाल करें:
import { createHttpClient, STRIPE_API_KEY } from '@stripe/ui-extension-sdk/http_client';
// Good: Store secrets using the Secret Store APIconst storeBrevoApiKey = async (apiKey: string) => { const stripe = createHttpClient(STRIPE_API_KEY); await stripe.apps.secrets.create({ name: 'brevo_api_key', payload: apiKey, scope: { type: 'account' }, });};
// Good: Retrieve secrets from the Secret Storeconst getBrevoApiKey = async () => { const stripe = createHttpClient(STRIPE_API_KEY); const secret = await stripe.apps.secrets.find({ name: 'brevo_api_key', scope: { type: 'account' }, }); return secret.payload;};संवेदनशील डेटा कभी इनमें न रखें:
- लोकल स्टोरेज या सेशन स्टोरेज
- कुकीज़
- URL पैरामीटर
- सोर्स कोड में हार्डकोड की गई वैल्यू
- सादे टेक्स्ट वाली कॉन्फ़िगरेशन फ़ाइलें
क्रिप्टोग्राफ़ी
- अपनी क्रिप्टोग्राफ़ी नहीं: अपने ख़ुद के एन्क्रिप्शन एल्गोरिदम न बनाएं
- Stripe की अंतर्निहित सुरक्षा सुविधाएँ इस्तेमाल करें (Secret Store, साइनिंग सीक्रेट)
- सभी बाहरी API कॉल के लिए HTTPS इस्तेमाल करें
- प्रोसेस करने से पहले हर वेबहुक सिग्नेचर की जाँच करें
डेटा संभालना
- सिर्फ़ वही अनुमतियाँ मांगें जिनकी आपके ऐप को सचमुच ज़रूरत है
- कार्यक्षमता के लिए जितना ज़रूरी है, उससे ज़्यादा Stripe डेटा स्टोर न करें
- अपनी प्राइवेसी पॉलिसी के अनुरूप डेटा रिटेंशन नीतियाँ लागू करें
- यूज़र्स को डेटा डिलीट करने का अनुरोध करने का तरीक़ा दें
क़ानूनी अनुपालन
प्राइवेसी पॉलिसी
आपके ऐप की एक सार्वजनिक रूप से उपलब्ध प्राइवेसी पॉलिसी होनी चाहिए, जिसमें यह शामिल हो:
- आपका ऐप Stripe से कौन सा डेटा इकट्ठा करता है
- वह डेटा कैसे स्टोर, प्रोसेस और साझा किया जाता है
- डेटा रिटेंशन और डिलीशन की नीतियाँ
- अपने डेटा को लेकर यूज़र्स के अधिकार
- प्राइवेसी से जुड़े सवालों के लिए संपर्क जानकारी
- लागू नियमों का पालन (GDPR, CCPA, आदि)
सेवा की शर्तें
- अपने ऐप के लिए साफ़ सेवा शर्तें दें
- ऐसी शर्तें शामिल न करें जो Stripe की सेवा शर्तों से टकराती हों
- इस्तेमाल की कोई भी सीमा या पाबंदी साफ़ बताएं
नियामक अनुपालन
- सभी लागू डेटा सुरक्षा नियमों का पालन करें
- उपयुक्त डेटा प्रोसेसिंग समझौते लागू करें
- डेटा पोर्टेबिलिटी और डिलीशन के अनुरोधों का समर्थन करें
- डेटा एक्सेस और प्रोसेसिंग के लिए ऑडिट लॉग बनाए रखें
रिव्यू प्रक्रिया की समय-सीमा
| चरण | अवधि |
|---|---|
| पहला सबमिशन | 5-10 कार्य दिवस |
| संशोधन का रिव्यू | 3-7 कार्य दिवस |
| अंतिम मंज़ूरी | 1-2 कार्य दिवस |
| प्रकाशन | मंज़ूरी के तुरंत बाद |
Tip
बार-बार रिव्यू के चक्कर से बचने के लिए रिव्यू में मिले सारे फ़ीडबैक को एक ही संशोधन में ठीक करें. Stripe की टीम हर समस्या के लिए ठोस और काम का फ़ीडबैक देती है.
रिजेक्ट होने की आम वजहें
- एरर हैंडलिंग नहीं है, नेटवर्क एरर या अनपेक्षित डेटा पर ऐप क्रैश हो जाता है
- लोडिंग स्टेट अधूरे हैं, डेटा लोड होते समय ख़ाली स्क्रीन दिखती है
- प्राइसिंग साफ़ नहीं है, लिस्टिंग में पूरी कीमत नहीं बताई गई
- ज़रूरत से ज़्यादा अनुमतियाँ, ऐसी अनुमतियाँ मांगना जो ऐप को चाहिए ही नहीं
- सैंडबॉक्स मोड काम नहीं करता, ऐप टेस्ट मोड में नहीं चलता
- सुरक्षा से जुड़ी समस्याएँ, सीक्रेट को Secret Store API के बाहर रखना
- प्राइवेसी पॉलिसी नहीं है, कोई उपलब्ध प्राइवेसी पॉलिसी URL नहीं
- अधूरी कार्यक्षमता, “जल्द आ रहा है” वाले फ़ीचर या प्लेसहोल्डर कंटेंट