# SnowIT.ba SaaS Funnel MVP

# SnowIT.ba SaaS Funnel MVP — Production Runbook

## 1. Overview

**What was delivered:**

- **Vercel Web Analytics + Speed Insights** instrumentation on production site (snowit.ba)
- **CTA consolidation:** mailto links reduced to 1 per page (footer only), hero CTA now anchors to #contact form with smooth scroll
- **Lead form notification pipeline:** Contact form → api/contact.js → SMTP relay via info@basicconsulting.no → info@snowit.ba → improvmx forwarder → enis@snowit.ba
- **Custom event tracking:** Form Submit + CTA Click events wired in code (2 custom events)
- **i18n expansion:** BS + EN locales for CTA labels and form placeholders

**Why:** CEO directive 2026-05-10 parallel to Bilko HR landing improvement session. snowit.ba was 108-line brochure with zero tracking, zero lead capture mechanism. MVP scope = establish funnel visibility (analytics) + lead capture (form + notification).

**Context:**

- **MC:** #100302 (M priority, SnowIT project)
- **Commits live on main:**
    - `d17cc95` FlowForge — Vercel Web Analytics + Speed Insights scripts, custom events, UTM convention in BUILD-BLUEPRINT.md, dashboard URL in DEPLOY-MAP.md
    - `b6cf4a6` Vizu — mailto consolidation (1 per page footer), hero CTA #contact anchor, i18n keys, smooth scroll pre-existing
- **Vercel auto-deploy:** Both commits deployed to production automatically (Vercel GitHub integration active)
- **Proveo verdict:** PARTIAL — code correct, manual dashboard step required (see section 3)

## 2. Architecture

### Hosting &amp; Deployment

- **Platform:** Vercel (team: johns-projects-4b43bfa9, project ID: prj\_6kWI33mxaX2PClQwe1xt1OUbSxP6)
- **Domain:** snowit.ba (NS: AWS Route 53, CDN: Vercel Edge Network)
- **Branch mapping:** main → production (auto-deploy on push)
- **Pages:** index.html, portfolio.html, careers.html (all instrumented with analytics scripts)

### Analytics Stack

- **Platform:** Vercel Web Analytics (FREE tier) + Speed Insights
- **Instrumentation:** Both scripts injected in `<head>` of all 3 pages: ```
    <script defer src="/_vercel/insights/script.js"></script>
    <script defer src="/_vercel/speed-insights/script.js"></script>
    ```
- **Status (as of 2026-05-10):** Scripts return HTTP 404 until Analytics feature enabled in Vercel dashboard (see section 3)

### Lead Form Pipeline

<div id="bkmrk-%E2%94%8C%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%90-%E2%94%82-v" style="background: #f5f5f5; padding: 15px; border-left: 4px solid #4CAF50; margin: 20px 0;">```

┌──────────────┐
│  Visitor     │
│  snowit.ba   │
└──────┬───────┘
       │ Fills form (name, email, message)
       │ index.html#contactForm
       ▼
┌─────────────────────────┐
│  api/contact.js         │
│  (Vercel Serverless)    │
│  • Honeypot validation  │
│  • Email regex check    │
│  • SMTP relay via       │
│    send.one.com         │
└──────┬──────────────────┘
       │ SMTP auth: info@basicconsulting.no
       │ To: info@snowit.ba
       ▼
┌───────────────────────┐
│  improvmx.com         │
│  MX forwarder         │
│  mx1/mx2.improvmx.com │
└──────┬────────────────┘
       │ Forward to
       ▼
┌──────────────────┐
│  enis@snowit.ba  │
│  (Lead recipient)│
└──────────────────┘

Parallel path (when Analytics enabled):
┌──────────────┐
│  Form submit │──▶ window.va('event', {name: 'Form Submit'})
└──────────────┘      │
                      ▼
              ┌────────────────────┐
              │ Vercel Analytics   │
              │ Dashboard ingestion│
              └────────────────────┘
```

</div>### Custom Events

