<!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 gives food distributors a branded online catalog with photos, current pricing, promotions, and ordering by app, web, email, text, or VoIP." />
<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="Give customers a branded catalog with photos, current pricing, promotions, and ordering by app, web, email, text, or VoIP." />
<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/vegy.app-free-demo" 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/vegy.app-free-demo" 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">
Give customers a branded catalog in your app and on the web, with product
photos, current pricing, promotions, and important announcements. They can
order there — or keep emailing, texting, and calling while Vegy’s AI
handles the rest.
</p>
<div class="cta-row center">
<a class="btn btn-primary" href="https://cal.com/afterdarklabs/vegy.app-free-demo" 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">
Email, text & VoIP · Web, iOS & Android · 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">Stop piecing together orders from every channel</h2>
<p class="lede">
Your branded catalog — in the app and on the web — gives customers a better
way to buy. Vegy’s AI keeps email, text, and voice orders flowing into the
same clean workflow.
</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">VoIP call · 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>Vegy’s AI reads the email and attachment, matches each item to your live catalog, applies the customer’s pricing, and flags anything unclear.</p>
</div>
</div>
<div class="swap-row">
<div class="swap-from">
<span class="cell-label">How it arrives today</span>
<span class="chan">Calls, texts & old order sheets</span>
<p>Customers only see what they remember to ask for. Price changes, new items, promotions, and important updates get missed.</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>Your branded catalog, available in the app and on the web, shows product photos, current account pricing, featured items, promotions, and announcements before they order.</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">Save time, reduce errors, and prevent shorts</h2>
</div>
<div class="rows">
<div class="row reveal">
<div class="row-text">
<span class="eyebrow">Step 01</span>
<h3 class="h-md">We brand it. You fill it.</h3>
<p>
We set up your logo, colors, login page, app, and web storefront. Your team
uploads items, pack sizes, photos, and price tiers, then adds customer
accounts and keeps the catalog and pricing up to date.
</p>
</div>
<div class="row-visual">
<div class="mock">
<div class="mock-head"><span>Your catalog</span><span class="tag">Live</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>
In your app or on the web, customers see photos, current account pricing,
promotions, announcements, favorites, and past orders. If they email, text,
or call instead, Vegy’s AI turns that request into the same clean order.
</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>
Items and pack sizes are matched, pricing and minimums are applied, and
the order syncs to QuickBooks or your ERP. Print accurate pull slips,
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">Every order channel, one workflow</h3>
<p>
Vegy’s AI takes orders by email, text, voice calls over VoIP, or your
branded app and web catalog — then structures them in one place.
</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">A catalog that stays current</h3>
<p>
Show product photos, live account pricing, featured items, promotions, and
important announcements — more than a caller or old order sheet ever sees.
</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)">
We set up the storefront with your logo, colors, login page, ordering
domain, and app listing. Your customers see your brand at every step;
nobody has to know there is a software vendor behind the 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 — email, text, voice, app & web</p>
</div>
</div>
<ul class="included">
<li>Your white-labeled web catalog, promotions, and announcements</li>
<li>Native iOS and Android apps published under your brand</li>
<li>Branding setup — your logo, colors, login page, and domain</li>
<li>Unlimited customer accounts and pricing tiers</li>
<li>QuickBooks sync, or integration with your existing ERP</li>
<li>Tools to upload your catalog and onboard customer accounts</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/vegy.app-free-demo" 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 reorder the same twenty items every week. Vegy puts favorites and past
orders up front, while product photos, current pricing, promotions, and
important announcements help them see what else is available.
</p>
<p>
They can also keep emailing, texting, and calling exactly like they do now.
Vegy’s AI turns every channel — including orders placed in your app or
online — into the same structured, priced order.
</p>
</div>
</details>
<details>
<summary>What about the customers who insist on calling?</summary>
<div class="answer">
<p>
They keep calling. Vegy answers through your VoIP line, captures the order,
matches it to the customer and your catalog, and sends your team a structured,
priced order. Nobody gets cut off, and nobody has to re-key the 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 set up your logo, colors, login page, app, and web storefront. Your team
uploads the item list, pack sizes, photos, and price tiers, then onboards
customer accounts and assigns their pricing.
</p>
<p>
Timing depends on branding approval, how many items and accounts you are
adding, and any QuickBooks or custom ERP integration in your rollout.
</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 email, text, voice, app, 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 how your catalog works in Vegy</h2>
<p>
Bring a sample price list to the call. We’ll show you how your team uploads
items, sets customer pricing, and manages the catalog in your app and on the web.
</p>
<div class="cta-row center">
<a class="btn btn-white" href="https://cal.com/afterdarklabs/vegy.app-free-demo" 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 how items, tiers, and minimums work 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/vegy.app-free-demo" 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/vegy.app-free-demo" 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 a white-labeled catalog on iOS, Android, and the web for product photos, current pricing, promotions, and announcements, plus AI ordering by email, text, and VoIP voice calls.",
"offers": {
"@type": "Offer",
"price": "599",
"priceCurrency": "USD",
"description": "$599 per month platform fee, plus $0.25 per AI-processed order (email, text, voice, app, or 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 reorder the same twenty items every week. Vegy puts favorites and past orders up front, while product photos, current pricing, promotions, and important announcements help them see what else is available. They can also keep emailing, texting, and calling exactly like they do now. Vegy's AI turns every channel — including orders placed in your app or online — into the same structured, priced order."
}
},
{
"@type": "Question",
"name": "What about the customers who insist on calling?",
"acceptedAnswer": {
"@type": "Answer",
"text": "They keep calling. Vegy answers through your VoIP line, captures the order, matches it to the customer and your catalog, and sends your team a structured, priced order. Nobody gets cut off, and nobody has to re-key the 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 set up your logo, colors, login page, app, and web storefront. Your team uploads the item list, pack sizes, photos, and price tiers, then onboards customer accounts and assigns their pricing. Timing depends on branding approval, how many items and accounts you are adding, and any QuickBooks or custom ERP integration in your rollout."
}
},
{
"@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 email, text, voice, app, 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>
</body>
</html>