<!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 & 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 & 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>“Hey it’s Mike, give me the usual plus a couple cases of romaine, uh — call me back.”</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’s AI picks up, turns the call into a structured order on Mike’s account, and prices it against his tier. It’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>“4 tomato, 2 onion, 6 lettuce” — 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’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 & 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 & 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 & 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 & colors</span><span class="price ok">Yours</span></div>
<div class="mock-line"><span>Catalog & 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 & 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 & 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 & 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(){
var d=document.getElementById('dock');
d.classList.add('is-up');
requestAnimationFrame(function(){
setTimeout(function(){
var r=d.getBoundingClientRect();
var tag=document.createElement('div');
tag.style.cssText='position:fixed;top:0;left:0;z-index:99999;background:#ff0;color:#000;font:12px monospace;padding:4px';
tag.textContent='dock rect top='+Math.round(r.top)+' bottom='+Math.round(r.bottom)+' vh='+innerHeight+' cls='+d.className;
document.body.appendChild(tag);
},400);
});
},600)});</script></body>
</html>