Enter your admin password.
This admin panel manages licenses for all Entertainment IT products (Timer Pro, HyperDeck Backup, etc.). It connects to a Cloudflare Worker API backed by a Supabase (PostgreSQL) database.
How licensing works: When a customer purchases a product, the system creates a license key (XXXXX-XXXXX-XXXXX-XXXXX). The customer enters this key in the app. The app calls our server on every launch to validate the key, register the machine, and check expiration. Each license has a maximum number of machines it can be activated on (e.g. 2 for Timer Pro, 1 for HyperDeck).
License types: Paid = purchased license. Trial = free trial (configurable duration per product). Demo = permanent demo for sales/trade shows.
License statuses: Active = valid and working. Trial = trial period running. Expired = past expiration date. Revoked = manually disabled by admin.
Shows summary statistics across all products: total licenses, active, trial, expired, revoked counts. Also shows per-product breakdown and any licenses expiring within 7 days that may need attention.
Search: Type to search by license key, customer name, email, or company name.
Filters: Filter by status, type, product, company, or expiry timeframe. All filters combine (AND logic).
Group by Company / Customer: Collapses licenses into groups with headers. Useful for seeing all of a company's or customer's licenses together.
Create License: Click "+ Create License". Fill in customer email (required), name, product, type, duration, max machines. Optionally assign to a company. Toggle whether to email the key to the customer.
Click any row to open the license detail modal.
Clicking a license row opens the detail modal showing all information, active machines, add-ons, and event history.
Extend: Add days to the license. If the license is expired or revoked, it reactivates and adds days from today.
Revoke: Immediately disables the license. All machines are deactivated. The user will see a "revoked" message in the app.
Release All Machines: Deactivates all machines without changing the license status. The user will need to re-activate the app. Useful when a customer gets a new computer.
Assign (company licenses): Assign this license to a specific employee by email. Creates the user if they don't exist.
Unassign (company licenses): Return the license to the company pool. All machines are released.
+ Add-On: Attach an add-on (like "web-access") to this license. Choose paid or trial.
Remove Add-On: Removes an add-on from the license. The feature is disabled immediately in the app.
What is a company? A company is an organization that owns multiple licenses. Instead of each employee buying their own license, the company buys a pool of licenses and assigns them to employees.
Setting up a company:
1. Go to the Companies tab → click "+ Create Company". Enter the company name, domain (e.g. "xyzcompany.com"), and contact info.
2. Go to Licenses tab → click "+ Create License". Select the company from the Company dropdown. Create as many licenses as needed.
3. Each license starts as unassigned (in the company pool).
4. Open a license detail → click "Assign" → enter the employee's email. They can now activate the app with that key.
When an employee leaves: Open their license → click "Unassign". This releases all machines and returns the license to the pool. Then assign it to the replacement employee.
Company Portal: Company admins can also self-manage at portal.entertainmentit.co. They log in via magic link (email). To make someone a company admin, set their role to admin in the customers table in Supabase.
What are add-ons? Optional paid features that attach to an existing license. The current add-on is Web Access ($60/year) which unlocks web tunnels, remote viewer, remote control, and Q&A features in Timer Pro.
How add-ons work: When a customer's app calls our server to validate their license, the response includes a features[] array listing active add-ons. The app checks this array to enable/disable features.
Attaching an add-on: Open a license detail → click "+ Add-On" → enter the slug (e.g. "web-access") → choose paid or trial.
Trial: Web Access has a 3-day trial. One trial per license — once used, they must purchase.
Removing: Click "Remove" next to the add-on in the license detail. Feature is disabled immediately.
Bundle product: "Timer Pro + Web Access Bundle" ($79.99/year) includes both Timer Pro and Web Access in one purchase.
View and edit product settings: name, price (in cents), trial days, subscription duration, max devices, trial enabled toggle. Changes take effect immediately — no deploy needed.
Price is in cents. $29.99 = 2999. $365.00 = 36500.
The Campaigns tab is a built-in email builder (like Constant Contact) for sending updates and announcements to the people who own your software — for example, "A new version is out, download the latest to keep going."
💡 Tip: Always click Send Test to Me first and check it in your own inbox before sending to everyone.
Build & send a campaign — step by step:
1. Open the Campaigns tab → click + New Campaign.
2. Enter a Campaign name (internal only — recipients never see it) and a Subject line.
3. Write your email in the editor. Use the toolbar for bold/italic, headings, colors, lists, alignment, links, images (📷 uploads and inserts a picture), and a Button (a clickable call-to-action, e.g. "Download the latest version").
4. Audience (right side): pick which products (or "All products") and which license statuses (Active, Trial, Expired). The Recipients count updates live. Unsubscribed customers are always excluded automatically.
5. Add personalization by clicking a tag under "Insert personalization" — it drops a token where your cursor is and we fill it in for each person (see table below).
6. (Optional) Set a Reply-To address and/or a Schedule date & time to send later.
7. Click Send Test to Me to preview, then Send Now (or, if you set a schedule, the button becomes the scheduled send). You can also Save Draft to finish later, or Save as Template to reuse the design.
Personalization tags:
| Click to insert | Becomes, per recipient |
|---|---|
| First name | The customer's first name (falls back to "there") |
| Full name | The customer's full name |
| Their email address | |
| Product | The product name they own |
| License key | Their (primary) license key |
| Expiry date | When their license expires |
| All products (list) | A comma-formatted list of everything they own, e.g. "Timer Pro, Show Sounds, and HyperDeck Backup" |
| License key blocks | A styled block for each product they own — product name, key, expiry, and a download button. Great for "update everything" emails. |
💡 Preview: Click Preview in the composer to see the exact branded email (with sample name/products/keys), and toggle Desktop/Mobile. Send Test to Me does the same in your real inbox.
Brand: The Brand button (top of the tab) controls the header logo, accent color, wordmark, and footer for all emails — campaigns and license-key emails alike. Upload a logo or set a wordmark, pick your accent, and Save.
Stats: Once a campaign is sent, click Stats on its row to see delivered, bounced, unique opens, unique clicks, unsubscribes, spam reports (with rates), and a breakdown of which links recipients clicked.
⚠️ One-time setup for stats: Opens/clicks only record after you enable them in Resend: (1) Resend dashboard → your sending domain → turn on open & click tracking; (2) Resend → Webhooks → add https://timerpro-license.devsupport-ea0.workers.dev/license/resend-webhook and subscribe to delivered/bounced/complained/opened/clicked; (3) add the webhook's signing secret to the worker as RESEND_WEBHOOK_SECRET. Delivered/bounced/unsubscribed work without open/click tracking.
Templates & history: The Templates button (top of the tab) manages saved designs. The campaign list shows drafts, scheduled, and sent campaigns with recipient and sent counts — your full send history.
⚠️ Note: Every email automatically includes an Unsubscribe link (required by law). Anyone who unsubscribes is permanently skipped on future campaigns. Scheduled campaigns are sent by a background job that runs every few minutes, so the actual send may start a few minutes after the scheduled time.
⚠️ One-time setup: Campaigns need a database table. If the tab shows "run supabase-campaigns-migration.sql", an admin must run that file once in the Supabase SQL editor.
Customer says their key doesn't work: Search by key or email in the Licenses tab. Check the status — it may be expired, revoked, or at max activations.
Customer hit max activations: Open the license → Release All Machines, or release specific machines. They can then re-activate on a new machine.
Customer didn't receive their key after purchase: Check if the Squarespace order was processed. Manually trigger: curl -X POST https://timerpro-license.devsupport-ea0.workers.dev/license/poll-orders -H "Authorization: Bearer YOUR_LICENSE_API_SECRET". Or just create the license manually.
Transfer a company license to a new employee: Open license detail → Unassign (releases machines) → Assign to new employee's email.
Change product pricing or trial duration: Go to Products tab, edit the values, click Save Changes.
Deploy worker changes: cd license-worker && wrangler deploy
Update this admin panel: Edit website/admin-panel.html, then replace the code block content on Squarespace.
Adds days from current expiry (or from today if expired/revoked). Reactivates automatically.
Assign to an employee. They'll be linked to the company.
Sends one copy with sample personalization so you can preview it. Does not affect your audience.
Controls the header, accent color, and footer on every email — campaigns and license-key emails alike.