This is what you need to do tomorrow to take the operators flyer from console-only logging to real submissions arriving in your queue. Three endpoints to configure, all in operators.html, all near the top of the script block.
The three constants you'll edit live around line 1175 of operators.html:
const ENDPOINT = '';
const LOCKOUT_CHECK_ENDPOINT = '';
const LOCKOUT_RECORD_ENDPOINT = '';
Replace the empty strings with the URLs from your form provider. The flyer keeps working with all three blank — submissions just log to the browser console — so you can wire them in piecemeal.
This is the URL the form posts to when a candidate completes all 5 gates and submits. Sets ENDPOINT.
platform, channel_raw, channel_handle, channel_url, audience_tier, channel_age, scenarios_correct, fit, other, direct_access.https://app.kit.com/forms/{FORM_ID}/subscriptions.ENDPOINT.Tally gives you a webhook URL after creating a form. Paste it as ENDPOINT. Their structure auto-creates a Google Sheet.
Endpoint format: https://submit-form.com/{FORM_ID}. Paste as ENDPOINT.
These are optional but recommended. Without them, the lockout works per-browser — a determined chancer can clear cookies and retry. With them, the lockout works cross-device, cross-browser.
You need two URLs:
The form POSTs an email + channel pair before showing step 3. Should return JSON:
POST → { email, channel }
Response → { locked: true|false, expires: ISO8601, reason: string }
If locked: true, the candidate sees the blocked screen.
The form POSTs when a candidate fails any automated gate. Records the rejection.
POST → { email, channel, reason, expires: ISO8601 }
Response → { ok: true }
email | channel | reason | expires.doPost handlers for the two endpoints above (I can write this for you when you're ready — ask).LOCKOUT_RECORD_ENDPOINT (and the same URL with a different action param is your LOCKOUT_CHECK_ENDPOINT).Leave both endpoints blank. The localStorage lockout still works on the device the candidate first applied from. Cleared if they clear cookies, but raises friction enough to filter casual retry attempts. Acceptable for a recruitment cycle that runs for a finite period.
The review queue page (review.html) reads submissions from a JSON or CSV file you import manually. Two ways to populate it:
review.html. Click Import submissions.When you're ready, the queue can be upgraded to fetch submissions directly from your form provider's API. That requires an authenticated API call, which we'd add to the script block. Defer until you've used the manual export flow for a couple of weeks and confirm what's actually useful.
ENDPOINT only. Open operators.html in a browser. Complete a full submission. Confirm it lands in your form provider.review.html. Confirm it renders correctly with all gates, scenarios, fit text.?demo=1 to review.html URL to load three demo candidates and click through the full decision flow.Order of priority:
1. Wire ENDPOINT. This alone makes the form functional.
2. Use the review queue with manual exports. Get a feel for the flow.
3. Add the lockout endpoints if cold inbound becomes a problem.
4. Add live API integration only if manual export becomes a bottleneck.
Bitcoin Storm · thebitcoinstorm.io · Operator pipeline handoff