A serverless webhook proxy that receives App Store Connect webhook events and forwards them to Slack, Discord, and Microsoft Teams with beautiful, localized notifications.
- π Multi-platform notifications: Slack, Discord, and Microsoft Teams support
- π Internationalization: 7 languages (English, Korean, Japanese, Chinese, Spanish, French, German)
- π Secure: Apple HMAC-SHA256 signature verification
- π¨ Beautiful formatting: Rich embeds with status colors and emojis
- β‘ Serverless: Deploy instantly to Vercel
- π± App Store focused: App version, build upload, beta build, and TestFlight feedback events
- π Health monitoring: Built-in health check endpoint (
GET /api/health) - π€ AI-friendly: LLM setup guide for Claude Code, Codex, and other AI agents
Or clone and deploy manually:
git clone https://github.com/techinpark/appstore-status-webhook.git
cd appstore-status-webhook
npm install
vercel --prodSet these environment variables in your Vercel project settings:
# Required: At least one webhook URL
SLACK_WEBHOOK_URL=https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK
DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/YOUR/DISCORD/WEBHOOK
TEAMS_WEBHOOK_URL=https://your-tenant.webhook.office.com/webhookb2/YOUR/TEAMS/WEBHOOK
# Optional: Apple signature verification
SHARED_SECRET=your_shared_secret_here
# Optional: App Store Connect API (for enhanced app information)
ENABLE_APP_STORE_API=true
APP_STORE_CONNECT_KEY_ID=your_key_id
APP_STORE_CONNECT_ISSUER_ID=your_issuer_id
APP_STORE_CONNECT_PRIVATE_KEY_PATH=/path/to/your/private/key.p8
# OR use private key content directly:
# APP_STORE_CONNECT_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nYOUR_PRIVATE_KEY_CONTENT\n-----END PRIVATE KEY-----"
# Optional: Customization
APP_STORE_URL=https://apps.apple.com/app/your-app/id123456789 # Used as fallback if API is disabled
TIMEZONE=Asia/Seoul
LANGUAGE=ko # en (English), ko (Korean), ja (Japanese), zh (Chinese), es (Spanish), fr (French), de (German)- Go to App Store Connect β Users and Access β Webhooks
- Create a new webhook with your deployed URL:
https://your-app.vercel.app/api/webhook - Select the events you want to receive
- Save your webhook
| Event | Description | Platforms |
|---|---|---|
appStoreVersionAppVersionStateUpdated |
App version status changes | β All |
buildUploadStateUpdated |
Build upload processing state | β All |
buildBetaDetailExternalBuildStateUpdated |
TestFlight beta build state | β All |
betaFeedbackScreenshotSubmissionCreated |
TestFlight screenshot feedback | β All |
betaFeedbackCrashSubmissionCreated |
TestFlight crash report | β All |
webhookPingCreated |
Webhook test ping | β All |
| Custom events | Unhandled events with JSON payload | β All |
π Your App Name
ββββββββββββββββββββββββββββββββββββββββ
β
Current Status: Ready for Sale
π€ Previous Status: Pending Apple Release
π± App Name: Your App Name
π’ Version: 1.2.3
π¦ Bundle ID: com.yourcompany.yourapp
Rich embed with color-coded status, timestamp, and clickable App Store link
By enabling App Store Connect API integration, you can get rich app information in your notifications:
- App Name: Real app name from App Store Connect
- Version Number: Current version string
- Bundle ID: App bundle identifier
- Dynamic App Store Links: Automatically generated links to your app
- App Store State: Current app status
-
Create an API Key:
- Go to App Store Connect
- Navigate to Users and Access β Integrations β App Store Connect API
- Click Generate API Key
- Set Access: Developer (minimum required)
- Download the
.p8private key file
-
Get Your Credentials:
- Key ID: Found in the API key details
- Issuer ID: Found in the API key section header
- Private Key: The downloaded
.p8file content
-
Configure Environment Variables:
ENABLE_APP_STORE_API=true APP_STORE_CONNECT_KEY_ID=ABC123DEFG APP_STORE_CONNECT_ISSUER_ID=12345678-1234-1234-1234-123456789012 APP_STORE_CONNECT_PRIVATE_KEY_PATH=/path/to/AuthKey_ABC123DEFG.p8
For Vercel deployment, use the private key content directly:
APP_STORE_CONNECT_PRIVATE_KEY="-----BEGIN PRIVATE KEY----- MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQg... -----END PRIVATE KEY-----"
- Automatic App Store Links: No need to manually set
APP_STORE_URL - Rich Notifications: App name, version, and bundle ID in notifications
- Multiple Apps: Works with multiple apps automatically
- Real-time Data: Always up-to-date information from Apple
- If API calls fail, notifications will fall back to basic information
- Check logs for authentication errors
- Ensure your API key has Developer access level
- Verify your private key format (should include
-----BEGIN PRIVATE KEY-----)
# Clone the repository
git clone https://github.com/techinpark/appstore-status-webhook.git
cd appstore-status-webhook
# Install dependencies
npm install
# Copy environment variables
cp env.example .env.local
# Edit .env.local with your webhook URLs
# Start development server
npm run start
# Test the webhook (in another terminal)
npm run testThe project supports multiple languages:
- English (
en): Default language - Korean (
ko): Complete Korean localization - Japanese (
ja): Complete Japanese localization - Chinese (
zh): Complete Chinese localization - Spanish (
es): Complete Spanish localization - French (
fr): Complete French localization - German (
de): Complete German localization
Set the LANGUAGE environment variable to your preferred language.
Enable signature verification by setting the SHARED_SECRET environment variable:
SHARED_SECRET=your_shared_secret_from_appstore_connectThis ensures that only authentic webhooks from Apple are processed.
Receives App Store Connect webhook events.
Headers:
Content-Type: application/jsonX-Apple-Signature: sha256=...(when signature verification is enabled)
Response:
{
"message": "OK"
}Error Responses:
405 Method Not Allowed- Non-POST requests401 Unauthorized- Invalid signature500 Internal Server Error- Processing error
Health check endpoint that returns configuration status.
Response:
{
"status": "ok",
"configured": { "slack": true, "discord": false, "teams": false },
"appStoreApi": { "enabled": true, "configured": true },
"localization": { "language": "en", "timezone": "UTC" },
"supportedEvents": ["appStoreVersionAppVersionStateUpdated", "..."]
}appstore-status-webhook/
βββ api/
β βββ webhook.ts # Main webhook handler
β βββ health.ts # Health check endpoint
βββ lib/
β βββ builders/ # Message builders
β β βββ discord.ts
β β βββ slack.ts
β β βββ teams.ts
β βββ constants/ # Configuration constants
β β βββ config.ts
β β βββ status.ts
β βββ locales/ # Localization files (7 languages)
β β βββ en.json, ko.json, ja.json
β β βββ zh.json, es.json, fr.json
β β βββ de.json
β βββ notifiers/ # Platform notifiers
β β βββ discord.ts
β β βββ slack.ts
β β βββ teams.ts
β βββ services/ # External API clients
β β βββ appstore.ts
β βββ types/ # TypeScript types
β β βββ index.ts
β βββ utils/ # Utility functions
β βββ color.ts
β βββ locale.ts
β βββ signature.ts
β βββ status.ts
β βββ timestamp.ts
βββ scripts/
β βββ setup-check.ts # Environment validation script
βββ CLAUDE.md # AI agent project reference
βββ LLM_SETUP_GUIDE.md # Step-by-step setup guide for AI agents
βββ env.example # Environment variables template
βββ package.json
βββ tsconfig.json
βββ vercel.json # Vercel configuration
For AI agents (Claude Code, Codex, Cursor, ChatGPT, etc.): If a user asks you to help set up this project, read
LLM_SETUP_GUIDE.mdfor complete step-by-step instructions. It covers webhook URL creation for each platform, Vercel deployment, environment variable configuration, Apple App Store Connect webhook registration, and troubleshooting.
For AI agents working inside the repository: Read
CLAUDE.mdfor architecture overview, supported events, common tasks, and testing commands.
Non-technical users can simply ask their AI assistant:
Help me set up this App Store webhook project: https://github.com/techinpark/appstore-status-webhook
The AI agent will find and follow the setup guide automatically.
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is licensed under the MIT License. See the LICENSE file for details.
- Built for the App Store Connect developer community
- Inspired by the need for better webhook notifications
- Special thanks to all contributors
Need help? Open an issue or start a discussion.