patx/vegy

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1" />
  <title>Vegy — Wholesale ordering software for food distributors</title>
  <meta name="description" content="Vegy puts your wholesale catalog on your customers' phones under your own brand. Customer-specific pricing, order minimums, iOS and Android apps, and QuickBooks sync. $599/mo flat — no revenue share. Book a demo." />
  <link rel="canonical" href="https://vegy.app/" />

  <meta property="og:type" content="website" />
  <meta property="og:url" content="https://vegy.app/" />
  <meta property="og:site_name" content="Vegy" />
  <meta property="og:title" content="Vegy — Wholesale ordering software for food distributors" />
  <meta property="og:description" content="Your catalog, your brand, your pricing — on your customers' phones. Orders arrive priced-out and synced to QuickBooks." />
  <meta property="og:image" content="https://vegy.app/shot-catalog.png" />
  <meta name="twitter:card" content="summary_large_image" />
  <meta name="theme-color" content="#16a34a" />

  <link rel="icon" href="favicon.svg" type="image/svg+xml" />
  <link rel="apple-touch-icon" href="shot-catalog.png" />

  <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=IBM+Plex+Mono:wght@400;500&family=Inter:wght@400;500;600;700&display=swap" />
  <link rel="stylesheet" href="styles.css" />
</head>

