For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (
- [ ]) syntax for tracking.
Goal: Add a standalone /trial page (DE+EN) to website v3 that collects name/email/company, writes to the existing Google Sheet, and emails max@getorcha.com. All "Trial starten" / "Start trial" CTAs in v3 chrome route to the new page instead of app.getorcha.com.
Architecture: Two static HTML pages (www/v3/de/trial/, www/v3/en/trial/) post to the existing Google Apps Script web app (single deployment shared with newsletter + topic forms). New formType: 'trial' branch on the server appends to a Trial Requests sheet and sends a notification email. Client-side honeypot, no CAPTCHA. Vanilla JS, no framework.
Tech Stack: Static HTML/CSS, vanilla JS (fetch + no-cors), Google Apps Script, Google Sheets.
Spec: docs/superpowers/specs/2026-05-13-trial-signup-form-design.md
Verification approach: Static website with no test framework. "Tests" are browser-based verification steps + curl checks. Each task has explicit verification before commit.
Spec deviations adopted in this plan:
_hp (not website) to match the existing convention in www/js/community-forms.js:7. Server-side check is unnecessary because the client never sends the request when _hp is filled.mode: 'no-cors' + Content-Type: text/plain (opaque response, assume success on non-network-error) β matches existing community-forms pattern. No JSON response parsing.Files:
Modify: www/FORM_SETUP.md
Deploy (out-of-repo): the Google Apps Script attached to the "Orcha Community Forms" sheet
Step 1: Add the new sheet tab manually
Open the "Orcha Community Forms" Google Sheet. Create a new tab named exactly Trial Requests. Add headers in row 1:
Timestamp | Name | Email | Company | Notes | Language | User-Agent | Referrer
In www/FORM_SETUP.md, find the doPost code block (around the formType === 'topic' branch) and add a third branch. Replace the existing doPost function with:
```javascript
function doPost(e) {
var lock = LockService.getScriptLock();
lock.tryLock(10000);
try {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var data = JSON.parse(e.postData.contents);
var formType = data.formType;
if (formType === 'newsletter') {
var sheet = ss.getSheetByName('Newsletter');
sheet.appendRow([
new Date().toISOString(),
data.email
]);
} else if (formType === 'topic') {
var sheet = ss.getSheetByName('Topic Requests');
sheet.appendRow([
new Date().toISOString(),
data.topic,
data.details
]);
} else if (formType === 'trial') {
var sheet = ss.getSheetByName('Trial Requests');
sheet.appendRow([
new Date().toISOString(),
data.name || '',
data.email || '',
data.company || '',
data.notes || '',
data.language || '',
data.userAgent || '',
data.referrer || ''
]);
MailApp.sendEmail({
to: 'max@getorcha.com',
subject: 'π Trial-Anfrage: ' + (data.company || 'Unbekannt') + ' (' + (data.language || '?') + ')',
body: [
'Neue Trial-Anfrage von der Website:',
'',
'Name: ' + (data.name || ''),
'Email: ' + (data.email || ''),
'Firma: ' + (data.company || ''),
'Sprache: ' + (data.language || ''),
'',
'Was mΓΆchten sie testen:',
(data.notes || '(keine Angabe)'),
'',
'User-Agent: ' + (data.userAgent || ''),
'Referrer: ' + (data.referrer || ''),
'',
'Antworten: mailto:' + (data.email || '')
].join('\n')
});
} else {
return ContentService.createTextOutput(
JSON.stringify({ result: 'error', message: 'Unknown form type' })
).setMimeType(ContentService.MimeType.JSON);
}
return ContentService.createTextOutput(
JSON.stringify({ result: 'success' })
).setMimeType(ContentService.MimeType.JSON);
} catch (error) {
return ContentService.createTextOutput(
JSON.stringify({ result: 'error', message: error.toString() })
).setMimeType(ContentService.MimeType.JSON);
} finally {
lock.releaseLock();
}
}
```
Also add a new section to FORM_SETUP.md after the "Step 1: Create the Google Sheet" section explaining the Trial Requests tab columns. And in the "Form fields" reference section (if one exists; otherwise create one at the bottom), document the trial formType:
### `trial` form
Posted from the v3 `/trial/` pages. Body fields:
- `formType`: `"trial"`
- `name`: string (full name)
- `email`: string
- `company`: string
- `notes`: string (optional, what they want to try)
- `language`: `"de"` or `"en"`
- `userAgent`, `referrer`: light context for the notification email
Side effects:
- Appends row to `Trial Requests` sheet
- Sends email notification to max@getorcha.com (German subject + body, regardless of submission language β Max reads them)
`MailApp` daily quota on free Google accounts is ~100 recipients/day. Not a constraint at expected trial volume.
In the "Orcha Community Forms" Apps Script editor:
Code.gs with the JavaScript block from Step 2 above.Add trial formType (2026-05-13).Important: if the Web app URL does change (e.g., you accidentally clicked "New deployment" instead of editing the existing one), you must update the APPS_SCRIPT_URL constant in www/js/community-forms.js:3 AND in the new www/v3/js/trial-form.js we'll create in Task 4. The existing community newsletter form would break otherwise.
Run from your terminal β replace <URL> with the deployed exec URL (the one from community-forms.js):
curl -L -X POST '<URL>' \
-H 'Content-Type: text/plain' \
-d '{
"formType": "trial",
"name": "Test Tester",
"email": "test@example.com",
"company": "Test Co",
"notes": "Smoke test from terminal",
"language": "de",
"userAgent": "curl",
"referrer": "manual-test"
}'
Expected:
{"result":"success"} (after the redirect Apps Script does).Trial Requests sheet with those values.π Trial-Anfrage: Test Co (de).Delete the test row from the sheet after verifying.
git add www/FORM_SETUP.md
git commit -m "docs: add trial formType to Apps Script + setup guide
- New 'Trial Requests' sheet tab
- doPost branch appends row + emails max@getorcha.com
- Honeypot enforced client-side (matches newsletter pattern)"
Files:
Create: www/v3/css/trial.css
Step 1: Write the stylesheet
Create www/v3/css/trial.css with:
/* Trial signup page β form-specific styles */
.trial-hero {
padding: 80px 0 24px;
}
.trial-card {
max-width: 560px;
margin: 0 auto 80px;
padding: 32px;
border: 1px solid var(--line, #e5e5e5);
border-radius: 12px;
background: var(--bg, #fff);
}
.trial-form .field {
display: flex;
flex-direction: column;
gap: 6px;
margin-bottom: 18px;
}
.trial-form label {
font-family: var(--mono);
font-size: 11px;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--ink-2, #555);
}
.trial-form input,
.trial-form textarea {
font: inherit;
font-size: 15px;
padding: 10px 12px;
border: 1px solid var(--line, #d4d4d4);
border-radius: 8px;
background: #fff;
color: var(--ink, #111);
transition: border-color .15s ease, box-shadow .15s ease;
}
.trial-form input:focus,
.trial-form textarea:focus {
outline: none;
border-color: var(--accent, #0a0a0a);
box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.06);
}
.trial-form textarea {
resize: vertical;
min-height: 80px;
}
.trial-form .field-hint {
font-size: 12px;
color: var(--muted, #888);
}
.trial-form .hp {
position: absolute;
left: -9999px;
width: 1px;
height: 1px;
opacity: 0;
}
.trial-form .submit-row {
margin-top: 24px;
display: flex;
gap: 12px;
align-items: center;
}
.trial-form button[type="submit"] {
font: inherit;
padding: 10px 20px;
border-radius: 999px;
background: var(--ink, #111);
color: var(--bg, #fff);
border: 0;
cursor: pointer;
font-size: 14px;
font-weight: 500;
transition: opacity .15s ease;
}
.trial-form button[type="submit"]:disabled {
opacity: 0.5;
cursor: wait;
}
.trial-form .form-error {
color: #c0392b;
font-size: 13px;
margin-top: 12px;
}
.trial-form .form-error.hidden,
.trial-success.hidden {
display: none;
}
.trial-success {
text-align: center;
}
.trial-success .check {
font-size: 32px;
color: #2ecc71;
margin-bottom: 8px;
}
.trial-success h2 {
margin: 0 0 12px;
}
.trial-success p {
color: var(--ink-2, #555);
margin: 8px 0;
}
.trial-next {
max-width: 720px;
margin: 0 auto 100px;
}
.trial-next h2 {
font-family: var(--mono);
font-size: 11px;
letter-spacing: 0.16em;
text-transform: uppercase;
color: var(--accent);
margin-bottom: 16px;
}
.trial-next ol {
padding-left: 20px;
line-height: 1.7;
}
.trial-next li + li {
margin-top: 8px;
}
ls -la www/v3/css/trial.css
Expected: file exists, ~80 lines.
Open in a browser later (Task 3 verifies styles render). No standalone verification needed here.
git add www/v3/css/trial.css
git commit -m "feat(v3): trial form stylesheet"
Files:
Create: www/v3/de/trial/index.html
Step 1: Create the directory
mkdir -p www/v3/de/trial
Create www/v3/de/trial/index.html:
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="robots" content="noindex, nofollow" />
<title>Trial anfragen β Orcha</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Geist:wght@300;400;500;600;700&family=Geist+Mono:wght@400;500;600&display=swap">
<link rel="stylesheet" href="../../css/v3.css?v=checklist">
<link rel="stylesheet" href="../../css/product.css?v=checklist">
<link rel="stylesheet" href="../../css/trial.css?v=checklist">
</head>
<body>
<div id="site-header"></div>
<section class="trial-hero">
<div class="wrap" style="text-align: center;">
<span class="eyebrow">Trial</span>
<h1 class="h-section italic-swap" style="margin-top: 12px;">Trial <em>anfragen</em>.</h1>
<p class="lede" style="max-width: 560px; margin: 16px auto 0;">
Wir richten Ihre Testumgebung manuell ein β mit Ihren Beispieldaten und einer
kurzen Demo, damit Sie direkt loslegen kΓΆnnen.
</p>
</div>
</section>
<section>
<div class="wrap">
<div class="trial-card">
<form id="trial-form" class="trial-form" novalidate>
<input type="hidden" name="language" value="de">
<!-- Honeypot: hidden from humans, bots fill it. -->
<div class="hp" aria-hidden="true">
<label for="trial-hp">Website</label>
<input type="text" name="_hp" id="trial-hp" tabindex="-1" autocomplete="off">
</div>
<div class="field">
<label for="trial-name">Name</label>
<input type="text" name="name" id="trial-name" required autocomplete="name">
</div>
<div class="field">
<label for="trial-email">Firmen-E-Mail</label>
<input type="email" name="email" id="trial-email" required autocomplete="email">
</div>
<div class="field">
<label for="trial-company">Unternehmen</label>
<input type="text" name="company" id="trial-company" required autocomplete="organization">
</div>
<div class="field">
<label for="trial-notes">Was mΓΆchten Sie testen? <span style="text-transform: none; letter-spacing: 0;">(optional)</span></label>
<textarea name="notes" id="trial-notes" placeholder="z.B. Kreditoren-Workflow mit ein paar echten Rechnungen"></textarea>
<span class="field-hint">Hilft uns, die Demo gezielt vorzubereiten.</span>
</div>
<div class="submit-row">
<button type="submit" data-loading="Sendenβ¦">Trial anfragen</button>
</div>
<p class="form-error hidden" id="trial-error">
Etwas ist schiefgelaufen. Bitte schreiben Sie uns direkt an
<a href="mailto:max@getorcha.com">max@getorcha.com</a>.
</p>
</form>
<div class="trial-success hidden" id="trial-success">
<div class="check">β</div>
<h2>Danke, <span id="trial-success-name">!</span></h2>
<p>Wir haben Ihre Anfrage erhalten. Unser Team meldet sich innert 24 Stunden mit den Zugangsdaten fΓΌr Ihre Testumgebung.</p>
<p style="font-size: 13px;">Bei Fragen: <a href="mailto:max@getorcha.com">max@getorcha.com</a></p>
</div>
</div>
</div>
</section>
<section class="trial-next">
<div class="wrap">
<h2>Was passiert als NΓ€chstes</h2>
<ol>
<li>Sie schicken das Formular ab.</li>
<li>Wir richten Ihre Testumgebung mit passenden Beispieldaten ein.</li>
<li>Sie erhalten innert 24 Stunden eine E-Mail mit den Login-Daten und einer kurzen EinfΓΌhrung.</li>
</ol>
</div>
</section>
<div id="site-footer"></div>
<script src="../../js/chrome.de.js" defer></script>
<script src="../../js/trial-form.js" defer></script>
</body>
</html>
Open in a browser:
open "file:///Users/maximilianbrandstaetter/Orcha/www/v3/de/trial/index.html"
Expected:
Page loads with v3 chrome (header + footer injected by chrome.de.js)
Eyebrow "Trial" + headline "Trial anfragen." render correctly
Form card visible with 4 fields (name, email, company, notes) and a "Trial anfragen" button
"Was passiert als NΓ€chstes" section with 3-step ordered list below
Submit button does nothing yet (trial-form.js doesn't exist) β that's fine for now
No console errors except possibly a 404 for trial-form.js (which Task 5 fixes)
Step 4: Commit
git add www/v3/de/trial/index.html
git commit -m "feat(v3): German trial signup page"
Files:
Create: www/v3/en/trial/index.html
Step 1: Create the directory
mkdir -p www/v3/en/trial
Create www/v3/en/trial/index.html. Same structure as DE, English copy, lang="en", and chrome.js (not chrome.de.js):
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="robots" content="noindex, nofollow" />
<title>Request a trial β Orcha</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Geist:wght@300;400;500;600;700&family=Geist+Mono:wght@400;500;600&display=swap">
<link rel="stylesheet" href="../../css/v3.css?v=checklist">
<link rel="stylesheet" href="../../css/product.css?v=checklist">
<link rel="stylesheet" href="../../css/trial.css?v=checklist">
</head>
<body>
<div id="site-header"></div>
<section class="trial-hero">
<div class="wrap" style="text-align: center;">
<span class="eyebrow">Trial</span>
<h1 class="h-section italic-swap" style="margin-top: 12px;">Request a <em>trial</em>.</h1>
<p class="lede" style="max-width: 560px; margin: 16px auto 0;">
We set up your test environment manually β with your sample data and a short
walkthrough so you can hit the ground running.
</p>
</div>
</section>
<section>
<div class="wrap">
<div class="trial-card">
<form id="trial-form" class="trial-form" novalidate>
<input type="hidden" name="language" value="en">
<div class="hp" aria-hidden="true">
<label for="trial-hp">Website</label>
<input type="text" name="_hp" id="trial-hp" tabindex="-1" autocomplete="off">
</div>
<div class="field">
<label for="trial-name">Name</label>
<input type="text" name="name" id="trial-name" required autocomplete="name">
</div>
<div class="field">
<label for="trial-email">Work email</label>
<input type="email" name="email" id="trial-email" required autocomplete="email">
</div>
<div class="field">
<label for="trial-company">Company</label>
<input type="text" name="company" id="trial-company" required autocomplete="organization">
</div>
<div class="field">
<label for="trial-notes">What do you want to try? <span style="text-transform: none; letter-spacing: 0;">(optional)</span></label>
<textarea name="notes" id="trial-notes" placeholder="e.g. AP workflow with a few real invoices"></textarea>
<span class="field-hint">Helps us prepare a focused demo.</span>
</div>
<div class="submit-row">
<button type="submit" data-loading="Sendingβ¦">Request trial</button>
</div>
<p class="form-error hidden" id="trial-error">
Something went wrong. Please email us directly at
<a href="mailto:max@getorcha.com">max@getorcha.com</a>.
</p>
</form>
<div class="trial-success hidden" id="trial-success">
<div class="check">β</div>
<h2>Thanks, <span id="trial-success-name">!</span></h2>
<p>We've received your request. Our team will get back to you within 24 hours with the login details for your test environment.</p>
<p style="font-size: 13px;">Questions: <a href="mailto:max@getorcha.com">max@getorcha.com</a></p>
</div>
</div>
</div>
</section>
<section class="trial-next">
<div class="wrap">
<h2>What happens next</h2>
<ol>
<li>You submit the form.</li>
<li>We set up your test environment with matching sample data.</li>
<li>You receive an email within 24 hours with login details and a short walkthrough.</li>
</ol>
</div>
</section>
<div id="site-footer"></div>
<script src="../../js/chrome.js" defer></script>
<script src="../../js/trial-form.js" defer></script>
</body>
</html>
open "file:///Users/maximilianbrandstaetter/Orcha/www/v3/en/trial/index.html"
Expected:
English chrome (chrome.js injects English header + footer)
"Request a trial." headline, "Request trial" button
3-step "What happens next" list in English
Same caveat: submit does nothing yet
Step 4: Commit
git add www/v3/en/trial/index.html
git commit -m "feat(v3): English trial signup page"
Files:
Create: www/v3/js/trial-form.js
Step 1: Write trial-form.js
Create www/v3/js/trial-form.js:
// Trial form β submits to the shared Google Apps Script.
// Keep this URL in sync with www/js/community-forms.js if the Apps Script is ever redeployed.
(function () {
var APPS_SCRIPT_URL = 'https://script.google.com/macros/s/AKfycbxuKohHoYi8s0FOWgV5frLUxyigjyf1KoC_UyzqLL2Bk0hzMJGROMdoZ7sU3ufHfUdL/exec';
function init() {
var form = document.getElementById('trial-form');
if (!form) return;
form.addEventListener('submit', function (e) {
e.preventDefault();
var name = form.querySelector('[name="name"]').value.trim();
var email = form.querySelector('[name="email"]').value.trim();
var company = form.querySelector('[name="company"]').value.trim();
var notes = form.querySelector('[name="notes"]').value.trim();
var language = form.querySelector('[name="language"]').value;
var hp = form.querySelector('[name="_hp"]').value;
var successEl = document.getElementById('trial-success');
var errorEl = document.getElementById('trial-error');
var btn = form.querySelector('button[type="submit"]');
// Honeypot β bot caught. Fake success, no network call.
if (hp) {
showSuccess(form, successEl, name);
return;
}
var originalText = btn.textContent;
btn.disabled = true;
btn.textContent = btn.dataset.loading || 'β¦';
errorEl.classList.add('hidden');
fetch(APPS_SCRIPT_URL, {
method: 'POST',
mode: 'no-cors',
headers: { 'Content-Type': 'text/plain' },
body: JSON.stringify({
formType: 'trial',
name: name,
email: email,
company: company,
notes: notes,
language: language,
userAgent: navigator.userAgent,
referrer: document.referrer
})
})
.then(function () {
// no-cors β opaque response; assume success on no network error.
showSuccess(form, successEl, name);
})
.catch(function () {
btn.disabled = false;
btn.textContent = originalText;
errorEl.classList.remove('hidden');
});
});
}
function showSuccess(form, successEl, name) {
var firstName = (name || '').split(' ')[0];
var nameEl = successEl.querySelector('#trial-success-name');
if (nameEl) nameEl.textContent = firstName ? firstName + '!' : '!';
form.style.display = 'none';
successEl.classList.remove('hidden');
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init();
}
})();
open "file:///Users/maximilianbrandstaetter/Orcha/www/v3/de/trial/index.html"
In the browser:
Max Test, Email max+trial-de@getorcha.com, Unternehmen Orcha Test DE, Notes Integration test (DE).Then verify side effects:
Open the "Orcha Community Forms" Google Sheet β Trial Requests tab β new row with the values above and de in the Language column.
Check max@getorcha.com inbox for email π Trial-Anfrage: Orcha Test DE (de).
Step 3: Verify EN form submits end-to-end
open "file:///Users/maximilianbrandstaetter/Orcha/www/v3/en/trial/index.html"
Same drill:
Test Person, Email max+trial-en@getorcha.com, Company Orcha Test EN, Notes Integration test (EN).Trial Requests sheet has a new row with en in Language column.π Trial-Anfrage: Orcha Test EN (en) (subject stays German per spec).On the DE page, leave Email empty (or enter not-an-email) and click submit. Expected: browser shows the native "Please fill out this field" / "Please include an '@'" tooltip; no network request fires.
On the DE page, open DevTools, find the hidden honeypot input, set its value via console:
document.querySelector('[name="_hp"]').value = 'http://spam.example.com';
Then fill the form normally and submit. Expected:
Success card appears.
No new row in Trial Requests sheet.
No notification email.
Step 6: Verify network error shows the error state
DevTools β Network tab β set throttling to "Offline". Submit the DE form. Expected:
Restore Network throttling to "No throttling" before continuing.
Delete the test rows added in Steps 2 and 3 from the Trial Requests sheet.
git add www/v3/js/trial-form.js
git commit -m "feat(v3): trial form submit handler
Posts to shared Apps Script, client-side honeypot,
shows in-place success card with first-name greeting."
Files:
Modify: www/v3/js/chrome.js (lines 117 and 130-131)
Modify: www/v3/js/chrome.de.js (lines 118 and 131)
Step 1: Confirm there are no other trial-CTA references in v3
grep -rn "app\.getorcha\.com" www/v3/
Expected: only matches in www/v3/js/chrome.js and www/v3/js/chrome.de.js. If any HTML pages also hardcode https://app.getorcha.com/ as a trial CTA, update them in this task too (same find-and-replace pattern). The hero CTA in www/v3/de/index.html and equivalent pages currently do link to app.getorcha.com β if grep finds them, replace as below.
www/v3/js/chrome.js (English chrome)In chrome.js, the trial CTAs use href="https://app.getorcha.com/" with target="_blank". We want them to navigate same-tab to the trial page.
Find the nav button at line ~117:
<a class="btn btn-primary" href="https://app.getorcha.com/" target="_blank" rel="noopener">Start trial</a>
Replace with (note: chrome.js is loaded from various paths β pages live at depths /v3/en/, /v3/en/produkt/, etc. Use a root-relative path /v3/en/trial/ so it works from any depth):
<a class="btn btn-primary" href="/v3/en/trial/">Start trial</a>
And the footer/secondary CTA at line ~130-131:
<a class="btn" style="background:var(--bg);color:var(--ink);" href="https://app.getorcha.com/" target="_blank" rel="noopener">
Start a trial
Replace with:
<a class="btn" style="background:var(--bg);color:var(--ink);" href="/v3/en/trial/">
Start a trial
www/v3/js/chrome.de.js (German chrome)Find the nav button at line ~118:
<a class="btn btn-primary" href="https://app.getorcha.com/" target="_blank" rel="noopener">Trial starten</a>
Replace with:
<a class="btn btn-primary" href="/v3/de/trial/">Trial starten</a>
And the footer/secondary CTA at line ~131:
<a class="btn" style="background:var(--bg);color:var(--ink);" href="https://app.getorcha.com/" target="_blank" rel="noopener">
Replace with:
<a class="btn" style="background:var(--bg);color:var(--ink);" href="/v3/de/trial/">
Also remove the trailing Trial starten label's surrounding target="_blank" rel="noopener" if it appears on a separate line (visually check both files after edit β the closing </a> should still be present).
Example for www/v3/de/index.html line ~29:
Old:
<a class="btn btn-primary btn-arrow" href="https://app.getorcha.com/" target="_blank" rel="noopener">Trial starten</a>
New:
<a class="btn btn-primary btn-arrow" href="/v3/de/trial/">Trial starten</a>
Repeat for every match grep found in www/v3/**/*.html. Use the EN trial path for English pages, DE for German pages.
Start a local static server so root-relative paths resolve:
cd /Users/maximilianbrandstaetter/Orcha && python3 -m http.server 8000 -d www
In a browser:
http://localhost:8000/v3/de/. Click "Trial starten" in the top-right nav.
/v3/de/trial/, page loads with German chrome + form.http://localhost:8000/v3/en/. Click "Start trial" in the top-right nav.
/v3/en/trial/, English page loads./v3/en/trial/.http://localhost:8000/v3/de/produkt/kreditoren.html (a 2-level-deep page). Click "Trial starten" in nav.
/v3/de/trial/ (confirms root-relative path works at depth).Stop the server (Ctrl+C).
grep -rn "app\.getorcha\.com" www/v3/
Expected: zero matches. If any remain, fix them and re-verify.
git add www/v3/js/chrome.js www/v3/js/chrome.de.js
# Plus any HTML files modified in Step 4
git commit -m "feat(v3): route trial CTAs to /trial/ pages
All 'Trial starten' / 'Start trial' buttons in nav, footer,
and hero CTAs now go to the new trial form page instead of
app.getorcha.com directly. Login URL stays available for
existing users via direct navigation."
No code changes β pure verification that the full flow works from a real visitor's perspective.
cd /Users/maximilianbrandstaetter/Orcha && python3 -m http.server 8000 -d www
In a browser:
http://localhost:8000/v3/de/.Smoke Test, Email max+smoke-de@getorcha.com, Unternehmen Smoke Test GmbH, optional notes.Trial Requests sheet β new row at the bottom.π Trial-Anfrage: Smoke Test GmbH (de) and the user-agent + referrer (http://localhost:8000/v3/de/) in the body.Same as Step 1 but starting from http://localhost:8000/v3/en/, English form, English submission. Verify the Language column shows en in the sheet.
Delete the smoke-test rows from the Trial Requests sheet.
Stop the local server.
git log --oneline -10
git status
Expected:
The work is complete. The trial form is live in v3, manual demo setup workflow stays the same (Max sets up the trial environment and emails login credentials in response to the notification).
Spec coverage: Every spec section is covered:
formType: 'trial' branch β Task 1Trial Requests sheet tab β Task 1, Step 1name.split(' ')[0] (with .trim() added for safety) β Task 5Spec deviations explicitly called out at top of plan:
_hp instead of website (matches existing convention).mode: 'no-cors' opaque response instead of JSON {result: 'success'} parsing (matches existing convention; bypasses CORS preflight).Placeholder scan: No TBDs, no "implement later". Every step has actual code or exact verification commands.
Type consistency: Field names used consistently across HTML (name, email, company, notes, language, _hp), JS (same), Apps Script (same), and sheet headers (Name, Email, Company, Notes, Language, User-Agent, Referrer).