Prisma Reviews / Guides / App review alerts in Discord
App Store, Google Play and Steam review alerts in Discord
Game studios and indie app developers often run the team, and the community, on Discord. A channel that shows every new store review the minute it lands keeps everyone close to what players say: the crash in 4.2 on Android 15, the paywall complaint in Germany, the 5-star from a long-time player. Apple, Google and Valve don’t post to Discord, so this guide connects them: a Prisma webhook per new review (App Store, Google Play, Steam, Microsoft Store, AppGallery and more), and a Discord channel webhook that renders it as an embed. About 30 lines of Python.
pip install flask requests1. Create the Discord webhook
Channel settings → Integrations → Webhooks → New Webhook, name it “Reviews”, copy the URL. Keep it secret: anyone with it can post to the channel.
2. Receive the review and post an embed
import hashlib, hmac, os, time, requests
from flask import Flask, request, abort
app = Flask(__name__)
PRISMA = "https://api.prismareviews.com/v1"
PH = {"Authorization": f"Bearer {os.environ['PRISMA_API_KEY']}"}
DISCORD = os.environ["DISCORD_WEBHOOK_URL"]
COLORS = {1: 0xE5484D, 2: 0xF76B15, 3: 0xFFC53D, 4: 0x46A758, 5: 0x30A46C}
def verify(raw: bytes, header: str) -> bool:
parts = dict(p.split("=", 1) for p in header.split(","))
expected = hmac.new(os.environ["PRISMA_WEBHOOK_SECRET"].encode(), f"{parts['t']}.".encode() + raw, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, parts["v1"]) and abs(time.time() - int(parts["t"])) < 300
def post(r: dict):
stars = "★" * (r["rating"] or 0) + "☆" * (5 - (r["rating"] or 0))
embed = {"title": (r.get("title") or f"{r['platform']} review")[:256], "url": r.get("url"),
"description": (r.get("text") or "")[:4000], "color": COLORS.get(r["rating"] or 3, 0x8B8D98),
"author": {"name": f"{stars} · {r.get('author') or 'a player'}"},
"fields": [{"name": "Store", "value": r["platform"], "inline": True},
{"name": "Language", "value": r.get("language") or "-", "inline": True}],
"timestamp": r["created_at"], "footer": {"text": r["location_id"]}}
for _ in range(3):
res = requests.post(DISCORD, json={"username": "Reviews", "embeds": [embed]}, timeout=30)
if res.status_code != 429:
res.raise_for_status(); return
time.sleep(float(res.json().get("retry_after", 2)))
@app.post("/webhooks/prisma")
def prisma_webhook():
if not verify(request.get_data(), request.headers.get("Prisma-Signature", "")):
abort(400)
e = request.get_json()
if e["type"] == "review.created":
post(requests.get(f"{PRISMA}/reviews/{e['data']['id']}", headers=PH, timeout=30).json())
return {"ok": True}The embed’s colour follows the rating, the title links to the review on the store, and the timestamp is the review’s date, so Discord shows it in the reader’s local time. Discord allows roughly 30 messages a minute per webhook; the loop honours retry_after on a 429, which matters on launch days.
3. Register the Prisma webhook
curl -X POST https://api.prismareviews.com/v1/webhooks \
-H "Authorization: Bearer $PRISMA_API_KEY" -H "Content-Type: application/json" \
-d '{"url": "https://yourapp.example.com/webhooks/prisma", "events": ["review.created"]}'Connect the stores first: an App Store Connect key, a Google Play service account (note the 7-day window), or just the Steam store page for a game. A pk_test_ key sends sample reviews from every store, so the channel fills before you connect anything.
Variants
- Bugs channel: post 1- and 2-star reviews to
#bugstoo, where the QA team triages; add the app version from the review’s text or your own release data. - Public 5-star feed: a second webhook in a community channel, posting only
rating == 5. - Per app: one webhook per game or app, picked by
location_id(each app is a location in Prisma). - No code: n8n’s Prisma Reviews trigger (verified node, n8n setup) → Discord node, “send message” with an embed.
The same webhook, other tools: HubSpot · Notion · Airtable · Zendesk · Intercom · Slack (approve replies) · Slack (alerts) · Microsoft Teams · Google Sheets.
FAQ
How do I get App Store reviews in Discord?
Neither Apple nor Discord offers it. A reviews API reads the App Store reviews with your App Store Connect key and sends a webhook per new review; your endpoint posts an embed to a Discord channel webhook. The same works for Google Play, Steam and the other stores.
What are Discord’s webhook limits?
Roughly 30 messages a minute per webhook, with 429 responses carrying retry_after. An embed description holds up to 4,096 characters and a message up to 10 embeds.
Can the community see the reviews?
Only if you post to a public channel. Most studios use a private team channel for all reviews and, optionally, a public one with 5-star reviews only, which is a decent social-proof feed for a game’s community.
Every store review, in the Discord your team already lives in.
2 apps free. Test keys send sample reviews from every store.