eduardweb.
Expo & EASAvansat#react-native#android#revenuecat#ios#expo-eas

Setup-ul de In-App Purchases în Expo cu RevenueCat: Cum să nu-ți pierzi mințile între Apple și Google

De Elisabeta Stan, 7 iul. 2026 · 12 vizualizări · 2 like-uri

Postat 7 iul. 2026
typescript
import { useEffect } from 'react';
import { Platform } from 'react-native';
import Purchases, { PurchasesPackage } from 'react-native-purchases';

const API_KEYS = {
  apple: 'appl_xxxxxxxxxxxxxxxxxxxxxx',
  google: 'goog_xxxxxxxxxxxxxxxxxxxxxx'
};

export const useRevenueCat = () => {
  useEffect(() => {
    const init = async () => {
      Purchases.setLogLevel(Purchases.LOG_LEVEL.DEBUG);
      
      if (Platform.OS === 'ios') {
        await Purchases.configure({ apiKey: API_KEYS.apple });
      } else if (Platform.OS === 'android') {
        await Purchases.configure({ apiKey: API_KEYS.google });
      }
    };
    init().catch(console.error);
  }, []);

  const purchasePackage = async (pack: PurchasesPackage) => {
    try {
      const { customerInfo } = await Purchases.purchasePackage(pack);
      if (customerInfo.entitlements.active['pro_access'] !== undefined) {
        return true; // Utilizatorul are acum acces PRO
      }
    } catch (e: any) {
      if (!e.userCancelled) {
        console.error('Eroare la achiziție:', e);
      }
    }
    return false;
  };

  return { purchasePackage };
};

Am integrat abonamente în React Native de pe vremea când trebuia să faci link manual la biblioteci native în Xcode și să te rogi la fiecare build de producție să nu crape compilarea. Era un coșmar fiscal și tehnic. Cu Expo EAS și RevenueCat, viața a devenit mult mai simplă, dar setup-ul magazinelor (Apple App Store și Google Play) rămâne un labirint birocratic în care e ușor să te pierzi.

Dacă ai de implementat paywall-uri și tier-uri de abonamente într-o aplicație Expo, treci direct prin pașii de mai jos ca să scutești vreo trei zile de debugging inutil.

De ce RevenueCat și care e costul real

Poți să-ți scrii propria validare de receipt-uri pe serverul tău? Sigur că da. Dar între tratarea cazurilor de refund, perioade de grație, upgrade-uri, downgrade-uri și schimbările constante de API de la Apple și Google, o să pierzi sute de ore de development.

RevenueCat rezolvă asta, dar vine cu un trade-off sincer: te costă 1% din veniturile procesate după ce treci de pragul de 10.000 USD pe lună. La un proiect recent cu 8k useri activi, acel procent s-a tradus în vreo 40 de dolari plătiți către ei. Pentru mine, a meritat fiecare cent, fiindcă am salvat cel puțin două săptămâni de backend engineering.

Trebuie să știi de la început: nu poți testa in-app purchases în Expo Go. Ai nevoie de un development build nativ rulat pe un dispozitiv real sau simulator configurat corect. Generează build-ul cu npx eas build --profile development înainte de a scrie prima linie de cod.

Configurarea magazinelor: Unde se ascunde diavolul

Setup-ul în consolele de developeri e partea cea mai frustrantă.

La Apple, ai nevoie de un Shared Secret din App Store Connect. Deși StoreKit 2 funcționează mult mai bine acum, sandbox-ul Apple are momente când dă timeout aiurea (celebrele erori 504). Nu te panica, de obicei sunt serverele lor, nu codul tău.

La Google Play, birocrația e și mai mare. Ai nevoie de un Service Account în Google Cloud Console, pe care să-l legi de Google Play Console cu permisiuni financiare. Am pățit la un proiect să uit să dau publish la o versiune de „Internal Testing” în Google Play. Rezultatul? API-ul de billing îmi returna „Item not available for purchase” și am pierdut o după-amiază întreagă căutând bug-uri în cod, când problema era pur administrativă în consolă.

În RevenueCat, structura e simplă dar rigidă:

  1. Products: Maparea 1:1 cu ID-urile din App Store și Google Play.
  2. Packages: Modul în care prezinți produsele (ex: lunar, anual).
  3. Entitlements: Ce deblochează efectiv acel pachet (ex: pro_features).

Cum testezi fără să arunci laptopul pe geam

Testarea pe iOS se face cu un cont de Sandbox Tester creat în App Store Connect. Sfat util: pe iOS 14+, poți reseta istoricul de achiziții direct din setările telefonului (Settings -> App Store -> Sandbox Account), fără să mai fii nevoit să creezi zece adrese de mail fictive.

Pe Android, adaugă adresa de Gmail a testerului în secțiunea „License Testing” din Google Play Console. Altfel, Google te va taxa real când apeși pe butonul de cumpărare în build-ul de test.

Un detaliu important: în sandbox, timpul este accelerat. Un abonament lunar expiră în 5 minute pe iOS și în 24 de ore pe Android. E excelent pentru a testa logica de expirare și reactivare a accesului în aplicație, dar fii pregătit pentru multe log-uri de webhook în dashboard-ul RevenueCat.

Voi ce folosiți pentru monetizare în Expo? Mergeți pe varianta custom cu server propriu sau preferați să lăsați 1% la RevenueCat ca să dormiți liniștiți noaptea?

Răspunsuri 0

Se încarcă răspunsurile…

Loghează-te pentru a răspunde

Doar membrii comunității pot lăsa comentarii.