Apple documents five broad App Store Connect Webhook event areas, including build upload status, beta build status, app version status, hosted resources, and TestFlight feedback in its official event references. That makes App Store Connect Webhooks useful as an event trigger, but not as your only source of truth.
Symptom: Your remote Mac reports a successful upload, but you still do not know whether the build is processing, complete, testable, or blocked.
Fastest fix: Use Webhooks to trigger notifications, store each event on your server, then confirm important states with the App Store Connect API or the App Store Connect page before taking an irreversible action.
This guide is for:
- Independent developers who want automatic alerts for Processing, Failed, or Complete instead of refreshing the release page.
- Remote Mac maintainers who need to connect archive, upload, callbacks, and recovery into one workflow.
- Small teams that need one shared release record instead of separate local notes and repeated uploads.
Start with the release states you actually need
Do not begin by subscribing to every available event. First decide what each event means in your delivery process.
Apple separates build upload states from broader app version and beta testing states. The official build upload status reference describes the status of an uploaded build, while the build status reference covers the state of the build inside App Store Connect.
For a small iOS release pipeline, keep these stages separate:
- Archive and export: The remote Mac creates the signed application package.
- Transport or upload: The binary reaches Apple’s upload service.
- Apple processing: App Store Connect validates and processes the uploaded binary.
- Build availability: The build becomes Complete or Failed.
- Beta distribution: TestFlight can show the build as available, unavailable, or requiring action.
- App version workflow: The version may be ready for submission, waiting for review, in review, or released.
Which App Store Connect states are worth monitoring?
For most independent developers, monitor three groups:
- Build upload status: useful for detecting whether the uploaded build is still Processing or has Failed.
- Beta build status: useful for deciding whether TestFlight distribution can proceed.
- App version status: useful when your release process includes submission, review, or production release decisions.
The event record should retain at least the event ID, event type, App identifier, marketing version, build number, received time, and processing result. Do not rely on the text of a notification as your permanent release record.
Configure the first Webhook before the next upload
Create the integration from the App Store Connect team area rather than treating the callback as an informal script endpoint. Apple’s Webhook management instructions and configuration documentation define the current setup flow and available controls.
Prepare these items:
- An App Store Connect account with the role and access required by the current interface.
- The specific App or Apps that the Webhook should observe.
- A publicly reachable Payload URL such as
<PAYLOAD_URL>. - A Secret stored in your server’s secret manager, not in source control.
- The event types required by your release workflow.
- A database or durable queue for raw event storage.
A minimal endpoint should satisfy four conditions:
- It accepts HTTPS requests from the public internet.
- It returns a fast success response after safely accepting the request.
- It stores the raw request before transforming fields.
- It prevents secrets, authorization material, and complete credentials from entering application logs.
<WEBHOOK_SECRET>, <ISSUER_ID>, <KEY_ID>, <BUNDLE_ID>, and <BUILD_NUMBER>.
Do App Store Connect Webhooks need the API?
For a reliable release monitor, yes. Webhooks tell your system that something changed, while an API request or App Store Connect page confirms the current resource state. Apple’s Webhook event documentation explains the event model, while the API key creation guide covers the credentials needed for API access.
The API is especially important when an event is duplicated, arrives out of order, or lacks enough information for your application to associate it with the correct release attempt.
Receive the first callback with an idempotent handler
Treat the first delivery as an untrusted input that must be recorded and validated. Do not immediately trigger another upload from the first request.
Use this order:
- Accept the request at the Payload URL.
- Save the raw body and delivery metadata before parsing business fields.
- Record the event ID and the first-received timestamp.
- Validate the request using the current Apple-defined verification method and your configured Secret.
- Check freshness so an old callback is not treated as a new release event.
- Parse the event type and map it to an allowed workflow.
- Apply an idempotency key based on the event ID.
- Queue follow-up work such as an API confirmation or notification.
- Return the appropriate HTTP response according to whether your service accepted or rejected the delivery.
Store a normalized release record with fields such as:
app_id: <APP_ID>bundle_id: <BUNDLE_ID>version: <VERSION>build: <BUILD_NUMBER>event_id: <EVENT_ID>event_type: <EVENT_TYPE>observed_state: <STATE>received_at: <TIMESTAMP>confirmed_at: <TIMESTAMP>confirmation_source: api | page | pending
A build upload event can help you locate the App, version, and build involved, but your application should still verify that the identifiers match the release attempt currently running on the remote Mac. A single callback must not automatically trigger a re-upload, delete a build, or move a production workflow forward.
**Operational reminder:** A Webhook is an event delivery mechanism. It is not proof that the entire release is ready for testers or production. Require a second confirmation for any action that cannot be safely reversed.
Connect the remote Mac upload to the status timeline
Your iOS build server needs its own state machine. Do not reduce the complete process to “upload succeeded” and “upload failed.”
Use a release record like this:
- Started: Archive or export began on the remote Mac.
- Binary ready: The expected IPA exists and passed the local checks required by your pipeline.
- Uploaded: The upload command reported a successful transfer.
- Apple processing: App Store Connect has not yet confirmed the final build state.
- Processing complete: The build has reached the expected completed state.
- Processing failed: Apple rejected or failed to process the uploaded build.
- Beta confirmation pending: The build state is known, but TestFlight availability still needs confirmation.
- Manual review required: The identifiers do not match, an event is missing, or the release requires a human decision.
How do you receive a build-upload completion notification?
Subscribe to the build upload event, accept and store the callback, then query or inspect the matching build before marking the release complete. The notification should update the release record to “candidate for confirmation,” not directly to “ready for TestFlight.”
This distinction avoids a common error:
- Transport success: The binary left the remote Mac and was accepted by the upload path.
- Processing complete: Apple finished handling the binary.
- Beta available: The build can be distributed through the intended TestFlight workflow.
If the callback cannot be associated with the active job, place the record in manual_review and query App Store Connect by the known version and build. Never guess based only on the most recent upload.
You can also connect the workflow to a remote Mac environment from MACGPU when you need macOS available for archive and upload work. The decision is operational: a Webhook receiver can run independently, while the Mac performs the Apple-specific build and upload steps.
Recover delivery failures without rebuilding blindly
Apple exposes delivery information for Webhooks, including states such as Success, Pending, and Failed. The official Webhook management page is the authority for viewing delivery records, event details, and the current resend behavior.
Separate delivery failure from release failure:
- Delivery failure: Your endpoint timed out, returned a server error, rejected the request, or was temporarily unreachable.
- Release failure: The binary failed validation, processing, signing, compliance, or another Apple-defined business check.
- Association failure: The event arrived, but your application could not match it to the expected version and build.
- State uncertainty: The event was accepted, but the API or page has not yet confirmed the final state.
How should a failed Webhook delivery be retried?
First inspect the delivery record and endpoint logs. Confirm whether your server received the request, whether it stored the event ID, and whether it returned the expected response. Then use Apple’s available resend action when appropriate, or process the stored event through your internal queue.
Do not create a new build just because a Webhook delivery failed. Rebuilding is justified only when the build itself is invalid, the wrong artifact was uploaded, or your release policy requires a new build number.
Your recovery runbook should include:
- Open the delivery details in App Store Connect.
- Compare the event ID with your server’s event table.
- Check whether the raw payload was stored.
- Inspect endpoint status codes and timeout logs.
- Resend the delivery if the endpoint is healthy.
- Run an API or page confirmation for the matching build.
- Mark the original delivery as recovered or permanently failed.
- Escalate only when the final build state remains uncertain.
Run one real release and keep the monitor maintainable
Before relying on the monitor, perform one complete release using a redacted build record. The test should include Archive, Export, upload from the remote Mac, Apple processing, Webhook delivery, API or page confirmation, notification, and final manual approval.
Check each part of the timeline:
- The remote Mac job has a unique release identifier.
- The version and build number are written before upload.
- The upload result is not confused with processing completion.
- The raw callback is retained.
- The event ID is searchable.
- A duplicate event produces one business action.
- An out-of-order event does not overwrite a newer confirmed state.
- A failed delivery can be resent or recovered.
- Sensitive values are masked in logs.
- The final App Store Connect state matches your internal record.
Use the version and build number to locate the build, confirm the Apple processing result, and then verify the beta distribution state. A remote Mac upload message alone is not enough. If the Webhook arrives before the build becomes queryable, keep the release in a pending state and perform a later confirmation rather than treating the missing result as failure.
Do not hard-code a universal Processing timeout unless your own release policy defines one. Processing time can vary by artifact, service condition, and workflow. Instead, alert when a build exceeds the internal threshold you have chosen and label the alert “needs confirmation,” not “definitely failed,” until the API or page shows the result.
What if a callback is missing?
Check the Webhook delivery history first. If Apple shows a successful delivery but your database has no event, investigate endpoint routing, request storage, and log retention. If Apple shows a failed delivery, repair the endpoint and use the documented resend path. If no delivery record resolves the issue, query App Store Connect directly and mark the release as manually confirmed.
Should you keep email notifications and API polling?
Keep email as a secondary human alert for critical release stages, especially while the Webhook integration is new. Use API checks for confirmation and reconciliation, not as a substitute for every event. A periodic reconciliation job can find releases that have a remote Mac upload record but no confirmed App Store Connect state.
For a small team, record ownership clearly:
- The remote Mac owns build execution and upload logs.
- The Webhook service owns event receipt and delivery history.
- The API confirmation worker owns current-state verification.
- A human owns production-impacting decisions.
Choose the monitoring design that matches your risk
| Option | What it does well | Main weakness | Best fit |
|---|---|---|---|
| Remote Mac page polling only | Simple to understand during a manual release | Fragile sessions, no shared event history, and easy to miss state changes | One-off personal checks |
| Webhook notifications only | Fast event-driven alerts with little polling | Cannot safely prove the final state when events duplicate, arrive out of order, or need confirmation | Basic notification workflows |
| Webhooks plus server records plus API confirmation | Provides event speed, audit history, idempotency, and final-state verification | Requires an endpoint, storage, and credential management | Independent developers and small teams with repeat releases |
| Full queue and reconciliation service | Handles failures, delayed callbacks, duplicate events, and team-wide reporting | More maintenance than a solo project may need | Multiple Apps or frequent releases |
If you need a persistent macOS build environment rather than occasional local access, MACGPU’s remote Mac options can provide a separate place for archive and upload jobs. You should still keep the Webhook receiver and confirmation logic independent from the Mac session so a VNC disconnect or SSH interruption does not erase release evidence.
A local Mac remains the better choice when you need physical devices, direct USB access, or heavy workloads that must run continuously on hardware you control. A remote Mac is more suitable when you need a dedicated iOS build server for scheduled or temporary releases, but do not want to purchase and maintain another Mac solely for signing, archiving, and uploading.
The key architectural choice is simple: let the remote Mac execute the build, let App Store Connect Webhooks trigger the next step, let your server preserve the timeline, and let the API or App Store Connect page confirm the state before your workflow makes an irreversible decision.