Our Paywalls V2 paywall uses three icon components (checkmark, X, and lock). On every paywall render, the SDK tries to download them and gets HTTP 403 — for essentially every user, on every app version. The paywall itself works (icons presumably fall back / don't render), but each render produces 3 failed requests, which floods our error monitoring (New Relic records them as MobileRequestError — we see ~1,150/week).
Environment
- react-native-purchases / react-native-purchases-ui 10.4.1 (issue was also present on older versions)
- Expo SDK 56, Android (okhttp/4.12.0 does the fetch, so this is the native Android paywall engine)
- Paywalls V2, icons selected in the dashboard paywall editor
Failing URLs
https://icons.pawwalls.com/lock-code.webp
https://icons.pawwalls.com/x.webp
https://icons.pawwalls.com/check.webp
Reproduction — fails from anywhere, not just devices:
curl -i 'https://icons.pawwalls.com/check.webp' -H 'user-agent: okhttp/4.12.0'
Response:
HTTP/2 403
content-type: application/xml
server: AmazonS3
x-cache: Error from cloudfront
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message>
<RequestId>GZH30QRDG7MRYC21</RequestId></Error>
So this is not a client/SDK bug per se: CloudFront is returning an S3 AccessDenied, meaning the objects are missing or private in the origin bucket, while published paywall configs still reference these URLs. (S3 returns 403 instead of 404 when the requester lacks list permission, so these may simply be deleted objects.)
Questions
1. Can you restore these icon assets on the CDN (or fix the bucket policy)? That would immediately fix all published paywalls referencing them.
2. If these icons are deprecated, why does the paywall editor still produce configs referencing them — and is our only option to manually re-select every icon component and re-publish?
3. Is there a recommended way to stop the SDK from retrying known-dead assets on every render? The repeated failed requests pollute APM/error tooling that auto-instruments HTTP.
Happy to provide our app ID / paywall ID privately if useful.
