Diagnosing and Staging a Critical Deposit Outage: Apps Script Access Control and Deployment Strategy
During a June 2026 operations session, we discovered a complete stoppage affecting all booking deposit flows across 11 event pages on sailjada and queenofsandiego.com. The Reserve widgets were returning HTTP 403 and 404 errors, silencing every inbound deposit attempt. This post details the diagnosis methodology, infrastructure state inspection, and the staged fix that restores revenue flow.
The Problem: Silent Booking Funnel Collapse
The symptom was stark: every public event page calling the Apps Script deployment endpoint was receiving either a 403 Forbidden or 404 Not Found response. Users clicking "Reserve" encountered dead buttons. Critically, there was no alerting on this—the funnel was dark, meaning unknown revenue loss.
Two distinct endpoints were affected:
https://script.google.com/macros/s/AKfycbxUK...44Pme8wCA/exec— serving 10 event pages, returning 403https://script.google.com/macros/s/AKfycbx_...AFsLWaO3/exec— worship event, returning 404
The 403 indicated access revocation; the 404 suggested a deleted or undeployed Apps Script resource entirely.
Diagnosis: Tracing the Request Chain
We approached this systematically by following the request path backward:
Step 1: Verify Live Endpoint State
curl -v https://script.google.com/macros/s/AKfycbxUK...44Pme8wCA/exec
# Response: 403 Forbidden
curl -v https://script.google.com/macros/s/AKfycbx_...AFsLWaO3/exec
# Response: 404 Not Found
Step 2: Locate Project ID in Infrastructure
We searched the jada-ops directory structure and source repos for references to the Apps Script project. The key was finding the clasp configuration (Google Apps Script command-line tool uses .clasp.json):
grep -r "1dDpSK8JZda7XUpKIGlyyAX19KLL4JqFjYVtpcunB5ZE3-NMX_9v0lQJ5" ~/Library/Mobile\ Documents/com~apple~CloudDocs/jada-ops/
grep -r "AKfycbxUK" ~/Documents/repos/
This revealed that the project ID 1dDpSK8JZda7XUpKIGlyyAX19KLL4JqFjYVtpcunB5ZE3-NMX_9v0lQJ5 was the canonical Apps Script resource. The /exec URLs are *deployment* endpoints derived from that project—distinct from the project itself.
Step 3: Inspect Deployment Access Control
The project ID doesn't tell us who can call the endpoint. That's controlled inside the Google Apps Script console via the deployment settings. We couldn't verify the live console state remotely, but the 403 response strongly indicated the deployment had been set to "Anyone with the link" or a restricted audience that no longer included public anonymous access.
Root Cause Analysis
Apps Script deployments have two critical access-control settings:
- Who has access: "Anyone", "Anyone with the link", "Specific people", or private
- Execute as: "Me" (the deployer's identity) or "User accessing the app"
A 403 response occurs when the deployment's access control denies the caller. The most likely cause: the deployment was set to "Specific people" or a user-only access model that doesn't include anonymous public traffic.
The 404 on the worship endpoint suggested that deployment was deleted entirely—possibly during a manual cleanup or re-organization of the Apps Script project.
Staged Fix: Access Control Restoration
The fix is a single action in the Google Apps Script console, no code changes or redeployment of our source:
- Navigate to
script.google.com - Open the project
1dDpSK8JZda7XUpKIGlyyAX19KLL4JqFjYVtpcunB5ZE3-NMX_9v0lQJ5 - Go to Deploy → Manage deployments
- For each deployment:
- Click the deployment (or "New deployment")
- Set Who has access = "Anyone"
- Set Execute as = "Me"
- Click Deploy
This restores public anonymous access to the `/exec` endpoint without requiring a code change. The deployment ID itself remains stable, so all 11 event pages' hardcoded `/exec` URLs continue to work.
Why This Approach?
Minimal risk: No code changes, no source repo redeploy, no CloudFront cache invalidation. The endpoint URL remains identical; we're only adjusting who can call it.
Revenue impact: This is a complete stoppage affecting every deposit entry point. The fix is reversible in seconds and has zero infrastructure dependencies.
Avoided complexity: We considered re-deploying the Apps Script to create new deployment IDs, but that would require updating all 11 event pages in the S3 HTML/CSS, invalidating CloudFront cache, and re-testing. By restoring access on the existing deployment, we skip all of that.
Infrastructure Context
The deposit flow architecture:
- Event pages: Stored in S3 buckets (sailjada and queenofsandiego.com CloudFront distributions)
- Reserve button: JavaScript in the HTML directly calls the Apps Script endpoint via HTTPS
- Apps Script deployment: Hosted at Google, returning 403 or 404 due to access control
- No Lambda, no API Gateway, no DynamoDB involved in the deposit flow itself — it's a direct client-to-Google call
This simplicity is a strength: the outage is isolated to Apps Script permissions, not a wider infrastructure issue.
Verification and Next Steps
After the fix is applied in the Google console, we verify by re-testing both endpoints:
curl -v https://script.google.com/macros/s/AKfycbxUK...44Pme8wCA/exec
# Should return 200 (or the Apps Script response, not 403)
curl -v https://script.google.com/macros/s/AKfycbx_...AFsLWaO3/exec
# Should return 200 (or re-create the deployment if still 404)
If the 404 persists, we redeploy the worship endpoint from source. If both return 200, the booking funnel is live again.
This fix should take 2–3 minutes in the Google console and restore revenue flow across all 11 event pages immediately.
```