diff --git a/app/[...slug]/page.tsx b/app/[...slug]/page.tsx
index 5edf9b1d..6f1a16ef 100644
--- a/app/[...slug]/page.tsx
+++ b/app/[...slug]/page.tsx
@@ -17,6 +17,8 @@ import { FAQSection } from '@/components/faq-section';
import { ContactPage } from '@/components/contact-page';
import { AboutPage } from '@/components/about-page';
import { WhoWeServePage } from '@/components/who-we-serve-page';
+import { PublicPageHeader, PublicSurface } from '@/components/public-surface';
+import { RequestMachineForm } from '@/components/forms/request-machine-form';
// Required for static export - ensures this route is statically generated
export const dynamic = 'force-static';
@@ -164,30 +166,27 @@ function renderLocationPage(locationData: any, locationSlug: string) {
<>
-
+
{/* Hero Section */}
-
-
- Vending Machine Supplier in {locationData.city}, {locationData.state}
-
-
- Need a vending machine supplier in {locationData.city}, {locationData.state}? Rocky Mountain Vending has
- been helping local businesses and schools since 2019 with quality vending solutions. We bring healthy
- snacks, cold drinks, and dependable service right to your door—no hassle, no fuss.
-
-
+
{/* Local Anecdote */}
-
-
+
+
A while back, we worked with a {locationData.anecdote.customer} near {locationData.anecdote.location}.
We set them up with a {locationData.anecdote.solution}. Now {locationData.anecdote.outcome}. That's
what we do best—make vending simple.
@@ -348,39 +347,23 @@ function renderLocationPage(locationData: any, locationSlug: string) {
{/* CRM Form */}
-
-
+
+
Get Your Free Vending Machine
- Fill out the form below and we'll contact you within 24 hours to discuss your needs.
+ Tell us about your location and we'll follow up within one business day.
-
+
-
+
{/* Payment Options */}
{locationData.h2Variants.payments}
-
+
@@ -401,7 +384,7 @@ function renderLocationPage(locationData: any, locationSlug: string) {
-
+
{/* Why Choose Us */}
@@ -421,7 +404,7 @@ function renderLocationPage(locationData: any, locationSlug: string) {
-
@@ -737,4 +720,3 @@ export default async function WordPressPage({ params }: PageProps) {
);
}
}
-
diff --git a/app/api/manuals/[...path]/route.ts b/app/api/manuals/[...path]/route.ts
index 7f8af37f..44bebbf0 100644
--- a/app/api/manuals/[...path]/route.ts
+++ b/app/api/manuals/[...path]/route.ts
@@ -2,6 +2,7 @@ import { NextRequest, NextResponse } from 'next/server'
import { readFile } from 'fs/promises'
import { join } from 'path'
import { existsSync } from 'fs'
+import { getManualsFilesRoot } from '@/lib/manuals-paths'
// API routes are not supported in static export (GHL hosting)
// Manuals are now served as static files from /manuals/
@@ -49,7 +50,7 @@ export async function GET(
}
// Construct full path to manual
- const manualsDir = join(process.cwd(), '..', 'manuals-data', 'manuals')
+ const manualsDir = getManualsFilesRoot()
const fullPath = join(manualsDir, filePath)
// Normalize paths to handle both forward and backward slashes
@@ -111,4 +112,3 @@ export async function GET(
}
-
diff --git a/app/api/thumbnails/[...path]/route.ts b/app/api/thumbnails/[...path]/route.ts
index 338e6c04..8e3968c7 100644
--- a/app/api/thumbnails/[...path]/route.ts
+++ b/app/api/thumbnails/[...path]/route.ts
@@ -1,7 +1,8 @@
import { NextRequest, NextResponse } from 'next/server'
import { readFile } from 'fs/promises'
-import { join } from 'path'
import { existsSync } from 'fs'
+import { join } from 'path'
+import { getManualsThumbnailsRoot } from '@/lib/manuals-paths'
// API routes are not supported in static export (GHL hosting)
// Thumbnails are now served as static files from /thumbnails/
@@ -49,7 +50,7 @@ export async function GET(
}
// Construct full path to thumbnail
- const thumbnailsDir = join(process.cwd(), '..', 'thumbnails')
+ const thumbnailsDir = getManualsThumbnailsRoot()
const fullPath = join(thumbnailsDir, filePath)
// Normalize paths to handle both forward and backward slashes
@@ -115,4 +116,3 @@ export async function GET(
}
}
-
diff --git a/app/blog/best-vending-machine-supplier-in-salt-lake-city-utah/page.tsx b/app/blog/best-vending-machine-supplier-in-salt-lake-city-utah/page.tsx
index 71f3bb6c..0e3a6b72 100644
--- a/app/blog/best-vending-machine-supplier-in-salt-lake-city-utah/page.tsx
+++ b/app/blog/best-vending-machine-supplier-in-salt-lake-city-utah/page.tsx
@@ -4,9 +4,17 @@ import { generateSEOMetadata, generateStructuredData } from '@/lib/seo';
import { getPageBySlug } from '@/lib/wordpress-data-loader';
import { cleanWordPressContent } from '@/lib/clean-wordPress-content';
import { Breadcrumbs } from '@/components/breadcrumbs';
+import { PublicPageHeader, PublicSurface } from '@/components/public-surface';
import type { Metadata } from 'next';
const WORDPRESS_SLUG = 'best-vending-machine-supplier-in-salt-lake-city-utah';
+const DISPLAY_TITLE = 'The Best Vending Machine Supplier in Salt Lake City, Utah';
+const DISPLAY_DESCRIPTION =
+ 'A closer look at how Rocky Mountain Vending supports Utah businesses with free placement, machine sales, repairs, manuals, and responsive local service.';
+
+function stripLeadingH1(html: string) {
+ return html.replace(/
+
>
);
diff --git a/app/blog/page.tsx b/app/blog/page.tsx
index 1554b557..7c1a9126 100644
--- a/app/blog/page.tsx
+++ b/app/blog/page.tsx
@@ -1,6 +1,7 @@
import Link from 'next/link'
import Image from 'next/image'
import { Breadcrumbs } from '@/components/breadcrumbs'
+import { PublicInset, PublicPageHeader, PublicSurface } from '@/components/public-surface'
import type { Metadata } from 'next'
export const metadata: Metadata = {
@@ -46,21 +47,21 @@ export default function BlogPage() {
{ label: 'Blog', href: '/blog' },
]}
/>
-
-
-
- Blog
-
-
-
+
+
-
+
{blogPosts.map((post) => (
-
+
-
+
-
+
{post.title}
{post.description}
-
+
-
+
Read more
-
+
))}
diff --git a/app/manuals/dashboard/page.tsx b/app/manuals/dashboard/page.tsx
index 74acda18..6ab0b4f4 100644
--- a/app/manuals/dashboard/page.tsx
+++ b/app/manuals/dashboard/page.tsx
@@ -1,5 +1,6 @@
import { Metadata } from 'next'
import { ManualsDashboardClient } from '@/components/manuals-dashboard-client'
+import { PublicInset, PublicPageHeader } from '@/components/public-surface'
import { getConvexManualDashboard } from '@/lib/convex-service'
import { readFileSync } from 'fs'
import { join } from 'path'
@@ -79,16 +80,19 @@ export default async function ManualsDashboardPage() {
return (
-
-
- Manual Processing Dashboard
-
-
- Comprehensive overview of processed manual data, statistics, gap analysis, and optimization results.
-
-
+
+
+ Admin-style data view for manual operations.
+
+
-
+
+
+
)
}
@@ -96,4 +100,3 @@ export default async function ManualsDashboardPage() {
-
diff --git a/app/manuals/page.tsx b/app/manuals/page.tsx
index 953a42c8..9dfa7e07 100644
--- a/app/manuals/page.tsx
+++ b/app/manuals/page.tsx
@@ -1,4 +1,7 @@
+import { existsSync } from 'fs'
+import { join } from 'path'
import { Metadata } from 'next'
+import { PublicInset, PublicPageHeader } from '@/components/public-surface'
import { businessConfig } from '@/lib/seo-config'
import { ManualsPageShell } from '@/components/manuals-page-shell'
import { listConvexManuals } from '@/lib/convex-service'
@@ -19,6 +22,7 @@ import {
shouldIncludePaymentComponents,
} from '@/lib/site-config'
import { generateStructuredData } from '@/lib/seo'
+import { getManualsThumbnailsRoot } from '@/lib/manuals-paths'
export const metadata: Metadata = {
title: 'Vending Machine Manuals | Download PDF Guides | Rocky Mountain Vending',
@@ -105,6 +109,22 @@ export default async function ManualsPage() {
// 3. Filter by minimum manual count per manufacturer (new)
manuals = filterManufacturersByMinCount(manuals, minManualCount)
+
+ // Hide broken local thumbnails so the public manuals page doesn't spam 404s.
+ const thumbnailsRoot = getManualsThumbnailsRoot()
+ manuals = manuals.map((manual) => {
+ if (!manual.thumbnailUrl || /^https?:\/\//i.test(manual.thumbnailUrl)) {
+ return manual
+ }
+
+ const relativeThumbnailPath = manual.thumbnailUrl.includes('/thumbnails/')
+ ? manual.thumbnailUrl.replace(/^.*\/thumbnails\//, '')
+ : manual.thumbnailUrl
+
+ return existsSync(join(thumbnailsRoot, relativeThumbnailPath))
+ ? manual
+ : { ...manual, thumbnailUrl: undefined }
+ })
// 4. Group and get unique lists
const groupedManuals = groupManuals(manuals)
@@ -155,27 +175,26 @@ export default async function ManualsPage() {
dangerouslySetInnerHTML={{ __html: JSON.stringify(collectionSchema) }}
/>
-
-
- Vending Machine Manuals
-
-
- Download free PDF manuals, service guides, and parts documentation for hundreds of vending machine models from leading manufacturers including Royal Vendors, Dixie-Narco, Vendo, Crane Merchandising, BevMax, Merchant Series, AP, GPL, Seaga, USI, and more. Find comprehensive service manuals, parts catalogs, installation instructions, troubleshooting guides, wiring diagrams, and maintenance documentation for snack machines, beverage machines, combo vending machines, coffee machines, food machines, and frozen food machines. All manuals are organized by manufacturer and machine type, with many featuring available replacement parts with direct purchase links.
-
-
-
- {manuals.length} manuals available from{' '}
- {manufacturers.length} manufacturers
-
-
-
+
+
+
+ {manuals.length} manuals available from {manufacturers.length} manufacturers
+
+
+
-
+
+ />
+
>
)
diff --git a/app/products/page.tsx b/app/products/page.tsx
index 32fe535b..afc8a88e 100644
--- a/app/products/page.tsx
+++ b/app/products/page.tsx
@@ -1,4 +1,5 @@
import { fetchAllProducts } from '@/lib/stripe/products'
+import { PublicInset, PublicPageHeader, PublicSurface } from '@/components/public-surface'
import { ProductGrid } from '@/components/product-grid'
import Link from 'next/link'
@@ -8,16 +9,15 @@ export const metadata = {
}
export default async function ProductsPage() {
- let products = []
+ let products: Awaited> = []
let error: string | null = null
try {
products = await fetchAllProducts()
} catch (err) {
- console.error('Error fetching products:', err)
if (err instanceof Error) {
if (err.message.includes('STRIPE_SECRET_KEY')) {
- error = 'Stripe configuration error. Please check environment variables.'
+ error = 'Our product catalog is temporarily unavailable. Please contact us for current machine options.'
} else {
error = 'Failed to load products. Please try again later.'
}
@@ -27,33 +27,32 @@ export default async function ProductsPage() {
}
return (
-
-
-
-
+
+
+
- Admin: Setup Guide
+ Ask About Sales
-
- Our Products
-
-
- Browse our selection of vending machines and equipment
-
-
+
{error ? (
-
+
{error}
Please try again later.
-
+
) : products.length === 0 ? (
-
+
No products available yet
@@ -62,15 +61,16 @@ export default async function ProductsPage() {
Our product catalog is being prepared. Please check back soon or contact us directly for current offerings.
-
+
For Vending Machine Sales:
Call us at (435) 233-9668 or visit our contact page for immediate assistance.
-
-
+
+
) : (
-
+
+
+
)}
)
}
-
diff --git a/app/service-areas/page.tsx b/app/service-areas/page.tsx
index 8a18afca..10a410f0 100644
--- a/app/service-areas/page.tsx
+++ b/app/service-areas/page.tsx
@@ -1,11 +1,11 @@
-import type { Metadata } from "next";
-import Link from "next/link";
-import Image from "next/image";
-import { getAllLocations } from "@/lib/location-data";
-import { businessConfig } from "@/lib/seo-config";
-import { MapPin, Phone, ArrowRight, Wrench, Clock } from "lucide-react";
-import { Card, CardContent } from "@/components/ui/card";
-import { Button } from "@/components/ui/button";
+import type { Metadata } from "next"
+import Link from "next/link"
+import Image from "next/image"
+import { getAllLocations } from "@/lib/location-data"
+import { businessConfig } from "@/lib/seo-config"
+import { MapPin, Phone, ArrowRight, Wrench, Clock } from "lucide-react"
+import { Button } from "@/components/ui/button"
+import { PublicInset, PublicPageHeader, PublicSurface } from "@/components/public-surface"
export const metadata: Metadata = {
title: "Service Areas | Vending Machines Across Utah | Rocky Mountain Vending",
@@ -29,13 +29,44 @@ export const metadata: Metadata = {
alternates: {
canonical: `${businessConfig.website}/service-areas`,
},
-};
+}
+
+function LocationCard({
+ city,
+ zipCode,
+ href,
+ neighborhoods,
+}: {
+ city: string
+ zipCode: string
+ href: string
+ neighborhoods: string[]
+}) {
+ return (
+
+
+
- Rocky Mountain Vending proudly serves businesses and schools across 20+ cities in Utah. We provide FREE
- vending machines with no-cost installation and delivery within 50 miles of most service areas.
-
-
+
+
- {/* Map Section */}
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
- {/* Quick Contact */}
-
-
-
-
Don't See Your City?
-
- We may still be able to serve you! Give us a call to check if we can deliver to your location.
+
+
+
Need Coverage Confirmation?
+
+ Don't see your city yet?
+
+
+ We may still be able to help. If you're near one of these service zones, call or send us a request and we'll confirm the best next step.
We'll confirm delivery range, support availability, and the best intake path for your location.
+
+
+ Request a Free Machine
+
+
+
- {/* Salt Lake County */}
-
- {/* Our Services Section */}
-
-
-
-
Our Vending Machine Services
-
- Serving {state} with comprehensive vending machine solutions
-
+
+
+
+
Core Services
+
Our vending machine services across {state}
+
+ From free placement and machine sales to repairs, moving, and parts help, we keep one consistent service experience across every city we serve.
+
+
+
+
+ {[
+ {
+ icon: Wrench,
+ title: "Repairs",
+ body: "Expert repair and maintenance for snack, beverage, food, and combo machines.",
+ href: "/services/repairs",
+ cta: "Learn more",
+ },
+ {
+ icon: MapPin,
+ title: "Parts",
+ body: "Replacement parts, manuals, and support for major vending machine brands.",
+ href: "/services/parts",
+ cta: "Shop parts",
+ },
+ {
+ icon: Clock,
+ title: "Moving",
+ body: "Professional machine moving for vending machines and related equipment across Utah.",
+ href: "/services/moving",
+ cta: "Moving services",
+ },
+ ].map((service) => (
+
+
+
+
+
{service.title}
+
{service.body}
+
+ {service.cta}
+
+
+
+ ))}
+
+
+
+
+
+ {[
+ {
+ title: "Salt Lake County",
+ description: "Serving the heart of Utah's business district with comprehensive vending solutions.",
+ items: saltLakeCounty,
+ },
+ {
+ title: "Davis County",
+ description: "Supporting businesses from Ogden to Layton with reliable vending service and repairs.",
+ items: davisCounty,
+ },
+ {
+ title: "Utah County",
+ description: "Delivering quality vending solutions to Provo and surrounding areas.",
+ items: utahCounty,
+ },
+ ].map((section) => (
+
+
+
Coverage Area
+
{section.title}
+
{section.description}
-
-
-
-
-
Vending Machine Repairs
-
- Expert repair and maintenance services for all vending machine types
-
-
- Learn More
-
-
-
-
-
-
-
Vending Machine Parts
-
- Quality replacement parts for all major vending machine brands
-
-
- Shop Parts
-
-
-
-
-
-
-
Vending Machine Moving
-
- Professional vending machine relocation services in {state}
-
-
- Moving Services
-
-
-
+
+ {section.items.map((location) => (
+
+ ))}
-
-
-
- {/* Salt Lake County */}
-
-
-
Salt Lake County
-
- Serving the heart of Utah's business district with comprehensive vending solutions
-
-
-
- {saltLakeCounty.map((location) => (
-
-
-
-
-
-
- {location.city}
-
-
{location.zipCode}
-
-
-
-
-
Neighborhoods:
-
{location.neighborhoods.slice(0, 2).join(", ")}
-
-
-
-
- ))}
-
+ ))}
- {/* Davis County */}
-
-
-
Davis County
-
- Supporting businesses from Ogden to Layton with reliable vending services
-
-
-
- {davisCounty.map((location) => (
-
-
-
-
-
-
- {location.city}
-
-
{location.zipCode}
-
-
-
-
-
Neighborhoods:
-
{location.neighborhoods.slice(0, 2).join(", ")}
-
-
-
-
- ))}
-
-
+
+
+
Why businesses choose Rocky Mountain Vending
+
+ {[
+ ["FREE vending machines", "No upfront costs, hidden fees, or machine charges for qualifying businesses."],
+ ["FREE delivery and installation", "Within range of our service areas, we handle setup and launch for you."],
+ ["FREE maintenance and repairs", "We keep machines running smoothly so your team has fewer interruptions."],
+ ["Healthy and traditional options", "We tailor product mix to the people using the machines every day."],
+ ].map(([title, body]) => (
+
+
{title}
+
{body}
+
+ ))}
+
+
+ Get Your Free Machine
+
+
- {/* Utah County */}
-
-
-
Utah County
-
- Delivering quality vending solutions to Provo and surrounding areas
-
-
-
- {utahCounty.map((location) => (
-
-
-
-
-
-
- {location.city}
-
-
{location.zipCode}
-
-
-
-
-
Neighborhoods:
-
{location.neighborhoods.slice(0, 2).join(", ")}
-
-
-
-
- ))}
-
-
-
- {/* Why Choose Us Section */}
-
-
-
-
Why Choose Rocky Mountain Vending?
-
-
-
✓ FREE Vending Machines
-
No upfront costs, no hidden fees. We provide the machine at no charge.
-
-
-
✓ FREE Delivery & Installation
-
Within 50 miles of most service areas. We handle everything.
-
-
-
✓ FREE Maintenance & Repairs
-
We keep your machine running smoothly at no cost to you.
-
-
-
✓ Healthy & Traditional Options
-
Stock your machine with whatever your team prefers.
-
-
-
-
- Get Your Free Machine Today
-
-
-
-
-
-
- {/* Service Details */}
-
-
What We Offer in Every Service Area
-
-
-
-
🏢
-
For Businesses
-
- Offices, warehouses, auto shops, and more. Keep your team energized and productive.
-
-
-
-
-
-
🏫
-
For Schools
-
- Healthy options for students and staff. Easy management, no hassle.
-
-
-
-
-
-
💪
-
For Gyms & Fitness
-
- Protein bars, healthy snacks, and sports drinks. Perfect post-workout fuel.
-
-
-
-
+
+
What we support in every service area
+
+ {[
+ ["For businesses", "Offices, warehouses, auto shops, and other workplaces that want reliable on-site vending."],
+ ["For schools", "Healthy options for students and staff with a service plan that stays easy to manage."],
+ ["For gyms and fitness spaces", "Protein bars, sports drinks, and post-workout options that match the location."],
+ ].map(([title, body]) => (
+
+
{title}
+
{body}
+
+ ))}
+
+
- );
+ )
}
diff --git a/app/vending-machines/machines-for-sale/page.tsx b/app/vending-machines/machines-for-sale/page.tsx
index 749ded57..80fd165a 100644
--- a/app/vending-machines/machines-for-sale/page.tsx
+++ b/app/vending-machines/machines-for-sale/page.tsx
@@ -1,20 +1,21 @@
-import { notFound } from 'next/navigation';
-import Script from 'next/script';
-import { loadImageMapping } from '@/lib/wordpress-content';
-import { generateSEOMetadata, generateStructuredData } from '@/lib/seo';
-import { getPageBySlug } from '@/lib/wordpress-data-loader';
-import { cleanWordPressContent } from '@/lib/clean-wordPress-content';
-import type { Metadata } from 'next';
+import { notFound } from 'next/navigation'
+import { loadImageMapping } from '@/lib/wordpress-content'
+import { generateSEOMetadata, generateStructuredData } from '@/lib/seo'
+import { getPageBySlug } from '@/lib/wordpress-data-loader'
+import { cleanWordPressContent } from '@/lib/clean-wordPress-content'
+import type { Metadata } from 'next'
+import { PublicPageHeader, PublicSurface } from '@/components/public-surface'
+import { RequestMachineForm } from '@/components/forms/request-machine-form'
-const WORDPRESS_SLUG = 'vending-machines-for-sale-in-utah';
+const WORDPRESS_SLUG = 'vending-machines-for-sale-in-utah'
export async function generateMetadata(): Promise {
- const page = getPageBySlug(WORDPRESS_SLUG);
+ const page = getPageBySlug(WORDPRESS_SLUG)
if (!page) {
return {
title: 'Page Not Found | Rocky Mountain Vending',
- };
+ }
}
return generateSEOMetadata({
@@ -24,114 +25,78 @@ export async function generateMetadata(): Promise {
date: page.date,
modified: page.modified,
image: page.images?.[0]?.localPath,
- });
+ })
}
export default async function MachinesForSalePage() {
try {
- const page = getPageBySlug(WORDPRESS_SLUG);
+ const page = getPageBySlug(WORDPRESS_SLUG)
if (!page) {
- notFound();
+ notFound()
}
- let imageMapping: any = {};
+ let imageMapping: Record = {}
try {
- imageMapping = loadImageMapping();
- } catch (e) {
- imageMapping = {};
+ imageMapping = loadImageMapping()
+ } catch {
+ imageMapping = {}
}
- const content = page.content ? (
-
+ If you're a business looking for placement rather than a purchase, use the request form here and we'll help you sort out the right next step.
+
+
+
+
+
+
+
>
- );
+ )
} catch (error) {
if (process.env.NODE_ENV === 'development') {
- console.error('Error rendering Machines for Sale page:', error);
+ console.error('Error rendering Machines for Sale page:', error)
}
- notFound();
+ notFound()
}
}
-
-
-
-
-
-
-
diff --git a/app/vending-machines/machines-we-use/page.tsx b/app/vending-machines/machines-we-use/page.tsx
index a7c5cc80..0a162dca 100644
--- a/app/vending-machines/machines-we-use/page.tsx
+++ b/app/vending-machines/machines-we-use/page.tsx
@@ -1,151 +1,123 @@
-import { generateSEOMetadata, generateStructuredData } from '@/lib/seo';
-import { VendingMachinesShowcase } from '@/components/vending-machines-showcase';
-import { FeatureCard } from '@/components/feature-card';
-import type { Metadata } from 'next';
+import { generateSEOMetadata, generateStructuredData } from '@/lib/seo'
+import { VendingMachinesShowcase } from '@/components/vending-machines-showcase'
+import { FeatureCard } from '@/components/feature-card'
+import type { Metadata } from 'next'
+import { PublicPageHeader, PublicSurface } from '@/components/public-surface'
+import { RequestMachineForm } from '@/components/forms/request-machine-form'
export async function generateMetadata(): Promise {
return generateSEOMetadata({
title: 'Machines We Use | Rocky Mountain Vending',
description: 'Learn about the high-quality vending machines and equipment we use at Rocky Mountain Vending, including credit card readers, drop sensors, and specialty equipment.',
- });
+ })
}
export default async function MachinesWeUsePage() {
try {
- // Generate structured data
const structuredData = generateStructuredData({
title: 'Machines We Use',
description: 'Learn about the high-quality vending machines and equipment we use at Rocky Mountain Vending, including credit card readers, drop sensors, and specialty equipment.',
url: 'https://rockymountainvending.com/vending-machines/machines-we-use/',
type: 'WebPage',
- });
+ })
return (
<>
-
-
-
-
Vending Machines
-
- Only The Best for Your Location
-
-
-
- {/* Features Grid */}
-
+
+
+
+
+
-
-
-
-
- {/* Specialty Equipment Section */}
-
-
Specialty Equipment
-
- At Rocky Mountain Vending, we invest in high-quality equipment to deliver the best service with minimal interruptions. For locations that handle a lot of cash, we use bill recyclers to ensure customers can easily use $1, $2, $5, $10, or $20 bills without worry. This flexibility improves convenience and keeps transactions smooth. Additionally, we use commercial-grade steam cleaners to thoroughly sanitize our machines, a step many vendors overlook. Our commitment to using the best tools ensures a clean, efficient, and hassle-free vending experience.
-