Automation Station
Multi-user cloud · one dedicated listener per member (not one shared farm)
First-run setup local cloud
- Data folder — where this PC saves users, sessions, and jobs (users.json / jobs.json).
- Admin account — your operator login (not Whop members).
- Listener EXE — build/publish the Windows worker so members can download it after login.
- Gmail Apps Scripts — deploy the two Google scripts (coupon + email verification) so mail can feed the listener.
This panel is for local cloud (npm run dev:cloud). On Vercel you set env vars instead (see the Vercel block below). Click any ? for step-by-step help.
Complete steps 1–4, then log in below. Click ? on each box for full directions (including how to add scripts in Google Apps Script).
1 · Data directory
- Pick an absolute folder path on this computer (not a relative path).
- Example Windows: C:\Users\You\cvs-automation-data
- The server creates the folder if needed and writes users.json and jobs.json there.
- That path is saved as CVS_DATA_DIR in local.setup.json (gitignored).
- Keep this folder backed up if you care about users/jobs. Deleting it wipes local accounts.
- Do not put this on a USB you unplug while the server runs.
Skip: use “Skip for now” to use default ./data under the project.
Absolute path for multi-tenant state on this PC.
2 · Admin account
- This creates (or reuses) a user with role admin and unlimited access.
- Use an email you control. Password must be at least 8 characters (longer is better).
- After Save, use the same email/password in the Member login card below.
- Admin can list/create users, set day limits, and manage Whop links via the API/UI.
- This is separate from Whop members — members register with their Whop email and stay pending until admitted.
- On Vercel production, prefer ADMIN_EMAIL / ADMIN_PASSWORD env vars instead of this disk wizard.
Operator login for this local control plane.
Public app URL optional
- Usually http://127.0.0.1:8787 for local cloud.
- Stored as a hint for listener config / personalized downloads (PUBLIC_APP_URL).
- If members will connect over a tunnel (ngrok, Cloudflare), put that HTTPS base URL here instead.
- Listeners use CLOUD_BASE_URL in their own config — this field does not force every listener automatically.
Base URL members/listeners should use to reach this cloud.
Save setup
- Save setup & create admin — writes local.setup.json, sets data dir, creates admin, keeps this panel open for Step 3.
- Then log in with that admin email/password in the card below.
- Skip for now — hides the wizard and uses default ./data (no custom path). You can reopen with #setup in the URL.
- If save fails, read the red message (missing path, short password, etc.).
3 · Listener EXE checking…
- Each member runs their own listener on their PC — not one shared farm for everyone.
- Same EXE binary for all; isolation is each user’s unique lt_… token + CloakBrowser profile.
- Publish the EXE so download buttons work after login: npm run build:listener:exe then npm run publish:listener-download
- Click Recheck listener EXE until status is ready.
- After admin login: onboarding / Listener tab → download EXE + personalized listener.config.json.
- Put both files in one folder → run EXE. Change settings later with EXE --setup.
- Production: host the EXE on GitHub Releases/R2 and set LISTENER_DOWNLOAD_URL (do not commit large binaries to git).
Checking whether CVS-Cloud-Listener.exe is published for member download…
EXE is available for authenticated download after login (each member gets the same binary + their token/config).
Open static /downloads/ EXE (optional)- Finish steps 1–2 and log in below with your admin email/password
- Use the onboarding guide → Download EXE + personalized listener.config.json
- Run the EXE on this PC · re-open settings anytime with --setup
EXE not published yet. Run these in the project folder:
npm run build:listener:exe npm run publish:listener-download
Then click Recheck. Production hosts: set LISTENER_DOWNLOAD_URL instead.
4 · Gmail Apps Scripts
You deploy two separate Web Apps (two projects). Do not mix them into one file. Gmail never shares your password with the listener — the script runs as you and returns JSON over HTTPS.
- Open script.google.com while signed into the Gmail that receives CVS mail.
- Click New project (do this twice — once per script below).
- Delete any sample code. Paste the full script (use Copy / Download on this page).
- Click the gear Project Settings → Script properties → Add script property:
- Coupon project: property name GMAIL_COUPON_SCRIPT_KEY, value = a long secret you invent.
- Verification project: property name CVS_VERIFIER_SCRIPT_KEY, value = another secret.
- Save the project (disk icon). Optional: rename the project “CVS Gmail Coupon” / “CVS email verification”.
- Deploy → New deployment → gear → type Web app.
- Description: e.g. “coupon v1”. Execute as: Me. Who has access: Anyone (required so the listener can call the URL; the key= secret still protects it).
- Click Deploy. Approve Google permissions if asked (Gmail read).
- Copy the Web app URL. Append your secret: ?key=YOUR_SECRET (coupon also needs &action=listCoupons&mode=recent).
- After you log into Automation Station: Email parsing → provider Gmail Apps Script → paste the coupon URL into Coupon script URL → Save. Keep the verification URL for preference-confirm workflows (separate field / notes).
- If you change the script later: Deploy → Manage deployments → Edit → New version → Deploy again (URL usually stays the same).
Test in browser: open the coupon URL with key + action — you should see JSON with success / items (not HTML login page).
Deploy each script as its own Google Web App, then paste URLs after login under Email parsing. Click ? for the full Google Apps Script walkthrough.
4a · CVS Gmail Coupon email_parser
- Reads ExtraCare / coupon emails from Gmail and returns them as JSON for the listener’s email_parser job.
- Script property: GMAIL_COUPON_SCRIPT_KEY = your secret.
- Deploy as Web app (Me / Anyone). Copy URL.
- Final URL example: https://script.google.com/macros/s/…/exec?key=YOUR_SECRET&action=listCoupons&mode=recent&limit=50
- In Automation Station after login: Email parsing → Gmail Apps Script → Coupon script URL → Save → enqueue email_parser.
- Supports mark-read actions used by the feed (action=listCoupons, modes unread/recent/all).
Paste this project’s Web app URL into Coupon script URL after login.
4b · CVS email verification script preference / confirm
- Separate script for “confirm your email preferences” / keep-receiving-offers messages (not coupon HTML parse).
- Returns items with verifyUrl for confirmation workflows.
- Script property: CVS_VERIFIER_SCRIPT_KEY = a different secret.
- Deploy as a second Web app project (do not replace the coupon project).
- URL example: https://script.google.com/macros/s/…/exec?key=YOUR_SECRET
- Do not paste this into the coupon URL field. Use it for preference-confirm jobs / notes after login.
Second project only — not used as the email_parser coupon feed URL.
Files also live under /appscript/ and scripts/appscript/. More detail after login under Email parsing → Gmail Apps Script.
On Vercel? hosted
- This disk wizard does not run on Vercel (no durable local folder for all instances).
- In Vercel → Project → Settings → Environment Variables (Production), set: ADMIN_EMAIL, ADMIN_PASSWORD (≥ 8 chars), optional PUBLIC_APP_URL, optional LISTENER_DOWNLOAD_URL.
- Redeploy after changing env. Log in on your *.vercel.app site with that admin email/password.
- User data on serverless is ephemeral unless you add a real database later.
- Git commits must use a GitHub-linked email (noreply is fine) so deploys are not blocked.
Hosted: set ADMIN_EMAIL / ADMIN_PASSWORD and LISTENER_DOWNLOAD_URL in the Vercel dashboard — not this local disk form.
Sign in
Each member gets a private queue, settings, and Windows listener with their own token — never another member’s jobs. On hosted deploys, accounts are Whop members only (same email as Whop). Local admin can sign in after first-run setup.
Signed in
Get your listener running
Your dedicated listener — not a shared office listener. Same EXE for everyone; isolation is your token + CloakBrowser profile folder on this PC.
Checking availability…
Download Cloud-Listener.exeDownload a ready-to-use listener.config.json (token filled in). Put it next to the EXE. Change settings later with EXE --setup.
- Place EXE + listener.config.json in the same folder
- Double-click the EXE (or run with --setup to edit settings anytime)
- Leave it running — it only claims your jobs
You’re set. Use the Listener tab anytime to re-download config or tweak preferences. Job settings (email, coupons, accounts) are in the other tabs.
one_member_one_listener You run your listener on your PC. Runtime settings live in listener.config.json next to the EXE (not shared with other members). Re-download below or run EXE --setup anytime.
That’s for the cloud control plane (where users/jobs are stored), not the listener EXE. Local: first-run wizard / local.setup.json. Vercel: env vars + future durable DB — not a folder path on the serverless host.
Pick how the listener fetches mail. Only fields for the selected provider are shown.
Listener connects over IMAP (typically SSL port 993). Use an app-specific password if your host requires 2FA.
There are two official Google Apps Scripts. Deploy each as its own Web App in script.google.com (Execute as: Me · Who has access: Anyone). Paste URLs with ?key=YOUR_SECRET after you set the script property.
- Open script.google.com → New project (once per script)
- Paste the script → Project Settings → Script properties → set the secret key name listed below
- Deploy → New deployment → Web app → Me / Anyone → Deploy → copy URL
- URL form: https://script.google.com/macros/s/…/exec?key=YOUR_SECRET
Feeds CVS ExtraCare / coupon emails to the listener for email_parser. Supports action=listCoupons, modes unread/recent/all, and mark-read. Script property: GMAIL_COUPON_SCRIPT_KEY
This is the only URL saved under Email parsing. Query tip: append &action=listCoupons&mode=recent&limit=50 if not already in the URL.
Separate script for CVS “confirm your email preferences” / keep-receiving-offers messages. Returns verifyUrl items for verification workflows (not the coupon parser). Script property: CVS_VERIFIER_SCRIPT_KEY
Saved in browser notes for now (localStorage). Use when you wire preference-confirm jobs; do not paste this into the coupon URL field above.
Provider none: no live mailbox fetch. You can still enqueue email_parser with HTML/text in the job payload for heuristic parse (tests / dry runs).
Birthday/ExtraBucks use Send $X to Card; never mark activated without a real click.
One proxy URL per line (or commas). When enabled, each job picks one from the pool (stable by job id). Leave blank and uncheck if you do not use proxies. Saved proxies with credentials are masked after load — re-paste the list to replace.
Enqueue work for your listener only.