Hi,
I’m implementing team subscriptions where an admin has a normal auto-renewing subscription, and team members receive a promotional entitlement that expires at the same time as the admin’s current period.
On renewal, I try to extend the members’ entitlement by calling the V1 “grant promotional entitlement” endpoint again with a new end_time_ms.
const url = `https://api.revenuecat.com/v1/subscribers/${encodeURIComponent(appUserId)}/entitlements/${encodeURIComponent(entitlementId)}/promotional`;
const response = await fetch(
url,
{
method: 'POST',
headers: {
Authorization: `Bearer ${revenueCatApiKey.value()}`,
'Content-Type': 'application/json',
},
body: JSON.stringify(
{
end_time_ms: endsAtMs,
}
),
}
);
Response:
{
insertId: "699397e5000ee469665d0539"
jsonPayload: {
appUserId: "okolifiqPsTzY10TRV9yA627o3w2"
endsAtMs: 1771281961210
entitlementId: "Team Pro Access"
expiresAt: "2026-02-16T22:46:01.210Z"
message: "rc:grant_entitlement_success"
responseBody: {
request_date: "2026-02-16T22:19:17Z"
request_date_ms: 1771280357932
subscriber: {
entitlements: {
Team Pro Access: {
expires_date: "2026-02-16T21:46:01Z"
product_identifier: "rc_promo_Team Pro Access_custom"
purchase_date: "2026-02-16T21:19:05Z"
}
}
first_seen: "2026-02-12T20:10:28Z"
last_seen: "2026-02-13T20:12:45Z"
non_subscriptions: {
0
}
original_app_user_id: "okolifiqPsTzY10TRV9yA627o3w2"
other_purchases: {
0
}
subscriptions: {
rc_promo_Team Pro Access_custom: {
expires_date: "2026-02-16T21:46:01Z"
is_sandbox: false
original_purchase_date: "2026-02-16T21:19:05Z"
period_type: "normal"
price: {
2
}
purchase_date: "2026-02-16T21:19:05Z"
store: "promotional"
store_transaction_id: "1bbdbf1ab911a470fca79c2876ad6d64"
}
}
}
status: 201
}
-
The API returns 201.
-
However, the entitlement expiration sometimes remains at the previous value.
-
After the old expiration passes, the member loses access.
-
This seems more frequent when the new expiration is close to the current one (tested only sandbox).
Questions:
-
Is it officially supported to “extend” an already active promotional entitlement by calling the grant endpoint again with a later
end_time_ms? -
Are there timing limitations when the new expiration is close to the existing expiration?
-
Is the recommended approach for team subscriptions instead to grant lifetime promo entitlements and only revoke on admin subscription loss?
I want to confirm whether syncing member entitlements to each renewal via end_time_ms is a supported production-safe pattern, or if this is expected behavior.
Thanks.