<table id="bkmrk-event-name-trigger-p" style="width: 100%; border-collapse: collapse; margin: 20px 0;"> <thead style="background: #f0f0f0;"> <tr> <th style="border: 1px solid #ddd; padding: 8px; text-align: left;">Event Name</th> <th style="border: 1px solid #ddd; padding: 8px; text-align: left;">Trigger</th> <th style="border: 1px solid #ddd; padding: 8px; text-align: left;">Payload</th> <th style="border: 1px solid #ddd; padding: 8px; text-align: left;">Location</th> </tr> </thead> <tbody> <tr> <td style="border: 1px solid #ddd; padding: 8px;">`Form Submit`</td> <td style="border: 1px solid #ddd; padding: 8px;">Contact form successful submission</td> <td style="border: 1px solid #ddd; padding: 8px;">None (simple event)</td> <td style="border: 1px solid #ddd; padding: 8px;">index.html line ~1773 (success callback)</td> </tr> <tr> <td style="border: 1px solid #ddd; padding: 8px;">`CTA Click`</td> <td style="border: 1px solid #ddd; padding: 8px;">Click on .btn-primary, .btn-ghost, .nav-cta</td> <td style="border: 1px solid #ddd; padding: 8px;">`{ label: string, href: string }`</td> <td style="border: 1px solid #ddd; padding: 8px;">index.html line ~1869 (global listener)</td> </tr> </tbody></table>

**Code gating:** Both event fire calls wrapped in `if (window.va)` check — events will queue and fire once Analytics enabled, no code change needed.

### UTM Convention

Vercel Analytics auto-captures UTM params from URL query string. Recommended convention (documented in BUILD-BLUEPRINT.md):

<table id="bkmrk-parameter-purpose-ex" style="width: 100%; border-collapse: collapse; margin: 20px 0;"> <thead style="background: #f0f0f0;"> <tr> <th style="border: 1px solid #ddd; padding: 8px; text-align: left;">Parameter</th> <th style="border: 1px solid #ddd; padding: 8px; text-align: left;">Purpose</th> <th style="border: 1px solid #ddd; padding: 8px; text-align: left;">Example Values</th> </tr> </thead> <tbody> <tr> <td style="border: 1px solid #ddd; padding: 8px;">`utm_source`</td> <td style="border: 1px solid #ddd; padding: 8px;">Channel</td> <td style="border: 1px solid #ddd; padding: 8px;">linkedin, email, direct, referral, instagram, facebook</td> </tr> <tr> <td style="border: 1px solid #ddd; padding: 8px;">`utm_medium`</td> <td style="border: 1px solid #ddd; padding: 8px;">Format</td> <td style="border: 1px solid #ddd; padding: 8px;">social, email, organic, cpc, paid</td> </tr> <tr> <td style="border: 1px solid #ddd; padding: 8px;">`utm_campaign`</td> <td style="border: 1px solid #ddd; padding: 8px;">Campaign identifier</td> <td style="border: 1px solid #ddd; padding: 8px;">frizerski-landing-launch, bhtechlab-demo (kebab-case)</td> </tr> <tr> <td style="border: 1px solid #ddd; padding: 8px;">`utm_content`</td> <td style="border: 1px solid #ddd; padding: 8px;">Variant/placement</td> <td style="border: 1px solid #ddd; padding: 8px;">hero-a, footer-b, cta-variant-1</td> </tr> </tbody></table>

**Example campaign URL:**  
`https://snowit.ba/?utm_source=linkedin&utm_medium=social&utm_campaign=bhtechlab-demo&utm_content=hero-cta`

## 3. Post-Deploy: Enable Vercel Web Analytics (MANUAL STEP — ONE-CLICK)

<div id="bkmrk-%E2%9A%A0%EF%B8%8F-critical-manual-s" style="background: #fff3cd; border: 1px solid #ffc107; padding: 15px; border-radius: 4px; margin: 20px 0;">⚠️ CRITICAL MANUAL STEP REQUIRED

Analytics scripts return HTTP 404 until feature enabled in Vercel dashboard. This is a one-time, one-click operation (no payment required, FREE tier).

</div>### Step-by-Step Procedure

