A release job keeps polling App Store Connect long after the build has already changed state, while a missed response leaves the pipeline uncertain.
The fastest safe fix is to make Webhooks the primary notification path, retain low-frequency App Store Connect API reconciliation, and remove the old polling job only after security, idempotency, recovery, and Mac-node tests pass.
This App Store Connect Webhooks acceptance checklist is for teams still using Fastlane to query build or review status, DevOps engineers designing an unattended release control plane, and release leads validating how a remote Mac node connects to event-driven automation. If the pipeline still depends on macOS signing or local physical interfaces, Webhooks alone will not remove that requirement.
Decision in one line: Webhooks can replace most frequent status polling, but they cannot replace Xcode-based building, signing, binary upload tools, authoritative API checks, or the complete release state machine.
This week, keep the existing polling path in place, add Webhook delivery beside it, and collect evidence from controlled release jobs before changing production behavior.
The acceptance boundary: notification is not execution
The cleanest architecture separates three planes:
| Plane | What it does | What Webhooks change | What remains |
|---|---|---|---|
| Control plane | Stores release tasks, permissions, state transitions, approvals, and rollback rules | Receives an event and starts a state evaluation | The internal state machine and approval policy |
| Notification plane | Reports changes from App Store Connect | Reduces the need for frequent status queries | Signature validation, event logging, retries, and reconciliation |
| macOS execution plane | Archives, signs, exports, and uploads the application | Can be started or resumed after a relevant event | Xcode, signing assets, upload tooling, and a reliable Mac node |
Apple documents Webhook configuration, HMAC validation, and supported event types separately from build upload and version-state behavior. The official Webhook event reference should therefore be treated as the event contract, not as proof that every release action has completed.
Our acceptance rule is strict: if an event cannot be used to recover the authoritative resource state, the automation is not ready for unattended production release. A Webhook payload may indicate that something changed. The App Store Connect API must confirm what changed, whether it belongs to the expected app and release, and whether the next action is allowed.
This distinction also prevents a common architectural mistake. Replacing Fastlane polling with a Webhook receiver does not create a complete Fastlane replacement. It only moves the trigger for state evaluation from a timer to an event.
The two-track design we would approve first
Before discussing individual scenarios, we score the candidate operating models by operational risk rather than by how small the script looks.
| Operating model | Polling load | Recovery strength | Migration risk | Our decision |
|---|---|---|---|---|
| Frequent polling only | High | Familiar, but expensive to scale and easy to misconfigure | Low initially | Keep only as a temporary baseline |
| Webhook only | Low during normal operation | Weak unless missed events, replay, and API reconciliation are proven | High | Do not approve for production by default |
| Webhook plus low-frequency reconciliation | Low | Stronger because the API remains the source of truth | Moderate | Preferred first production design |
| Webhook plus selective Fastlane tasks | Low to moderate | Strong where legacy plugins still matter | Moderate to low | Suitable for gradual migration |
The third model is the sensible starting point. Webhooks provide the event-driven path. A low-frequency reconciliation task checks open release records, not every possible state on a tight timer. The reconciliation process should respect Apple’s published rate-limit guidance rather than replacing one aggressive polling pattern with another; see the App Store Connect API rate-limit documentation.
As of August 31, 2026, Apple’s API release notes list version 4.4.1. That does not make “API 2.0” a current version label, and it is a reason to pin and review API behavior rather than rely on old migration articles. We recheck the App Store Connect API release notes when Apple changes event types, permissions, delivery behavior, or upload requirements.
Build upload events need a complete evidence chain
The first production scenario is a build moving through upload and processing. The receiver should prove more than “an event arrived.”
A valid test begins with a known release task containing the expected application identifier, marketing version, build number, source commit, archive identifier, and target environment. When the upload state changes, the receiver records the event, validates its signature, maps it to the expected application, and queries the relevant App Store Connect resource.
The API query is essential. The Apps API documentation describes the application resource used to identify the target app, while Apple’s build upload status definitions define the upload lifecycle. A receiver that trusts the Webhook body as the final result can advance a release using stale, incomplete, or incorrectly mapped information.
For each controlled build, collect these acceptance records:
- The raw request headers and payload, stored with sensitive fields protected.
- The validated event identifier and receipt timestamp.
- The application, version, and build identifiers resolved through the API.
- The API response used to make the state decision.
- The action taken by the release worker.
- The failure record if processing, validation, or upload did not succeed.
- A second delivery test proving that the same release task is not advanced twice.
The pass condition is not simply “the build became available.” The evidence must show that the event reached the correct release task and that the task could distinguish a successful build from a failed or still-processing build.
A useful control is to require a fresh API read immediately before a consequential action. For example, an event may wake the worker, but the worker must query the build before marking the upload complete or starting a TestFlight action. This keeps the notification plane separate from the control plane.
Can App Store Connect Webhooks fully replace Fastlane polling?
No. They can replace the frequent “has the state changed yet?” loop for supported events, but they cannot replace every Fastlane responsibility or every release operation.
The boundary is clearer when actions are separated:
- Event notification: Webhooks tell the system that a supported resource or state may have changed.
- Authoritative lookup: App Store Connect API calls confirm the current resource state.
- Build and signing: The Mac execution plane still archives, signs, exports, and prepares the binary.
- Binary upload: Apple’s build upload guidance remains the reference for supported upload paths.
- Release orchestration: Internal policy decides whether to wait, pause, request approval, retry, or send the task to a person.
- Legacy automation: Fastlane may remain useful for certificates, screenshots, metadata, plugins, and established project-specific actions.
This is why moving away from Fastlane as a central dependency should mean removing unnecessary coupling, not deleting every Fastlane invocation in one change. A Ruby dependency may be undesirable for a small event worker, while a mature certificate or screenshot workflow can still justify retaining a limited Fastlane component.
The migration cost is highest where the existing Fastfile contains hidden policy. A lane may quietly select a signing profile, transform metadata, wait for processing, notify a team, or handle a special failure path. Before removing it, extract those decisions into explicit pipeline steps and test fixtures.
TestFlight and version states require policy mapping
A TestFlight event should not automatically mean “continue.” The release controller needs a mapping from observed state to permitted action.
For beta builds, test whether the event can initiate the intended distribution or notification step after an API confirmation. For TestFlight feedback, verify that feedback is stored against the right build and that a warning does not silently become an approval. For app version states, use Apple’s AppVersionState definition to build an explicit state map.
A production map should contain at least these categories:
- Allowed to proceed: the confirmed state matches the release policy and no approval gate remains.
- Pause and wait: processing, review, metadata, or another asynchronous condition is unresolved.
- Route to a person: the state indicates rejection, missing compliance information, an exception, or a policy decision.
- Stop and investigate: the resource does not match the expected app, version, build, or release task.
The key evidence is traceability. Every state transition should include the prior internal state, the received event, the API confirmation, the policy rule selected, the resulting action, and the worker identity. If a reviewer asks why a release moved forward, the answer should be reconstructable from records rather than inferred from a notification message.
A single state event must never bypass manual approval, export compliance, review requirements, or missing release material. Webhooks reduce waiting. They do not grant permission to skip governance.
How do you verify that an App Store Connect Webhook request came from Apple?
Start with the HMAC verification process documented by Apple, then test failure behavior deliberately. The Webhook configuration and payload parsing documentation is the authority for the validation flow. The receiver should calculate the expected signature from the exact request content required by Apple, compare it using a constant-time method, and reject the request before queueing any release action.
The test matrix should include:
- A valid signature with an unchanged payload.
- A missing signature.
- A signature calculated with the wrong secret.
- A valid-looking request whose body was modified after signing.
- A replay of a previously accepted event.
- A malformed payload with a valid transport request.
- A valid event for an unknown or closed release task.
Do not return success for an event that failed authentication simply to reduce retries. The system should produce a security log and an alert path that distinguishes invalid signatures from temporary service failures.
Webhook secrets and App Store Connect API private keys also need separate ownership and storage. Apple’s API key creation guidance covers API key setup and role considerations. The Webhook secret protects inbound event acceptance; the API key authorizes outbound queries and actions. Combining them in one secret store entry, one deployment variable, or one rotation process increases the blast radius of a leak.
During rotation, support both secret versions only for a defined transition period. Record which version validated each request, alert on unexpected use of the retired version, and remove the old secret after delivery tests confirm that the new configuration works. The same separation should apply to production and staging receivers.
When an App Store Connect Webhook misses a build event
A missed event is not an unusual edge case to hide. It is a normal condition that the design must recover from.
Test this with controlled failures: stop the receiver, block its network path, delay queue consumption, and send duplicate or out-of-order events. The recovery design should include:
- A durable event record before business processing.
- A queue or retry mechanism that separates receipt from execution.
- An idempotency key based on the event identifier, resource identity, and internal release task.
- A state-machine guard that rejects backward transitions unless an operator authorizes them.
- A reconciliation job that queries open tasks at a low frequency.
- A dead-letter or failed-event queue with ownership and alerting.
- An operator action that can re-check the resource and replay a safe decision.
Event identity alone may not be enough. A repeated event for two different release tasks must not collide, while two events for one task must not cause duplicate submission or notification. Store the event identifier together with the App Store Connect resource and the internal task identity.
Out-of-order delivery needs an additional guard. Suppose a later state is processed first and an earlier state arrives afterward. The worker should compare the confirmed resource state and transition rules before changing anything. It must not roll a release backward merely because an older event was delivered later.
The reconciliation job is the fallback, not a second primary trigger. It should look for open tasks whose last confirmation is stale, query the authoritative API, and produce the same state decision used by Webhook processing. This shared decision function prevents the recovery path from developing different behavior from the normal path.
First step: build the acceptance fixture
Create a non-production app, release task, or controlled test path that represents the production fields your worker uses. Do not test only a successful upload. Include an invalid signature, a duplicate delivery, a delayed event, a failed build, an unknown build number, and an interrupted receiver.
The fixture should make every state transition observable. Store correlation IDs across the Mac worker, upload command, Webhook receiver, API query, queue message, and notification system. Without a shared correlation ID, a dashboard can show green components while the release task itself remains unconfirmed.
Second step: verify authorization and resource matching
Give the API key only the roles required for the tested actions. Confirm that the worker can identify the correct app and retrieve the required build or version resource, then test that an event for another app is rejected or quarantined.
The acceptance evidence should include permission failures. A permission failure must stop the release safely, not trigger repeated retries that obscure the real configuration problem.
Third step: test the event-to-query decision
Send or trigger each supported event used by the workflow. For every event, verify that the receiver validates the request, stores the event, queries App Store Connect, and applies the correct policy. The payload should wake the process; the API response should make the decision.
Do not encode a final release state directly from a text field in the payload unless Apple’s documentation explicitly defines that field as sufficient for the action. The safer implementation treats the event as a reason to refresh state.
Fourth step: break delivery and replay the task
Disable the receiver during a controlled state change. Restore it, run reconciliation, and confirm that the release reaches the correct state without manual database edits. Then replay the same event several times and prove that the system produces one business action.
The evidence should show both normal recovery and operator recovery. If the only recovery method is deleting a queue message or editing a row by hand, the design is not ready for unattended release.
Fifth step: connect the event worker to the Mac node
The event service should start or resume a job on a maintained or cloud-hosted Mac node, but the Mac should remain an execution worker rather than becoming the source of release truth. The job must expose archive, signing, export, upload, and result records back to the control plane.
Check the failure boundary carefully:
- The event worker is available, but the Mac node is offline.
- The Mac starts, but signing assets are unavailable.
- The archive succeeds, but export fails.
- The binary uploads, but processing remains incomplete.
- The API confirms a state different from the worker’s local result.
For teams evaluating a remote execution layer, our Mac environment and deployment support guidance can be used alongside this acceptance process. The relevant question is not whether a Mac can run a command. It is whether the node can execute the required macOS tasks, return durable evidence, and reconnect to the same release task after interruption.
We do not include a JexMac node performance record here because this checklist requires a real, task-specific chain record rather than an invented configuration or benchmark. Teams should attach their own Mac model, delivery method, lease period, task logs, build result, and event reconnection evidence to the acceptance ticket.
The final checklist and release decision
Use the following list as the approval record. Each item should link to a log, test run, or review artifact.
- [ ] Every production event type is mapped to an App Store Connect resource and an internal release task.
- [ ] The receiver rejects missing, invalid, and modified HMAC-signed requests.
- [ ] Webhook secrets and App Store Connect API private keys are stored, authorized, and rotated separately.
- [ ] Secret rotation has a documented dual-version transition and failure alert.
- [ ] A valid event always triggers an authoritative API query before a consequential action.
- [ ] The application, version, build number, and release task are cross-checked before processing.
- [ ] Duplicate delivery cannot cause duplicate submission, notification, approval, or rollback.
- [ ] Out-of-order events cannot move the internal state machine backward.
- [ ] A stopped receiver can recover through reconciliation without manual database repair.
- [ ] Failed events enter a visible queue with an owner and an operator replay path.
- [ ] TestFlight feedback, beta build states, and version states have separate policy mappings.
- [ ] Review, compliance, metadata, and manual approval gates cannot be bypassed by one event.
- [ ] The Mac node can archive, sign, export, and upload using the supported project toolchain.
- [ ] Mac-node failures produce a control-plane state that is different from an App Store Connect failure.
- [ ] Correlation IDs connect the build, upload, event, API query, and final decision.
- [ ] Low-frequency reconciliation respects Apple’s rate-limit guidance.
- [ ] The team has retained Fastlane tasks that still provide material value, or has replaced them with tested components.
- [ ] Production approval includes evidence from a controlled failure, not only a successful build.
The result should be signed as one of three outcomes:
- Continue dual-track: Webhooks are useful, but recovery, security, or Mac execution evidence is incomplete.
- Retire high-frequency polling: Webhook delivery, API confirmation, idempotency, reconciliation, and node behavior have passed the required tests.
- Retain Fastlane locally: Webhooks can replace status polling, but certificates, screenshots, plugins, metadata, or project-specific orchestration still have no equally reliable replacement.
A safer cost decision for the Mac execution layer
The current setup may be a shared developer Mac or a CI environment that combines Ruby dependencies, signing material, polling scripts, and build execution in one place. That approach can work, but it commonly leaves four weaknesses: the build worker becomes a single point of failure, permission scope expands across unrelated tasks, polling consumes API requests without proving release readiness, and an offline machine can leave the control plane unable to distinguish “not started” from “completed but not reported.”
A rented JexMac Mac environment is a better fit when the missing piece is a stable, isolated macOS execution surface for temporary release workloads or migration testing. It does not eliminate the need for Webhook security, API reconciliation, or signing governance. It gives the event-driven controller a defined Mac worker to validate instead of forcing the team to replace the entire release architecture at once.
If the acceptance result says “continue dual-track,” document the fallback and keep the old polling path narrow. If it says “retire high-frequency polling,” keep reconciliation and manual compensation available. Teams that need a temporary Mac build and signing surface can review the JexMac Mac rental options after the control-plane requirements are clear; the right purchase is the one that passes the same archive, signing, upload, interruption, and reconnection tests listed above.
Last updated August 31, 2026. Event types, HMAC validation, API permissions, build upload behavior, state definitions, rate-limit guidance, and API version information were checked against Apple Developer documentation and App Store Connect API Release Notes. Future Webhook events, retry rules, or permission changes remain subject to official confirmation.
Run Your Release Pipeline on a Remote Mac
Rent a dedicated Mac from JexMac to build, sign, upload, and validate your Apple platform releases on demand.