Trial Signup Form Implementation Plan

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:


Task 1: Extend Apps Script + update FORM_SETUP.md

Files:

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:

  1. Replace the entire contents of Code.gs with the JavaScript block from Step 2 above.
  2. Save (Ctrl+S / Cmd+S).
  3. Click Deploy β†’ Manage deployments.
  4. Click the pencil icon next to the existing web app deployment.
  5. Under "Version" pick New version, description: Add trial formType (2026-05-13).
  6. Click Deploy. The Web app URL stays the same β€” no client update needed.

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:

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)"

Task 2: Create v3 trial form stylesheet

Files:

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"

Task 3: Create German trial page

Files:

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:

git add www/v3/de/trial/index.html
git commit -m "feat(v3): German trial signup page"

Task 4: Create English trial page

Files:

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:

git add www/v3/en/trial/index.html
git commit -m "feat(v3): English trial signup page"

Task 5: Create the submit handler JS

Files:

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:

  1. Fill: Name Max Test, Email max+trial-de@getorcha.com, Unternehmen Orcha Test DE, Notes Integration test (DE).
  2. Click "Trial anfragen".
  3. Button briefly shows "Senden…" then form swaps for success card showing "Danke, Max!".

Then verify side effects:

open "file:///Users/maximilianbrandstaetter/Orcha/www/v3/en/trial/index.html"

Same drill:

  1. Fill: Name Test Person, Email max+trial-en@getorcha.com, Company Orcha Test EN, Notes Integration test (EN).
  2. Click "Request trial". Loading text says "Sending…".
  3. Success card: "Thanks, Test!".
  4. Verify the Trial Requests sheet has a new row with en in Language column.
  5. Verify max@getorcha.com inbox has email πŸš€ 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:

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."

Task 6: Route v3 trial CTAs to the new pages

Files:

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.

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

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:

  1. Visit http://localhost:8000/v3/de/. Click "Trial starten" in the top-right nav.
  2. Visit http://localhost:8000/v3/en/. Click "Start trial" in the top-right nav.
  3. Scroll to footer on the same EN page, click "Start a trial".
  4. Visit http://localhost:8000/v3/de/produkt/kreditoren.html (a 2-level-deep page). Click "Trial starten" in nav.

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."

Task 7: End-to-end smoke test

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:

  1. Visit http://localhost:8000/v3/de/.
  2. Click "Trial starten" in the top nav.
  3. On the trial page, fill in real-looking data: Name Smoke Test, Email max+smoke-de@getorcha.com, Unternehmen Smoke Test GmbH, optional notes.
  4. Submit.
  5. Success card appears with "Danke, Smoke!".
  6. Open the Trial Requests sheet β€” new row at the bottom.
  7. Open max@getorcha.com β€” email received within ~30 seconds with subject πŸš€ 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).


Self-Review Notes

Spec coverage: Every spec section is covered:

Spec deviations explicitly called out at top of plan:

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).