1. **Navigate to Vercel Analytics dashboard:**  
     URL: [https://vercel.com/johns-projects-4b43bfa9/snowit-site/analytics](https://vercel.com/johns-projects-4b43bfa9/snowit-site/analytics)
2. **Click "Enable Web Analytics" button**  
     Located in center of page. Button text may vary (e.g., "Enable Analytics" or "Get Started").
3. **Confirm FREE tier selection**  
     No payment method required for FREE tier. Limits: 2,500 events/month, 7-day data retention.
4. **Verify script now serves HTTP 200:** ```
    curl -sI https://snowit.ba/_vercel/insights/script.js | head -1
    ```
    
     Expected output: `HTTP/2 200` (was `HTTP/2 404` before enable)
5. **Generate test traffic:**
    - Visit https://snowit.ba in browser (incognito/private mode to avoid cache)
    - Click hero CTA (triggers CTA Click event)
    - Fill and submit contact form (triggers Form Submit event)
6. **Confirm events appear in dashboard (5-10 min delay):**  
     Return to [Analytics dashboard](https://vercel.com/johns-projects-4b43bfa9/snowit-site/analytics) and verify: 
    - Page view count incremented
    - Custom Events section shows "Form Submit" and "CTA Click" with count ≥ 1

### Troubleshooting

<table id="bkmrk-symptom-diagnosis-fi" style="width: 100%; border-collapse: collapse; margin: 20px 0;"> <thead style="background: #f0f0f0;"> <tr> <th style="border: 1px solid #ddd; padding: 8px; text-align: left;">Symptom</th> <th style="border: 1px solid #ddd; padding: 8px; text-align: left;">Diagnosis</th> <th style="border: 1px solid #ddd; padding: 8px; text-align: left;">Fix</th> </tr> </thead> <tbody> <tr> <td style="border: 1px solid #ddd; padding: 8px;">Script still 404 after enable</td> <td style="border: 1px solid #ddd; padding: 8px;">CDN propagation delay</td> <td style="border: 1px solid #ddd; padding: 8px;">Wait 5 min, hard-refresh browser (Cmd+Shift+R / Ctrl+Shift+F5)</td> </tr> <tr> <td style="border: 1px solid #ddd; padding: 8px;">Events not appearing in dashboard</td> <td style="border: 1px solid #ddd; padding: 8px;">Ingestion delay or ad blocker</td> <td style="border: 1px solid #ddd; padding: 8px;">Wait 10 min. Test in incognito without extensions. Check browser console for errors.</td> </tr> <tr> <td style="border: 1px solid #ddd; padding: 8px;">"Enable Analytics" button missing</td> <td style="border: 1px solid #ddd; padding: 8px;">Already enabled by another team member</td> <td style="border: 1px solid #ddd; padding: 8px;">Check if dashboard shows "Analytics enabled" status. Verify script HTTP 200.</td> </tr> </tbody></table>

## 4. Operations

### Dashboard Access

- **URL:** [https://vercel.com/johns-projects-4b43bfa9/snowit-site/analytics](https://vercel.com/johns-projects-4b43bfa9/snowit-site/analytics)
- **Team:** johns-projects-4b43bfa9
- **Current access:**
    - john@alai.no (Owner role)
- **Pending access:**
    - enis@snowit.ba (Viewer role — requires Vercel team invite, not yet sent)

### Lead Notification Flow

- **Destination:** enis@snowit.ba (CEO of SnowIT)
- **Relay chain:** api/contact.js → info@basicconsulting.no (SMTP) → info@snowit.ba → improvmx → enis@snowit.ba
- **Expected latency:** &lt;5 seconds from form submit to inbox delivery
- **Format:** Plain text email with subject "Nova poruka sa snowit.ba" (BS) or "New message from snowit.ba" (EN), body contains name, email, message

### Auto-Reply to Submitter

**Status:** NOT IMPLEMENTED in v1 (MVP scope excluded this feature)

Lead submitter receives NO auto-reply confirmation email. Follow-on task opened to implement:

- Auto-reply template (BS + EN locales)
- Send via api/contact.js after successful SMTP relay
- Lexicon linguistic validation for Bosnian copy (per ZAKON)

*Note: Follow-on MC not yet created as of this runbook publication. Will be added when MC created.*

## 5. Custom Events Reference

### Adding New Custom Events

Custom events use Vercel Analytics `window.va()` API. Standard pattern:

```
if (window.va) {
  window.va('event', {
    name: 'Event Name Here'  // Required — string, max 50 chars
    // Optional properties (max 5 total):
    // label: 'button-text',
    // value: 42,
    // category: 'engagement'
  });
}
```

### Current Events Implementation

**Form Submit event** (index.html line ~1773):

```
// Inside contactForm submit success callback:
if (window.va) {
  window.va('event', { name: 'Form Submit' });
}
```

**CTA Click event** (index.html line ~1869):

```
// Global event listener on DOMContentLoaded:
document.querySelectorAll('.btn-primary, .btn-ghost, .nav-cta').forEach(btn => {
  btn.addEventListener('click', function() {
    if (window.va) {
      const label = this.textContent.trim();
      const href = this.getAttribute('href') || this.getAttribute('data-href') || '';
      window.va('event', {
        name: 'CTA Click',
        label: label,
        href: href
      });
    }
  });
});
```

### Viewing Events in Dashboard

1. Navigate to [Analytics dashboard](https://vercel.com/johns-projects-4b43bfa9/snowit-site/analytics)
2. Scroll to "Custom Events" section
3. Events shown with count, trend graph (7-day retention on FREE tier)
4. Click event name to see breakdown by label/value (if properties provided)

## 6. Verification Checklist

<div id="bkmrk-production-health-ch" style="background: #f5f5f5; padding: 15px; border-radius: 4px; margin: 20px 0;">### Production Health Check

**1. Scripts deployed to all pages:**

```
# Analytics script present in source
curl -s https://snowit.ba | grep -c "_vercel/insights"  # Expected: >= 1
curl -s https://snowit.ba/portfolio.html | grep -c "_vercel/insights"  # Expected: >= 1
curl -s https://snowit.ba/careers.html | grep -c "_vercel/insights"  # Expected: >= 1
```

**2. CTAs consolidated (1 mailto per page, in footer only):**

```
curl -s https://snowit.ba | grep -c "mailto:"  # Expected: 1
curl -s https://snowit.ba/portfolio.html | grep -c "mailto:"  # Expected: 1
```

**3. Analytics enabled (after manual step in section 3):**

```
curl -sI https://snowit.ba/_vercel/insights/script.js | head -1  # Expected: HTTP/2 200
```

**4. Contact form functional:**

- Visit https://snowit.ba
- Click hero CTA "Pošaljite upit" (BS) or "Send enquiry" (EN)
- Confirm smooth scroll to #contact (scrollY increases from 0 to ~3391px on desktop)
- Fill form: name, email, message
- Submit → expect success message in UI
- Check enis@snowit.ba inbox within 5 sec → expect notification email

**5. Custom events firing (after Analytics enabled):**

- Open browser DevTools → Console
- Visit https://snowit.ba
- Click hero CTA → confirm no console errors
- Submit contact form → confirm no console errors
- Wait 5-10 min → check Analytics dashboard → confirm "Form Submit" and "CTA Click" events appear with count ≥ 1

</div>## 7. Known Gaps

<table id="bkmrk-gap-impact-status-mc" style="width: 100%; border-collapse: collapse; margin: 20px 0;"> <thead style="background: #f0f0f0;"> <tr> <th style="border: 1px solid #ddd; padding: 8px; text-align: left;">Gap</th> <th style="border: 1px solid #ddd; padding: 8px; text-align: left;">Impact</th> <th style="border: 1px solid #ddd; padding: 8px; text-align: left;">Status</th> <th style="border: 1px solid #ddd; padding: 8px; text-align: left;">MC ID</th> </tr> </thead> <tbody> <tr> <td style="border: 1px solid #ddd; padding: 8px;">Auto-reply email to form submitter</td> <td style="border: 1px solid #ddd; padding: 8px;">User receives no confirmation after submitting form (UX gap)</td> <td style="border: 1px solid #ddd; padding: 8px;">Deferred to follow-on task</td> <td style="border: 1px solid #ddd; padding: 8px;">*TBD (not yet created)*</td> </tr> <tr> <td style="border: 1px solid #ddd; padding: 8px;">Vercel Web Analytics dashboard ingestion</td> <td style="border: 1px solid #ddd; padding: 8px;">Events fire in code but 404 on script load until manually enabled</td> <td style="border: 1px solid #ddd; padding: 8px;">BLOCKED on manual one-click enable (section 3)</td> <td style="border: 1px solid #ddd; padding: 8px;">MC #100302 (same task)</td> </tr> <tr> <td style="border: 1px solid #ddd; padding: 8px;">Vercel team access for enis@snowit.ba</td> <td style="border: 1px solid #ddd; padding: 8px;">SnowIT CEO cannot view analytics dashboard without team invite</td> <td style="border: 1px solid #ddd; padding: 8px;">Pending — requires manual Vercel invite from john@alai.no</td> <td style="border: 1px solid #ddd; padding: 8px;">*Not tracked (ops task, 2 min)*</td> </tr> <tr> <td style="border: 1px solid #ddd; padding: 8px;">7-day data review</td> <td style="border: 1px solid #ddd; padding: 8px;">Need data to decide if Vercel FREE tier sufficient or upgrade to Plausible (€9/mo) needed for richer attribution</td> <td style="border: 1px solid #ddd; padding: 8px;">Scheduled revisit 2026-05-17 (7 days post-launch)</td> <td style="border: 1px solid #ddd; padding: 8px;">*TBD (calendar task, not MC)*</td> </tr> </tbody></table>

## 8. Next Steps &amp; Roadmap

### Immediate (0-7 days)

1. **Enable Vercel Web Analytics** (manual step, section 3) — <span style="color: red; font-weight: bold;">BLOCKER</span>
2. **Invite enis@snowit.ba to Vercel team** as Viewer (2 min task)
3. **Monitor lead volume** in enis@snowit.ba inbox (improvmx chain latency check)
4. **Collect 7 days of analytics data** (page views, custom events, referrers, Web Vitals)

### Week 2 (2026-05-17 onwards)

1. **Data review session** with CEO Alem + Enis: 
    - Analyze traffic sources (UTM attribution)
    - Form conversion rate (page views → form submits)
    - CTA Click patterns (which CTAs drive most engagement)
2. **Decision point:** Keep Vercel FREE tier (2,500 events/mo, 7-day retention) OR upgrade to: 
    - Vercel Pro ($20/mo) — unlimited events, 30-day retention, advanced filtering
    - Plausible.io (€9/mo) — GDPR-friendly, no cookie banner, full event stream export, unlimited retention
3. **Implement auto-reply email** (if prioritized): 
    - Template design (BS + EN locales)
    - Lexicon linguistic validation (Bosnian copy per ZAKON)
    - SMTP integration in api/contact.js

### Deferred (post-funding or high lead volume)

- Nurture email sequence (drip campaign for leads who don't convert immediately)
- A/B testing framework (hero CTA variants, form placement)
- Retargeting pixels (LinkedIn, Facebook) — requires cookie banner + GDPR consent flow
- CRM integration (HubSpot, Pipedrive) — auto-sync leads from form to sales pipeline

## 9. References

- **MC:** #100302 (M priority, SnowIT project)
- **Commits:**
    - `d17cc95` FlowForge — Vercel Web Analytics + Speed Insights scripts, custom events Form Submit + CTA Click, UTM convention in BUILD-BLUEPRINT.md, dashboard URL in DEPLOY-MAP.md
    - `b6cf4a6` Vizu — mailto consolidation (1 per page footer only), hero CTA #contact anchor on index.html, i18n keys grew bs+en, scroll-behavior smooth pre-existing
- **Mehanik gate:** /tmp/mehanik-cleared-100302
- **Proveo evidence:** /tmp/proveo-snowit-100302/proveo-evidence-100302.json
- **Project files:**
    - DEPLOY-MAP: /Users/makinja/clients-external/snowit-site/DEPLOY-MAP.md
    - BUILD-BLUEPRINT: /Users/makinja/clients-external/snowit-site/BUILD-BLUEPRINT.md
- **CEO genesis:** 2026-05-10 directive parallel to Bilko HR landing improvement session
- **Site repository:** [github.com/snowitba/snowit-site](https://github.com/snowitba/snowit-site) (client-owned repo)

---

 **Document Status:** LIVE — Production Ready  
 **Last Updated:** 2026-05-10  
 **Maintained By:** Skillforge (ALAI Holding AS)  
 **Contact:** john@alai.no