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:

  1. Archive and export: The remote Mac creates the signed application package.
  2. Transport or upload: The binary reaches Apple’s upload service.
  3. Apple processing: App Store Connect validates and processes the uploaded binary.
  4. Build availability: The build becomes Complete or Failed.
  5. Beta distribution: TestFlight can show the build as available, unavailable, or requiring action.
  6. App version workflow: The version may be ready for submission, waiting for review, in review, or released.
A successful upload command only proves that the transfer step completed. It does not prove that the build passed Apple’s processing stage or became available to testers.

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.
Use “notify only” for normal Processing and Complete events. Use “notify and trigger an action” for a confirmed failed build that should open an incident or block the next release step. Keep “manual confirmation required” for production submission, destructive cleanup, certificate changes, and any action that could affect testers or an App Store submission.

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.
The App selection matters. A Webhook configured for one App should not be assumed to behave like an account-wide event bus for every App owned by the team. If you maintain several bundle identifiers, document whether you are creating separate integrations or managing several Apps within one configuration.

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.
Do not publish a real Secret, JWT, API key, bundle identifier, or callback address in a tutorial, issue report, screenshot, or public repository. Use placeholders such as <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:

  1. Accept the request at the Payload URL.
  2. Save the raw body and delivery metadata before parsing business fields.
  3. Record the event ID and the first-received timestamp.
  4. Validate the request using the current Apple-defined verification method and your configured Secret.
  5. Check freshness so an old callback is not treated as a new release event.
  6. Parse the event type and map it to an allowed workflow.
  7. Apply an idempotency key based on the event ID.
  8. Queue follow-up work such as an API confirmation or notification.
  9. Return the appropriate HTTP response according to whether your service accepted or rejected the delivery.
The event ID is not merely a debugging value. It is the key that prevents a retry or duplicate delivery from causing two notifications, two remote Mac jobs, or two manual escalation tasks.

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
Keep the raw payload separately from the normalized record. That lets you investigate a mapping problem without losing the original evidence.

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.
Link the remote Mac job to App Store Connect using the marketing version and build number. The mapping must be generated before upload and written to the job log. A timestamp alone is not sufficient because two uploads can occur close together.

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.
Those are different business states. Your notification text should name the state, version, build number, event ID, and confirmation source so that a teammate can understand the result without opening a terminal.

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.
Only the first category should normally enter an automatic delivery retry path. A temporary network problem or server-side error can recover without rebuilding. A failed signature or invalid binary usually cannot be fixed by sending the same event again.

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:

  1. Open the delivery details in App Store Connect.
  2. Compare the event ID with your server’s event table.
  3. Check whether the raw payload was stored.
  4. Inspect endpoint status codes and timeout logs.
  5. Resend the delivery if the endpoint is healthy.
  6. Run an API or page confirmation for the matching build.
  7. Mark the original delivery as recovered or permanently failed.
  8. Escalate only when the final build state remains uncertain.
This path lets you recover a callback without repeating a potentially expensive archive and upload operation.

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.
**How can you tell whether an IPA uploaded from a remote Mac is ready for TestFlight?**

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.
That separation prevents a temporary callback problem from becoming an accidental duplicate upload or an incorrect release announcement.

Choose the monitoring design that matches your risk

<
OptionWhat it does wellMain weaknessBest fit
Remote Mac page polling onlySimple to understand during a manual releaseFragile sessions, no shared event history, and easy to miss state changesOne-off personal checks
Webhook notifications onlyFast event-driven alerts with little pollingCannot safely prove the final state when events duplicate, arrive out of order, or need confirmationBasic notification workflows
Webhooks plus server records plus API confirmationProvides event speed, audit history, idempotency, and final-state verificationRequires an endpoint, storage, and credential managementIndependent developers and small teams with repeat releases
Full queue and reconciliation serviceHandles failures, delayed callbacks, duplicate events, and team-wide reportingMore maintenance than a solo project may needMultiple Apps or frequent releases
**Decision rule:** Choose the combined Webhook, server record, and API confirmation design if a wrong release state could cause a duplicate upload, missed tester build, or premature production action. Use a simpler notification-only design only when a human will inspect every release before acting.

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.