<body>

  <header class="masthead" id="masthead">
    <div class="wrap">
      <a class="wordmark" href="/">
        <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
          <path d="M11 20A7 7 0 0 1 9.8 6.1C15.5 5 17 4.48 19 2c1 2 2 4.18 2 8 0 5.5-4.78 10-10 10Z" />
          <path d="M2 21c0-3 1.85-5.36 5.08-6C9.5 14.52 12 13 13 12" />
        </svg>
        Vegy
      </a>

      <nav class="nav-links" aria-label="Primary">
        <a href="#why">Why Vegy</a>
        <a href="#how">How it works</a>
        <a href="#features">Features</a>
        <a href="#pricing">Pricing</a>
        <a href="#faq">FAQ</a>
      </nav>

      <a class="btn btn-primary btn-sm" href="https://cal.com/afterdarklabs/meet" target="_blank" rel="noopener">
        Book a demo
      </a>
      <button class="nav-toggle" id="navToggle" type="button"
              aria-expanded="false" aria-controls="mobileNav" aria-label="Open menu">
        <span></span><span></span><span></span>
      </button>
    </div>
    <nav class="mobile-nav" id="mobileNav" aria-label="Mobile">
      <a class="m-link" href="#why">Why Vegy</a>
      <a class="m-link" href="#how">How it works</a>
      <a class="m-link" href="#features">Features</a>
      <a class="m-link" href="#pricing">Pricing</a>
      <a class="m-link" href="#faq">FAQ</a>
      <a class="btn btn-primary" href="https://cal.com/afterdarklabs/meet" target="_blank" rel="noopener">Book a demo</a>
    </nav>
  </header>

  <main>

    <!-- ── Hero ─────────────────────────────────────────────────────────── -->
    <section class="hero">
      <div class="wrap">
        <div class="hero-copy">
          <span class="eyebrow">For produce, meat &amp; specialty food distributors</span>

          <h1 class="h-xl">Take orders<br /><span class="accent">in your sleep</span>.</h1>

          <p class="lede">
            Vegy puts your full catalog — your brand, your pricing, your minimums — on
            your customers' phones. They order whenever they think of it. You wake up to
            priced-out orders that are already in QuickBooks.
          </p>

          <div class="cta-row center">
            <a class="btn btn-primary" href="https://cal.com/afterdarklabs/meet" target="_blank" rel="noopener">
              Book a demo <span class="arrow" aria-hidden="true">→</span>
            </a>
            <a class="btn btn-outline" href="#how">See how it works</a>
          </div>

          <p class="hero-note">
            White-labeled · Web, iOS &amp; Android · Order by text · QuickBooks sync
          </p>
        </div>

        <div class="hero-visual">
          <div class="shots" id="shots" tabindex="0" role="group"
               aria-label="Vegy product screens — scroll sideways to see all four">
          <figure class="shot">
            <img src="shot-catalog.webp" width="476" height="871" fetchpriority="high"
                 alt="Your storefront on a customer's phone: produce by the case and by the each, with pricing, quantity steppers and a running cart total." />
          </figure>
          <figure class="shot">
            <img src="shot-order.webp" width="476" height="871" fetchpriority="low" loading="lazy"
                 alt="An incoming order: customer and delivery details, order notes, priced line items, and buttons to print a pull slip, export CSV, or convert it to an invoice." />
          </figure>
          <figure class="shot">
            <img src="shot-deliveries.webp" width="476" height="871" fetchpriority="low" loading="lazy"
                 alt="The day's deliveries: every order for the date with its status, order number, and QuickBooks connection state." />
          </figure>
          <figure class="shot">
            <img src="shot-dashboard.webp" width="476" height="871" fetchpriority="low" loading="lazy"
                 alt="An instance dashboard under the distributor's own branding, with quick actions for new orders, AI orders, items, accounts and price lists." />
          </figure>
          </div>
          <div class="shot-dots" id="shotDots"></div>
        </div>

        <div class="trust">
          <p class="eyebrow">Running on Vegy today</p>
          <div class="trust-logos">
            <img src="gardenfresh.webp" width="437" height="132" loading="lazy"
                 alt="Garden Fresh Produce LLC" />
            <span class="trust-sep" aria-hidden="true"></span>
            <img src="prima.webp" width="315" height="132" loading="lazy"
                 alt="Prima Produce" />
          </div>
        </div>
      </div>
    </section>

    <!-- ── Why Vegy: the problem, paired with the fix ───────────────────── -->
    <section class="section band-soft" id="why">
      <div class="wrap">
        <div class="section-head center reveal">
          <span class="eyebrow">Why Vegy</span>
          <h2 class="h-lg">Every order still gets typed in by hand</h2>
          <p class="lede">
            Orders reach you a different way every time, and one person turns all of
            them into something the warehouse can pull. Here is what changes, line by
            line.
          </p>
        </div>

        <div class="swap reveal">
          <div class="swap-head">
            <span>How it arrives today</span>
            <span aria-hidden="true"></span>
            <span class="is-vegy">What Vegy does with it</span>
          </div>

          <div class="swap-row">
            <div class="swap-from">
              <span class="cell-label">How it arrives today</span>
              <span class="chan">Voicemail · 11:40 PM</span>
              <p>&ldquo;Hey it&rsquo;s Mike, give me the usual plus a couple cases of romaine, uh — call me back.&rdquo;</p>
            </div>
            <div class="swap-arrow" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14"/><path d="m13 6 6 6-6 6"/></svg></div>
            <div class="swap-to">
              <span class="cell-label">What Vegy does with it</span>
              <p>Vegy&rsquo;s AI picks up, turns the call into a structured order on Mike&rsquo;s account, and prices it against his tier. It&rsquo;s waiting for you at 6am.</p>
            </div>
          </div>
          <div class="swap-row">
            <div class="swap-from">
              <span class="cell-label">How it arrives today</span>
              <span class="chan">Text message</span>
              <p>&ldquo;4 tomato, 2 onion, 6 lettuce&rdquo; — no pack sizes, no case counts, no account.</p>
            </div>
            <div class="swap-arrow" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14"/><path d="m13 6 6 6-6 6"/></svg></div>
            <div class="swap-to">
              <span class="cell-label">What Vegy does with it</span>
              <p>The same text comes back as real line items from your catalog, with your pack sizes and case counts already attached.</p>
            </div>
          </div>
          <div class="swap-row">
            <div class="swap-from">
              <span class="cell-label">How it arrives today</span>
              <span class="chan">Email · PDF attached</span>
              <p>An order sheet from 2019, with prices that expired two seasons ago.</p>
            </div>
            <div class="swap-arrow" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14"/><path d="m13 6 6 6-6 6"/></svg></div>
            <div class="swap-to">
              <span class="cell-label">What Vegy does with it</span>
              <p>They order from your live catalog instead, so the price is whatever their tier says today — and minimums are checked at checkout.</p>
            </div>
          </div>
          <div class="swap-row">
            <div class="swap-from">
              <span class="cell-label">How it arrives today</span>
              <span class="chan">Then, every time</span>
              <p>Someone re-keys all of it by hand before the pull sheets go out. That&rsquo;s where the shorts come from, and the wrong pack sizes, and the credits.</p>
            </div>
            <div class="swap-arrow" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14"/><path d="m13 6 6 6-6 6"/></svg></div>
            <div class="swap-to">
              <span class="cell-label">What Vegy does with it</span>
              <p>Nothing gets typed twice. The order syncs into QuickBooks as a customer, items, and an invoice, and the pull sheet prints itself.</p>
            </div>
          </div>
        </div>
      </div>
    </section>

    <!-- ── How it works ─────────────────────────────────────────────────── -->
    <section class="section" id="how">
      <div class="wrap">
        <div class="section-head center reveal">
          <span class="eyebrow">How it works</span>
          <h2 class="h-lg">Three steps, and the phone stops ringing</h2>
        </div>

        <div class="rows">
          <div class="row reveal">
            <div class="row-text">
              <span class="eyebrow">Step 01</span>
              <h3 class="h-md">We load your catalog</h3>
              <p>
                Your item list, pack sizes, categories, and price tiers get imported for
                you — nothing gets rebuilt by hand. Then it's your logo, your product
                photos, your category names, on your own domain.
              </p>
            </div>
            <div class="row-visual">
              <div class="mock">
                <div class="mock-head"><span>Your catalog</span><span class="tag">Imported</span></div>
                <div class="mock-body">
                  <div class="mock-line"><span>Artichoke 12CT</span><span class="pack">Case</span><span class="price">$71.82</span></div>
                  <div class="mock-line"><span>Arugula, Baby 2/1.5lb</span><span class="pack">Case</span><span class="price">$22.28</span></div>
                  <div class="mock-line"><span>Romaine Hearts 12CT</span><span class="pack">Case</span><span class="price">$43.89</span></div>
                  <div class="mock-line"><span>Tomato, Roma 25lb</span><span class="pack">Case</span><span class="price">$31.40</span></div>
                </div>
              </div>
            </div>
          </div>

          <div class="row is-flipped reveal">
            <div class="row-text">
              <span class="eyebrow">Step 02</span>
              <h3 class="h-md">Your customers order</h3>
              <p>
                From your website, your own iOS and Android app, or straight over voice
                and text. Last week's order is right there, so a reorder takes seconds
                instead of a phone call — at 11pm, on a Sunday, from a walk-in cooler.
              </p>
            </div>
            <div class="row-visual">
              <div class="mock">
                <div class="mock-head"><span>Sunrise Cafe · Tuesday</span><span class="tag">Tier 2</span></div>
                <div class="mock-body">
                  <div class="mock-line"><span>Artichoke 12CT</span><span class="pack">2 cases</span><span class="price">$143.64</span></div>
                  <div class="mock-line"><span>Arugula, Baby 2/1.5lb</span><span class="pack">6 cases</span><span class="price">$133.68</span></div>
                  <div class="mock-line"><span>Romaine Hearts 12CT</span><span class="pack">4 cases</span><span class="price">$175.56</span></div>
                </div>
                <div class="mock-foot"><span>Order total</span><span class="amt">$452.88</span></div>
              </div>
            </div>
          </div>

          <div class="row reveal">
            <div class="row-text">
              <span class="eyebrow">Step 03</span>
              <h3 class="h-md">You get a clean order</h3>
              <p>
                Priced against that customer's tier, checked against your minimums, and
                synced to QuickBooks or your ERP. Print pull sheets, route lists, and
                price lists straight from it.
              </p>
            </div>
            <div class="row-visual">
              <div class="mock">
                <div class="mock-head"><span>QuickBooks</span><span class="tag">Synced 6:02 AM</span></div>
                <div class="mock-body">
                  <div class="mock-line"><span>Customer record</span><span class="price ok">Updated</span></div>
                  <div class="mock-line"><span>Items &amp; pack sizes</span><span class="price ok">Updated</span></div>
                  <div class="mock-line"><span>Invoice #4417</span><span class="price ok">Created</span></div>
                  <div class="mock-line"><span>Pull sheet</span><span class="price ok">Ready</span></div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </section>

    <!-- ── Feature grid ─────────────────────────────────────────────────── -->
    <section class="section band-soft" id="features">
      <div class="wrap">
        <div class="section-head center reveal">
          <span class="eyebrow">Features</span>
          <h2 class="h-lg">The rest of what the ordering desk was doing</h2>
          <p class="lede">
            Case pricing, customer tiers, minimums, and the paperwork your warehouse runs
            on — not a retail cart with a wholesale sticker on it.
          </p>
        </div>

        <div class="cards reveal">
          <article class="card">
            <div class="card-icon">
              <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
                <rect x="5" y="2" width="14" height="20" rx="2.5" /><path d="M12 18h.01" />
              </svg>
            </div>
            <h3 class="h-sm">Order from anywhere</h3>
            <p>
              Your own website, mobile web, native iOS and Android apps, or AI-powered
              ordering by voice and text for customers who will never open an app.
            </p>
          </article>

          <article class="card">
            <div class="card-icon">
              <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
                <path d="M12.6 2.6 21 11a2 2 0 0 1 0 2.8l-7.2 7.2a2 2 0 0 1-2.8 0L3 12.6V4a1 1 0 0 1 1-1h8.6Z" /><path d="M7.5 7.5h.01" />
              </svg>
            </div>
            <h3 class="h-sm">Pricing that knows the customer</h3>
            <p>
              Customer-specific pricing tiers and contract pricing applied automatically,
              plus per-account order minimums enforced at checkout.
            </p>
          </article>

          <article class="card">
            <div class="card-icon">
              <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
                <path d="M3 17l6-6 4 4 8-8" /><path d="M17 7h4v4" />
              </svg>
            </div>
            <h3 class="h-sm">Bigger orders, on purpose</h3>
            <p>
              Promote featured items, push new products in front of the right accounts,
              and let favorites and one-tap reorder do the rest.
            </p>
          </article>

          <article class="card">
            <div class="card-icon">
              <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
                <path d="M21 12a9 9 0 0 1-15.5 6.2L3 16" /><path d="M3 12a9 9 0 0 1 15.5-6.2L21 8" /><path d="M3 21v-5h5" /><path d="M21 3v5h-5" />
              </svg>
            </div>
            <h3 class="h-sm">QuickBooks &amp; ERP sync</h3>
            <p>
              Customers, items, and invoices flow into QuickBooks or your existing ERP.
              No double entry, no end-of-day export ritual.
            </p>
          </article>

          <article class="card">
            <div class="card-icon">
              <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
                <path d="M14 2H6.5A1.5 1.5 0 0 0 5 3.5v17A1.5 1.5 0 0 0 6.5 22h11a1.5 1.5 0 0 0 1.5-1.5V7Z" /><path d="M14 2v5h5" /><path d="M9 13h6" /><path d="M9 17h4" />
              </svg>
            </div>
            <h3 class="h-sm">Paperwork in one click</h3>
            <p>
              Pull sheets, price lists, and sales reports export instantly — in the format
              your warehouse and your bookkeeper already expect.
            </p>
          </article>

          <article class="card">
            <div class="card-icon">
              <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
                <path d="M2 7h11v10H2z" /><path d="M13 10h4.5l3.5 3.5V17h-8" /><circle cx="7" cy="18.5" r="1.8" /><circle cx="17" cy="18.5" r="1.8" />
              </svg>
            </div>
            <h3 class="h-sm">Inventory &amp; delivery tracking</h3>
            <p>
              Keep inventory and payment status attached to the order, and track
              deliveries through to the door without a second system.
            </p>
          </article>
        </div>
      </div>
    </section>

    <!-- ── Dark: differentiators ────────────────────────────────────────── -->
    <section class="section band-dark">
      <div class="wrap">
        <div class="section-head reveal">
          <span class="eyebrow">Where Vegy is different</span>
          <h2 class="h-lg">Your brand in front, your books untouched</h2>
          <p class="lede">
            Vegy runs underneath your business — it doesn't put itself between you and
            your customers, or between you and your accountant.
          </p>
        </div>

        <div class="rows">
          <div class="row reveal">
            <div class="row-text">
              <h3 class="h-md">It's your name on it, not ours</h3>
              <p style="color:rgba(255,255,255,.72)">
                Your customers download your app, from your listing, and see your logo
                when it opens. Nobody has to know there's a software vendor behind your
                ordering.
              </p>
            </div>
            <div class="row-visual">
              <div class="mock">
                <div class="mock-head"><span>What your customers see</span></div>
                <div class="mock-body">
                  <div class="mock-line"><span>App Store listing</span><span class="price ok">Your company</span></div>
                  <div class="mock-line"><span>Ordering domain</span><span class="price ok">orders.yourco.com</span></div>
                  <div class="mock-line"><span>Logo &amp; colors</span><span class="price ok">Yours</span></div>
                  <div class="mock-line"><span>Catalog &amp; photos</span><span class="price ok">Yours</span></div>
                </div>
              </div>
            </div>
          </div>

          <div class="row is-flipped reveal">
            <div class="row-text">
              <h3 class="h-md">Your books stay your books</h3>
              <p style="color:rgba(255,255,255,.72)">
                Vegy creates and updates customers, items, and invoices in QuickBooks. It
                does not post journal entries, recognize revenue, or reconcile — your
                accountant's workflow stays exactly where it is.
              </p>
            </div>
            <div class="row-visual">
              <div class="mock">
                <div class="mock-head"><span>QuickBooks scope</span></div>
                <div class="mock-body">
                  <div class="mock-line"><span>Customers, items, invoices</span><span class="price ok">Vegy writes</span></div>
                  <div class="mock-line"><span>Journal entries</span><span class="price muted-cell">Untouched</span></div>
                  <div class="mock-line"><span>Revenue recognition</span><span class="price muted-cell">Untouched</span></div>
                  <div class="mock-line"><span>Reconciliation</span><span class="price muted-cell">Untouched</span></div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </section>

    <!-- ── Pricing ──────────────────────────────────────────────────────── -->
    <section class="section band-soft" id="pricing">
      <div class="wrap">
        <div class="section-head center reveal">
          <span class="eyebrow">Pricing</span>
          <h2 class="h-lg">No revenue share. No per-seat games.</h2>
          <p class="lede">
            A flat monthly fee, plus a quarter when our AI takes the order for you. A
            $4,000 order costs you exactly what a $400 order costs you.
          </p>
        </div>

        <div class="price-card reveal">
          <div class="price-row">
            <div class="price-unit">
              <p class="price-figure">$599<span class="per">/mo</span></p>
              <p class="price-cap">Platform fee</p>
            </div>

            <div class="price-plus" aria-hidden="true">+</div>

            <div class="price-unit">
              <p class="price-figure">25¢<span class="per">/order</span></p>
              <p class="price-cap">AI orders — voice, text &amp; web</p>
            </div>
          </div>

          <ul class="included">
            <li>Your white-labeled web storefront and ordering domain</li>
            <li>Native iOS and Android apps published under your brand</li>
            <li>Unlimited customer accounts and pricing tiers</li>
            <li>QuickBooks sync, or integration with your existing ERP</li>
            <li>Catalog import and account setup, done by us</li>
            <li>Email and phone support from people who know your instance</li>
          </ul>

          <p class="price-note">
            Billed monthly. Final pricing depends on item count, number of accounts, and
            whether you need a custom ERP integration — you'll get the exact number on
            the demo call.
          </p>

          <a class="btn btn-white" style="margin-top:1.8rem"
             href="https://cal.com/afterdarklabs/meet" target="_blank" rel="noopener">
            Book a demo <span class="arrow" aria-hidden="true">→</span>
          </a>
        </div>
      </div>
    </section>

    <!-- ── FAQ ──────────────────────────────────────────────────────────── -->
    <section class="section" id="faq">
      <div class="wrap wrap-narrow">
        <div class="section-head center reveal">
          <span class="eyebrow">Straight answers</span>
          <h2 class="h-lg">The questions you're actually asking</h2>
        </div>

        <div class="faq reveal">
          <details>
            <summary>My customers aren't tech people. Will they really use this?</summary>
            <div class="answer">
              <p>
                Most of them reorder the same twenty items every week, and that's the case
                Vegy is built around — their last order is on the first screen, and
                reordering is a few taps.
              </p>
              <p>
                For the holdouts, voice and text ordering means they keep calling and
                texting exactly like they do now. The difference is that it lands in your
                system as a structured, priced order instead of in someone's inbox.
              </p>
            </div>
          </details>

          <details>
            <summary>What about the customers who insist on calling?</summary>
            <div class="answer">
              <p>
                Keep taking their calls. Your team enters the order on their behalf and it
                goes through the same pricing, minimums, and QuickBooks sync as everything
                else. Nobody gets cut off — you just stop re-keying the ones who don't need
                to call.
              </p>
            </div>
          </details>

          <details>
            <summary>Do I have to leave QuickBooks?</summary>
            <div class="answer">
              <p>
                No. Vegy creates and updates customers, items, and invoices in QuickBooks
                for you. It does not post journal entries, recognize revenue, or reconcile
                your books — your accountant's workflow stays exactly where it is.
              </p>
              <p>
                Already on a different ERP? Custom integrations are part of what we scope
                on the demo call.
              </p>
            </div>
          </details>

          <details>
            <summary>How long does setup take?</summary>
            <div class="answer">
              <p>
                We do the catalog import — your item list, pack sizes, and price tiers — so
                the work on your side is mostly reviewing what we loaded and approving the
                branding.
              </p>
              <p>
                Timeline depends on how many items and accounts you're bringing over. Book
                a demo and we'll scope it against your actual catalog rather than guessing.
              </p>
            </div>
          </details>

          <details>
            <summary>Who owns my customer list and pricing?</summary>
            <div class="answer">
              <p>
                You do. Each wholesaler runs their own instance, and Vegy processes that
                data on your behalf as your service provider — your accounts, your pricing,
                your order history. The details are spelled out in our
                <a class="link" href="legal.html">Terms &amp; Privacy</a>.
              </p>
            </div>
          </details>

          <details>
            <summary>What does it actually cost?</summary>
            <div class="answer">
              <p>
                $599 a month for the platform, plus 25¢ for every order our AI takes for
                you by voice, text, or web. We don't take a percentage of your sales — a
                $4,000 order and a $400 order cost you exactly the same.
              </p>
              <p>
                Where you land depends on item count, number of accounts, and whether you
                need a custom ERP integration. You'll get the exact number on the demo
                call, not a proposal three weeks later.
              </p>
            </div>
          </details>
        </div>
      </div>
    </section>

    <!-- ── Closing CTA ──────────────────────────────────────────────────── -->
    <section class="cta-banner">
      <div class="wrap">
        <h2 class="h-lg">See your own catalog running on it</h2>
        <p>
          Send us a price list before the call and we'll load a slice of your real
          catalog, so you're looking at your own items — not a generic sandbox.
        </p>

        <div class="cta-row center">
          <a class="btn btn-white" href="https://cal.com/afterdarklabs/meet" target="_blank" rel="noopener">
            Book a demo <span class="arrow" aria-hidden="true">→</span>
          </a>
          <a class="btn btn-outline" href="mailto:[email protected]">Email [email protected]</a>
        </div>

        <ul class="expect">
          <li><span class="n">01</span>We look at how orders reach you today, and where they get re-keyed.</li>
          <li><span class="n">02</span>You see your items, your tiers, and your minimums inside a live instance.</li>
          <li><span class="n">03</span>We scope the QuickBooks or ERP connection against your setup.</li>
          <li><span class="n">04</span>You get a price and a timeline on the call.</li>
        </ul>
      </div>
    </section>

  </main>

  <!-- floats up once the hero screens are past, retires into the closing CTA -->
  <div class="dock" id="dock">
    <a class="btn btn-primary" href="https://cal.com/afterdarklabs/meet" target="_blank" rel="noopener">
      Book a demo <span class="arrow" aria-hidden="true">→</span>
    </a>
  </div>

  <footer class="site-footer">
    <div class="wrap">
      <div class="footer-grid">
        <div>
          <a class="wordmark" href="/">
            <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
              <path d="M11 20A7 7 0 0 1 9.8 6.1C15.5 5 17 4.48 19 2c1 2 2 4.18 2 8 0 5.5-4.78 10-10 10Z" />
              <path d="M2 21c0-3 1.85-5.36 5.08-6C9.5 14.52 12 13 13 12" />
            </svg>
            Vegy
          </a>
          <p class="footer-blurb">
            White-labeled wholesale ordering for produce, meat, and specialty food
            distributors.
          </p>
          <p class="footer-by">
            Built &amp; operated by
            <a href="https://afterdarklabs.io" target="_blank" rel="noopener">After Dark Labs</a>
          </p>
        </div>

        <div>
          <h4>Product</h4>
          <div class="footer-links">
            <a href="#how">How it works</a>
            <a href="#features">Features</a>
            <a href="#pricing">Pricing</a>
            <a href="#faq">FAQ</a>
          </div>
        </div>

        <div>
          <h4>Contact</h4>
          <div class="footer-links">
            <a href="support.html">Support center</a>
            <a href="mailto:[email protected]">[email protected]</a>
            <a href="tel:+19546218027">(954) 621-8027</a>
          </div>
        </div>

        <div>
          <h4>Company</h4>
          <div class="footer-links">
            <a href="https://cal.com/afterdarklabs/meet" target="_blank" rel="noopener">Book a demo</a>
            <a href="legal.html">Terms of Use</a>
            <a href="legal.html#privacy">Privacy Policy</a>
          </div>
        </div>
      </div>

      <div class="footer-base">
        <span>© <span data-year></span> After Dark Labs. All rights reserved.</span>
        <span>Built for the people who load the truck at 4am.</span>
      </div>
    </div>
  </footer>

  <script>
    document.querySelectorAll('[data-year]').forEach(function (el) {
      el.textContent = new Date().getFullYear();
    });

    var masthead = document.getElementById('masthead');
    if (masthead) {
      var onScroll = function () {
        masthead.classList.toggle('is-stuck', window.scrollY > 8);
      };
      onScroll();
      addEventListener('scroll', onScroll, { passive: true });
    }


    // Mobile menu
    (function () {
      var toggle = document.getElementById('navToggle');
      var panel = document.getElementById('mobileNav');
      if (!toggle || !panel) return;

      function setOpen(open) {
        panel.classList.toggle('is-open', open);
        toggle.setAttribute('aria-expanded', String(open));
        toggle.setAttribute('aria-label', open ? 'Close menu' : 'Open menu');
      }

      toggle.addEventListener('click', function () {
        setOpen(toggle.getAttribute('aria-expanded') !== 'true');
      });

      panel.addEventListener('click', function (e) {
        if (e.target.closest('a')) setOpen(false);
      });

      addEventListener('keydown', function (e) {
        if (e.key === 'Escape' && toggle.getAttribute('aria-expanded') === 'true') {
          setOpen(false);
          toggle.focus();
        }
      });

      // a resize back to desktop should not leave the panel stuck open
      addEventListener('resize', function () {
        if (innerWidth > 900) setOpen(false);
      });
    })();

    // Nav scroll-spy: highlight whichever section is under the masthead
    (function () {
      var links = [].slice.call(
        document.querySelectorAll('.nav-links a[href^="#"], .mobile-nav .m-link[href^="#"]')
      );
      if (!links.length) return;

      var ids = [];
      links.forEach(function (a) {
        var id = a.getAttribute('href').slice(1);
        if (document.getElementById(id) && ids.indexOf(id) === -1) ids.push(id);
      });

      function sync() {
        var line = scrollY + (masthead ? masthead.offsetHeight : 74) + 28;
        var current = '';
        ids.forEach(function (id) {
          var top = document.getElementById(id).getBoundingClientRect().top + scrollY;
          if (top <= line) current = id;
        });
        // clamp to the last section once the page bottoms out
        if (innerHeight + scrollY >= document.documentElement.scrollHeight - 4) {
          current = ids[ids.length - 1];
        }
        links.forEach(function (a) {
          a.classList.toggle('is-active', a.getAttribute('href') === '#' + current);
        });
      }
      sync();
      addEventListener('scroll', sync, { passive: true });
      addEventListener('resize', sync);
    })();

    // Booking dock: rises once the hero screens are behind you, retires when
    // the closing CTA arrives so the two never compete.
    (function () {
      var dock = document.getElementById('dock');
      var after = document.querySelector('.hero-visual');
      var until = document.querySelector('.cta-banner');
      if (!dock || !after || !until) return;

      function sync() {
        var past = scrollY > after.getBoundingClientRect().bottom + scrollY - 120;
        var landed = until.getBoundingClientRect().top < innerHeight - 40;
        dock.classList.toggle('is-up', past && !landed);
      }
      sync();
      addEventListener('scroll', sync, { passive: true });
      addEventListener('resize', sync);
    })();

    // Hero screens: a plain row on desktop, a snap carousel once it overflows.
    // Dots mirror scroll position and can drive it; vertical scrolling is never
    // intercepted, so the page still behaves normally under a thumb.
    (function () {
      var strip = document.getElementById('shots');
      var dots = document.getElementById('shotDots');
      if (!strip || !dots) return;

      var slides = [].slice.call(strip.querySelectorAll('.shot'));
      slides.forEach(function (slide, i) {
        var b = document.createElement('button');
        b.type = 'button';
        b.className = 'shot-dot' + (i === 0 ? ' is-active' : '');
        b.setAttribute('aria-label', 'Show screen ' + (i + 1) + ' of ' + slides.length);
        b.addEventListener('click', function () {
          strip.scrollTo({ left: slide.offsetLeft - strip.offsetLeft, behavior: 'smooth' });
        });
        dots.appendChild(b);
      });

      var buttons = [].slice.call(dots.children);
      var ticking = false;
      strip.addEventListener('scroll', function () {
        if (ticking) return;
        ticking = true;
        requestAnimationFrame(function () {
          var nearest;
          if (strip.scrollLeft + strip.clientWidth >= strip.scrollWidth - 2) {
            nearest = slides.length - 1;          // pinned at the end
          } else {
            var mid = strip.scrollLeft + strip.clientWidth / 2;
            var best = Infinity;
            nearest = 0;
            slides.forEach(function (slide, i) {
              var d = Math.abs(slide.offsetLeft + slide.clientWidth / 2 - mid);
              if (d < best) { best = d; nearest = i; }
            });
          }
          buttons.forEach(function (b, i) {
            b.classList.toggle('is-active', i === nearest);
          });
          ticking = false;
        });
      }, { passive: true });
    })();

    var reveals = document.querySelectorAll('.reveal');
    if (matchMedia('(prefers-reduced-motion: reduce)').matches || !('IntersectionObserver' in window)) {
      // leave everything in its default visible state
    } else {
      document.documentElement.classList.add('js');
      var io = new IntersectionObserver(function (entries) {
        entries.forEach(function (entry) {
          if (entry.isIntersecting) {
            entry.target.classList.add('is-in');
            io.unobserve(entry.target);
          }
        });
      }, { rootMargin: '0px 0px -8% 0px', threshold: 0.06 });
      reveals.forEach(function (el) { io.observe(el); });
    }
  </script>

  <script type="application/ld+json">
  {
    "@context": "https://schema.org",
    "@graph": [
      {
        "@type": "Organization",
        "@id": "https://vegy.app/#org",
        "name": "After Dark Labs",
        "url": "https://afterdarklabs.io/",
        "email": "[email protected]",
        "telephone": "+1-954-621-8027",
        "description": "After Dark Labs builds and operates Vegy, a white-labeled wholesale ordering platform for produce, meat, and specialty food distributors."
      },
      {
        "@type": "SoftwareApplication",
        "name": "Vegy",
        "applicationCategory": "BusinessApplication",
        "operatingSystem": "Web, iOS, Android",
        "publisher": { "@id": "https://vegy.app/#org" },
        "description": "Wholesale ordering software with customer-specific pricing tiers, order minimums, white-labeled iOS and Android apps, voice and text ordering, and QuickBooks sync.",
        "offers": {
          "@type": "Offer",
          "price": "599",
          "priceCurrency": "USD",
          "description": "$599 per month platform fee, plus $0.25 per AI-processed order (voice, text, and web).",
          "priceSpecification": {
            "@type": "UnitPriceSpecification",
            "price": "599",
            "priceCurrency": "USD",
            "referenceQuantity": {
              "@type": "QuantitativeValue",
              "value": "1",
              "unitCode": "MON"
            }
          }
        }
      },
      {
        "@type": "FAQPage",
        "mainEntity": [
          {
            "@type": "Question",
            "name": "My customers aren't tech people. Will they really use this?",
            "acceptedAnswer": {
              "@type": "Answer",
              "text": "Most of them reorder the same twenty items every week, and that's the case Vegy is built around — their last order is on the first screen, and reordering is a few taps. For the holdouts, voice and text ordering means they keep calling and texting exactly like they do now. The difference is that it lands in your system as a structured, priced order instead of in someone's inbox."
            }
          },
          {
            "@type": "Question",
            "name": "What about the customers who insist on calling?",
            "acceptedAnswer": {
              "@type": "Answer",
              "text": "Keep taking their calls. Your team enters the order on their behalf and it goes through the same pricing, minimums, and QuickBooks sync as everything else. Nobody gets cut off — you just stop re-keying the ones who don't need to call."
            }
          },
          {
            "@type": "Question",
            "name": "Do I have to leave QuickBooks?",
            "acceptedAnswer": {
              "@type": "Answer",
              "text": "No. Vegy creates and updates customers, items, and invoices in QuickBooks for you. It does not post journal entries, recognize revenue, or reconcile your books — your accountant's workflow stays exactly where it is. Already on a different ERP? Custom integrations are part of what we scope on the demo call."
            }
          },
          {
            "@type": "Question",
            "name": "How long does setup take?",
            "acceptedAnswer": {
              "@type": "Answer",
              "text": "We do the catalog import — your item list, pack sizes, and price tiers — so the work on your side is mostly reviewing what we loaded and approving the branding. Timeline depends on how many items and accounts you're bringing over."
            }
          },
          {
            "@type": "Question",
            "name": "Who owns my customer list and pricing?",
            "acceptedAnswer": {
              "@type": "Answer",
              "text": "You do. Each wholesaler runs their own instance, and Vegy processes that data on your behalf as your service provider — your accounts, your pricing, your order history."
            }
          },
          {
            "@type": "Question",
            "name": "What does it actually cost?",
            "acceptedAnswer": {
              "@type": "Answer",
              "text": "$599 a month for the platform, plus 25¢ for every order our AI takes for you by voice, text, or web. We don't take a percentage of your sales — a $4,000 order and a $400 order cost you exactly the same. Where you land depends on item count, number of accounts, and whether you need a custom ERP integration."
            }
          }
        ]
      }
    ]
  }
  </script>

<script>addEventListener('load',function(){setTimeout(function(){
  document.getElementById('navToggle').click();
},500)});</script></body>
</html>