Expo InAppPurchases connectAsync returns undefined

I’m having issues trying to get the InAppPurchases to work in my React Native app using Expo. https://docs.expo.io/versions/latest/sdk/in-app-purchases

This is a bare workflow app that I ejected from a standard Expo app.

I made sure to follow the install instructions here carefully: https://docs.expo.io/bare/installing-unimodules/

I did test if unimodules was properly installed:

import { Constants } from "react-native-unimodules";
useEffect(() => {
  alert("installed: " + JSON.stringify(Constants.systemFonts));
}, []);

The code above worked.

I’m using react-native-unimodules version 0.11.0.

Here’s my code:

useEffect(() => {
	(async function init() {
		try {
			const connect_res = await connectAsync();
			alert("connect: " + JSON.stringify(connect_res));
		} catch (err) {
				alert("general error for connect async: " + err);
}, []);

This is in the App.js entrypoint file. It always returns undefined for the connect_res so I assume this is the reason why I couldn’t get any of the code to work.

Just below connectAsync() I have the following. This one also doesn’t return anything:

setPurchaseListener(({ responseCode, results, errorCode }) => {

	if (responseCode === IAPResponseCode.OK) {
		results.forEach((purchase) => {
			if (!purchase.acknowledged) {
				alert("purchase successful!");
				finishTransactionAsync(purchase, true);

	if (responseCode === IAPResponseCode.USER_CANCELED) {
		alert("user cancelld!");
	} else if (responseCode === IAPResponseCode.DEFERRED) {
		alert("user does not have permission to buy");
	} else {
		alert("something went wrong: " + errorCode);

Then on my payment screen I have the following:

import { getProductsAsync, purchaseItemAsync } from "expo-in-app-purchases";

This is the code for the payment button:

const makePayment = async () => {
	alert("now making payment...");
	try {
		const items = Platform.select({
			ios: ["abc"],
			android: ["my-sub-id", "sku-my-sub-id"],

		alert("items: " + JSON.stringify(items));

		const products = await getProductsAsync(items);
		alert("products: " + JSON.stringify(products));

		if (products.results.length > 0) {
			alert("found products!");
			await purchaseItemAsync("my-sub-id");
			alert("done making payment!");
		} else {
			alert("no products..");
	} catch (err) {
		alert("error occured while trying to purchase: " + err);

In this case, getProductsAsync() does return something resembling the format the results should be. But it doesn’t return any of the subscriptions I created (I copied the product ID value listed in that column and I supplied it to both getProductsAsync and purchaseItemAsync. I also supplied the url version which basically just has a prefix of sku-:

enter image description here

I also enabled licensing testing for the email I’m using in Google Play.

Do note that I’m uploading the .aab file to Google Play on the internal testing track then I install it using this URL format: https://play.google.com/apps/test/com.myname.appname/versionNumber

But when I open that link, it seems like google play is detecting it as an old version even though its the latest one. The changes I’ve made shows up though so I’m pretty sure that’s the correct install URL.

What else could I be missing?

I am facing that same issue. Have you found a workaround?