How to Build a Parking App: Live Availability + Payments
Learn the steps to plan, design, and build a mobile parking app with real-time space availability, reservations, and secure payments, from MVP to launch.

Define the Use Case and Success Metrics
A parking availability app can feel like it’s “for everyone,” but successful products start with one clear promise. Are you helping drivers find a spot faster, helping them pay with fewer steps, or helping operators manage inventory and compliance?
Your first release should focus on a single primary job-to-be-done, with everything else supporting it.
What problem are you solving?
Most parking products focus on one (or a combination) of these outcomes:
- Find parking faster: reduce “cruising” by showing where parking exists right now.
- Pay quickly: remove friction at the curb or gate with a reliable parking payment app experience.
- Avoid tickets: make rules clearer, extend sessions easily, and prove payment.
- Reduce congestion: help cities and operators spread demand across zones.
Be specific about where the pain happens. “Downtown street parking during lunch hours” leads to different requirements than “airport garage parking with reservations.”
Who is it for?
Your use case should name the primary user and the supporting stakeholders:
- Drivers: want accurate real-time parking data, simple payment, and confidence they’re compliant.
- Garages/lots: want occupancy visibility, pricing control, fewer disputes, and predictable payouts.
- Cities/operators: want better utilization, policy enforcement, and reporting.
- Enforcement teams: need fast verification (by plate, zone, or session) and clear status.
Choosing the primary user helps you decide what “great” looks like in the UI and what data must be trustworthy.
Typical app types (pick one to start)
- Street parking app: zones, time limits, rule complexity, and enforcement integration are usually critical.
- Garage parking app: inventory by facility, entry/exit flows, receipts, sometimes QR or license plate recognition.
- Mixed marketplace: combines street + garages, often adds search, filters, and (optionally) parking reservations.
A focused parking app MVP can still expand later—just don’t design the first version as if you already support every model.
Define success metrics that match the promise
Use metrics that connect to user value and business performance:
- Time to find a spot: median minutes from app open to “navigate/parked.”
- Conversion to payment: % of sessions that reach checkout from search/results.
- Payment success rate: % of attempted transactions that complete (watch failures by method).
- Retention: weekly/monthly active users and repeat parkers per area/zone.
If you’re building a parking availability app, measure accuracy too: how often “available” results in a successful park. Metrics like these keep product decisions grounded as features and partnerships expand.
Choose Features: MVP vs Nice-to-Have
A parking availability app can quickly balloon into “everything for everyone.” The fastest way to ship (and learn) is to separate what drivers must have to park and pay today from what’s valuable later.
Start with the driver’s critical path (MVP)
For a parking payment app, the MVP should cover one simple promise: find a spot, understand the price, and pay without stress. Prioritize:
- Map + search: show nearby facilities and zones with clear pins and filters (price, hours, height limits).
- Real-time availability: a simple “spaces available / limited / full” indicator is often enough early on—accuracy matters more than fancy visuals.
- Pricing transparency: hourly/daily rates, minimums, max caps, and any surcharges displayed before the user commits.
- Navigation: one-tap directions to the selected entrance (deep link to Apple/Google Maps).
- Pay + extend: start a session, extend time, end when allowed.
- Receipts: in-app history plus email receipts for expenses.
This gives you a credible parking app MVP that people can use repeatedly, and it lets you validate real-time parking data quality and payment conversion.
Operator features that unlock supply
If you don’t make operators successful, availability and pricing will drift. The operator “minimum viable console” typically includes:
- Inventory management: zones, spot counts, operating hours, restrictions.
- Pricing rules: time-of-day rates, event pricing, grace periods, max stays.
- Promotions: promo codes or discounted windows to drive adoption.
- Reporting: occupancy trends, revenue, top locations, disputes.
Even if you hide it behind a lightweight web dashboard at first, these tools help keep your smart parking app accurate.
Admin needs (don’t skip these)
You’ll need basic back-office workflows from day one:
- User lookup and support tools
- Refunds/voids and receipt re-sends
- Dispute handling notes and audit trail
Nice-to-have features to schedule later
Once core flows work reliably, consider adding:
- Reservations (powerful, but raises cancellation and no-show rules)
- Permits and monthly access
- EV charging status and pricing
- Valet handoff flows
- Subscriptions for frequent parkers
If you’re unsure, ship the smallest feature set that supports repeat parking sessions, then expand based on real usage (see /blog/parking-app-mvp-guide).
Plan How You’ll Get Real-Time Availability Data
Real-time availability is the feature users judge instantly: if the map says a spot is open and it isn’t, trust drops. Before you build, decide where occupancy signals will come from, how often you’ll refresh them, and how you’ll communicate uncertainty.
Common signal sources (and what they’re good for)
For street parking, you typically blend multiple inputs:
- Sensors (in-ground or curbside): accurate per-space data, but costly to deploy.
- Cameras + computer vision: good coverage, but can struggle with weather, glare, and double-parking.
- Meter events (start/stop, expiry): useful proxy, but paid time doesn’t always equal actual occupancy.
- Enforcement scans (license plate reads): strong validation signal, but not continuous.
- User reports: fast and cheap, but needs incentives and fraud controls.
For garages and lots, occupancy is often more straightforward:
- Gate counters (entries/exits): reliable totals, less detail about which level/zone.
- Ticketing systems / POS: ties availability to payments and validations.
- Occupancy APIs from operators or aggregators: quickest path if available.
Freshness and confidence: set expectations
Define a freshness target per source (for example, every 30–60 seconds for garages, every 2–5 minutes for street proxies). In the UI, show “updated X minutes ago” and a confidence score (e.g., High/Medium/Low) based on signal quality, recency, and cross-checks.
When data is missing, don’t guess
Have a clear fallback policy:
- Show “unknown” rather than “available.”
- Suggest alternatives nearby (garages, adjacent blocks, off-peak rates).
- Allow users to filter to high-confidence areas when they’re in a hurry.
This planning step also shapes your partnerships and the data model you’ll build later—so write it down early and treat it as a product requirement, not an engineering detail.
Integrations and Partnerships Checklist
Your parking availability app is only as accurate as the data and partners behind it. Before you build integrations, get clear on who you’ll rely on, what they can reliably deliver, and what you’re allowed to do with that data.
Who you may need to partner with
Most smart parking app projects use a mix of sources:
- Cities and municipalities (curb rules, zones, permits, enforcement signals)
- Parking operators (garages/lots: inventory, rates, hours, entry/exit events)
- Hardware vendors (sensors, gates, LPR, meters, kiosks)
- Data aggregators (bundled real-time parking data across many providers)
For a parking payment app, operators are especially important because they control the point-of-sale flow (pay-by-plate, QR, ticket-based, etc.).
Integration questions to ask up front
Treat this like a pre-flight checklist—these answers will shape your parking app MVP scope and your timeline.
API access & documentation
- Do they offer a stable API, webhooks, or only batch exports?
- Is there a sandbox environment and test credentials?
Coverage & freshness
- Which facilities/zones are included today (and which are “planned”)?
- Update frequency for availability: every few seconds, every minute, or delayed?
Rate limits, uptime, and support
- What are the rate limits and pricing per call?
- Do they offer an SLA for uptime and response time?
- What’s the incident/support process and expected response window?
Costs and commercial model
- Per-location, per-transaction, revenue share, or flat licensing?
- Any fees for displaying rates, enabling parking reservations, or processing payments?
Contract basics you should not skip
Even early pilots need written terms—especially when you plan to redistribute real-time parking data.
- Data ownership: who owns derived data (predictions, occupancy estimates)?
- Redistribution rights: can you show it in your app, store it, and use it to train models?
- Privacy and security: plate numbers, device IDs, and payment tokens—who handles what?
- Change management: notice period for API changes and deprecations.
- Liability: what happens if availability is wrong or rates change unexpectedly?
Pilot strategy: validate, then expand
Start with 1–2 areas (e.g., one garage operator + one city curb zone). Choose locations where partners can provide consistent data and where you can measure outcomes (conversion, payment completion, dispute rate). After you validate reliability and unit economics, expand facility-by-facility rather than adding more integration types at once.
Design the User Experience (Flows and Screens)
A parking app wins or loses in the first 30 seconds. People are usually in motion, under time pressure, and comparing options quickly. Your UX should minimize typing, reduce decision fatigue, and make “pay + go” feel effortless.
Start with a map-first flow
For most drivers, the fastest mental model is visual. A practical core flow is:
search area → see options → select → pay → extend.
Keep the default view map-based, with clear pin states (available, limited, full, unknown). Add a map/list toggle so users can switch to a ranked list when they want to compare prices or walking distance.
Key screens to design early
Focus on the screens that remove friction and build confidence:
- Onboarding: a short explanation of what data you use (location, payment) and what the user gets (live availability, receipts).
- Permissions (location): ask when needed, with plain-language prompts and a fallback if location is denied.
- Search + map/list: quick filters (price, distance, EV, height limit) without burying results.
- Spot details: price breakdown, hours, rules (max stay, overnight), and a clear “What happens after I pay?” section.
- Checkout: saved payment methods, promo code (if relevant), and an obvious confirmation state.
Accessibility and error states aren’t optional
Parking is a real-world task; the UI must be readable at a glance. Cover the basics:
- Readable contrast and legible font sizes
- Large tap targets (especially for pins and primary actions)
- Clear error states (payment failed, spot unavailable, weak signal) with a next step, not just an alert
Build trust with transparent pricing
Trust signals should be baked into the flow, not added later. Show fees early, explain what’s refundable (if anything), and display secure payment indicators during checkout.
After payment, provide a simple receipt view with time, location, rate, and an “Extend parking” button so users don’t have to hunt for it later.
Pick the Tech Stack and High-Level Architecture
Choosing your tech stack sets the pace for everything that follows: how quickly you can ship a parking app MVP, how reliably you can serve real-time parking data, and how safely you can run in-app payments.
Mobile app: iOS, Android, or cross-platform
- Native (Swift/Kotlin) is a strong fit when you need the best mapping performance, background location behavior, and platform-specific UX. It can cost more because you maintain two codebases.
- Cross-platform (Flutter/React Native) can speed up delivery for a parking availability app with shared UI and business logic. You’ll still want a plan for “native bridges” for things like Apple Pay/Google Pay, deep links, and high-accuracy location.
- A common compromise: cross-platform for the main app, plus small native modules for payments and location-critical features.
If you want to move fast on early prototypes without committing to a full engineering pipeline on day one, a vibe-coding workflow can help. For example, Koder.ai lets teams draft a React-based web dashboard (operator console) and backend services (Go + PostgreSQL) via chat, then iterate quickly with planning mode and snapshots/rollback—useful when you’re still refining your parking app MVP scope.
High-level architecture: split the core services
Keep the backend modular so you can evolve from a prototype to a smart parking app without rewrites:
- Identity & user accounts: login, vehicles, saved payment methods.
- Parking sessions service: start/stop sessions, extensions, receipts.
- Pricing engine: rate tables, time-of-day rules, caps, holidays (keep it separate to avoid mixing “money logic” into session code).
- Payment service: tokenization, refunds, chargebacks, and PCI-compliant payments (use a PSP like Stripe/Adyen/Braintree rather than storing card data).
- Notifications: push/SMS/email for expiring time, receipts, and reservation reminders.
Data stores: optimize for transactions and speed
- Relational DB (PostgreSQL/MySQL) for sessions, payments, and audit trails.
- Cache (Redis) for fast reads (e.g., zone availability snapshots) to reduce latency.
- Time-series/event storage for ingestion of sensor feeds and updates (useful when you later add parking enforcement integration or analytics).
Hosting, environments, and reliability
Run separate dev/stage/prod environments with automated deployments.
Use a secrets manager (not environment files in repos), scheduled backups, and clear rollback procedures. For real-time parking data, prioritize monitoring, rate limiting, and graceful degradation (e.g., show “availability last updated X minutes ago”) over brittle “always live” assumptions.
Model the Data: Spots, Zones, Rates, and Sessions
A parking availability app lives or dies by its data model. If you get the relationships right early, your real-time parking data stays consistent across search, navigation, reservations, and your parking payment app flow.
Core entities (and how they relate)
Start with a small set of tables/collections that you can extend later:
- User → owns one or more Vehicle records
- PaymentMethodToken → stored per user (tokenized by your payment provider)
- Location/Zone → a logical area (garage level, street segment, campus lot)
- Spot/Facility → a single spot (if instrumented) or a facility with capacity
- Rate → pricing rules tied to a zone/facility (time windows, max duration)
- Session → an active paid parking period (start/end, status)
- Reservation (optional for your parking app MVP) → holds inventory before session starts
- Receipt → immutable proof of payment (line items, taxes/fees, provider IDs)
Keep Rates independent from Sessions. A session should capture the “rate snapshot” used at purchase time so later rate edits don’t rewrite history.
Representing availability without lying
Model availability at both spot and zone levels:
- current_occupancy (or available_count) for fast UI
- predicted_availability for ETA-based search (optional, but valuable)
- last_update_at on every availability record so the app can show “updated 2 min ago” and degrade gracefully when sensors go quiet
Idempotency + audit trails (non-negotiable)
For payments and session starts, use an idempotency_key (per user action) to prevent double charges during retries or flaky networks.
Add audit fields/events for anything financial or operational:
- who changed rates, when, and what changed
- refunds, session edits, enforcement-related overrides
This structure supports a smart parking app today—and avoids painful migrations later.
Build Secure Payments and Receipts
Payments are where a parking payment app either earns trust—or loses it. Your goal is simple: make checkout fast, predictable, and safe, while keeping scope realistic for a parking app MVP.
Payment options users expect
Start with the basics that cover most drivers:
- Cards (credit/debit)
- Apple Pay / Google Pay for one-tap checkout
- Stored payment tokens for returning users (so they don’t retype details)
Digital wallets often improve conversion because the driver is already in a hurry and may have poor connectivity in a garage.
PCI approach: minimize what you touch
For PCI-compliant payments, avoid handling raw card numbers yourself. Use a payment provider (e.g., Stripe, Adyen, Braintree) and rely on tokenization.
In practice, that means:
- Your app collects payment details via the provider’s SDK/UI component
- The provider returns a token (or payment method ID)
- Your backend charges using that token
- You never store raw card data—only the token and metadata you need for support and receipts
This approach reduces risk and speeds up compliance work.
Key payment flows for parking
Parking is not a standard “buy once” checkout. Plan these flows early:
- Pre-auth vs. capture: pre-authorize an estimated maximum, then capture the final amount when the session ends.
- Pay-as-you-go: charge in increments (e.g., every 30–60 minutes) for longer stays.
- Extensions: allow users to add time without creating a new session.
- Overstay handling: define what happens if the user exceeds paid time—auto-extend where allowed, apply a fee, and send a clear notification.
Receipts, refunds, and disputes
Receipts should be automatic and easy to retrieve. Offer:
- In-app receipt history and emailed receipts
- Itemized details (location, time, rate, taxes/fees, authorization vs final charge)
- Refund tools: voids (same-day), partial refunds, and a simple dispute workflow
If you plan parking enforcement integration later, keep your receipt and session IDs consistent so support can reconcile charges with real-time parking data and enforcement records.
Handle Pricing Rules and Edge Cases
Pricing is where a parking availability app can quickly lose user trust. If the total changes at checkout—or worse, after the session starts—people feel tricked. Treat pricing as a first-class product feature, not an afterthought.
Define every pricing input (and who controls it)
Before building your parking payment app, document the exact inputs that determine the price:
- Zone/lot (different operators, different rules)
- Time of day / day type (weekday vs event nights)
- Duration (hourly, daily, fractional billing, rounding rules)
- Demand rules (dynamic pricing triggers, if you support them)
- Caps and maximum stay (e.g., “max $18/day” or “2-hour limit”)
Make it clear which values come from your system vs the operator vs a city feed (for real-time parking data). This clarity prevents disputes later.
Make fees obvious before the user pays
Show a simple breakdown right in the booking or “Start parking” flow:
- Base rate
- Taxes (if applicable)
- Service fee
- Operator fee (if any)
Use plain language like “You’ll be charged $X now” or “Estimated total for 1h 30m: $X,” and update instantly as the user adjusts duration.
Handle the tricky moments
Edge cases are predictable—plan them upfront:
- Rate changes mid-session: decide whether you lock the rate at start, apply the new rate after a cutoff, or always apply the current rate. Put the rule in the receipt.
- Grace periods: common for entry/exit buffers. Specify whether the grace window is free, discounted, or simply prevents enforcement.
- Enforcement rules: if you integrate with parking enforcement, align on “paid until” timestamps, plate/space identifiers, and how quickly status must propagate.
Test pricing like it’s finance (because it is)
Add unit tests with real scenarios and boundary times (11:59→12:00, DST changes, zone switches). For a parking app MVP, a small pricing test suite can prevent expensive support issues as you scale. If you want a checklist, link it from /blog/pricing-test-cases.
Notifications, Location, and Safety Features
A parking availability app feels “live” when it keeps people informed without being noisy. Notifications and location access are also where trust is won or lost—so design them deliberately.
Push notifications that help (not spam)
Use push notifications to reduce support tickets and abandoned sessions:
- Expiring session reminders (e.g., 10 and 2 minutes before end) with a clear “Extend” action.
- Extension prompts when the user is still nearby or has an active route to the car.
- Payment confirmations immediately after successful payment (and include receipt access).
- Refund and dispute updates so users aren’t left wondering what happened.
Let users fine-tune alerts in settings (session reminders on/off, refund updates always on). Keep messaging specific: zone/garage name, end time, and next step.
Location permissions with clear explanations
Ask for location permission only when it unlocks real value:
- While Using the App: show nearby zones, guide walking directions, and auto-detect entry.
- Background location (optional): enable “leave the zone” reminders or smarter extension prompts.
Explain it in plain language before the system prompt: what you collect, when, and how it’s used. Offer a functional path without location (search by address, scan a code).
Safety extras and fraud prevention
Optional add-ons can improve reliability at busy sites:
- License plate recognition support (LPR) for quicker entry/validation.
- QR codes for checking in at a sign or gate.
- Kiosk fallback so payments can continue during connectivity issues.
On the safety side, add basic fraud controls early: velocity checks (too many extensions/payments in a short window), flags for suspicious repeat extensions, and lightweight device signals (new device + high-value actions). Keep the experience smooth for legitimate users, and review edge cases with customer support workflows.
Testing, QA, and Compliance Readiness
Testing a parking availability + payments app isn’t only about “does it work?” It’s about “does it work reliably in the messy real world”—spot inventory changing quickly, weak connectivity, and users expecting instant confirmation.
Functional tests that match real behavior
Cover the full customer journey end-to-end:
- Search and filter (by price, distance, hours, vehicle type)
- Checkout (saved cards, Apple/Google Pay where supported)
- Session extensions (including when rates change mid-session)
- Receipts (email + in-app history)
- Refunds and cancellations (partial vs full, and the timing rules)
Also test operator flows if you have them (rate updates, closing a zone, marking maintenance).
Data accuracy and “truth” tests
Availability issues break trust faster than almost anything else. In QA, simulate:
- Stale availability (your app shows a spot that was taken minutes ago)
- Mismatched inventory (operator says 50 spots, sensor feed says 42)
- Provider outages (map loads but availability APIs fail)
Define what the app should do in each case: warn users, hide uncertain inventory, or allow booking only with confirmation.
Performance targets you can measure
Set clear thresholds before launch, then test on mid-range phones:
- Map load time (first meaningful view)
- API latency (search and availability refresh)
- Payment completion time (tap “Pay” to confirmed session)
Compliance, privacy, and support access
Confirm consent and privacy disclosures for location tracking, set data retention rules, and lock down support tools with role-based access and audit logs.
For payments, rely on PCI-compliant providers and avoid storing raw card data. Keep a launch checklist and re-run it for every release.
Launch Plan and Continuous Improvement
A parking availability app and a parking payment app are never “done.” Your launch plan should minimize risk, protect users, and give you clean signals about what to improve next.
Pre-launch checklist (store + trust)
Before submitting, confirm app store requirements: accurate screenshots, clear feature descriptions, age rating, and a support contact that actually responds.
Privacy disclosures matter more than most teams expect. If you use location for real-time parking data (even “while in use”), explain why, how it’s stored, and how users can opt out. Make sure your privacy policy matches your app behavior.
Roll out in phases, not all at once
Start with a limited geography (one city, a few garages, or a handful of street zones) so you can validate data quality and payment reliability.
Use invite codes, feature flags, and staged releases to control growth. This lets you quickly disable a problematic provider feed or payment method without forcing an emergency update.
If your team is small, consider using a faster build loop for internal tools and pilots. Teams often use Koder.ai to spin up an operator dashboard, admin support console, or integration test harness quickly, then export the source code and productionize once the pilot metrics are proven.
Monitor what breaks first
Set up operational dashboards from day one:
- Payment failures (by card type, issuer response codes, network, and app version)
- Availability update lag (time between sensor/provider changes and what users see)
- Crash reports and slow screens (especially around checkout and session start/stop)
Alert on spikes. A small increase in availability latency can cause a big drop in trust.
Post-launch roadmap that users will notice
Plan improvements based on real usage, not opinions. Common next steps for a parking app MVP include reservations, subscriptions, and permits—each with clear pricing rules and receipts.
Keep /pricing current as you add plans, and publish learnings and release notes on /blog to build confidence with partners and users.
FAQ
What’s the first decision to make when building a parking app?
Pick one primary job-to-be-done for v1 and let everything else support it:
- Find parking faster (availability + navigation)
- Pay quickly (frictionless checkout)
- Avoid tickets (clear rules + easy extensions)
- Help operators manage inventory/pricing
A clear promise makes scope, UX, and data requirements much easier to decide.
Which success metrics matter most for a parking availability + payments app?
Use metrics tied to your app’s core promise:
- Time to find a spot (median minutes from open → parked/navigation)
- Conversion to payment (results → checkout)
- Payment success rate (attempted → completed)
- Retention (repeat parkers by zone)
If you show availability, also track accuracy: how often “available” leads to a successful park.
What features should be in a parking app MVP?
Start with the driver’s critical path:
- Map + search (with a map/list toggle)
- Availability indicator (available/limited/full/unknown)
- Transparent pricing (rates, caps, fees)
- One-tap navigation to the entrance
- Pay + extend (and end where allowed)
- Receipts (in-app + email)
Ship the smallest set that supports repeat sessions before adding extras like reservations.
Why is real-time availability so hard, and how do you keep users’ trust?
Because availability drives trust. If users can’t rely on it, they stop using the app—even if payments work perfectly.
Practical steps:
- Define refresh targets per source (e.g., 30–60s garages, 2–5m street proxies)
- Show “updated X minutes ago”
- Add a confidence level (High/Medium/Low)
- Prefer “unknown” over guessing “available” when data is missing
Where does real-time parking availability data usually come from?
Common sources include:
- Street parking: sensors, cameras/vision, meter events, enforcement scans, user reports
- Garages/lots: gate counters, POS/ticketing systems, operator/aggregator APIs
A strong approach is blending multiple signals and cross-checking recency and consistency before showing “available.”
What should I ask cities/operators/data providers before integrating?
Ask questions that affect both scope and reliability:
- Do they offer APIs, webhooks, or only batch exports?
- What’s the coverage (which zones/facilities are live vs planned)?
- How fresh is availability, and what’s the expected delay?
- Rate limits, pricing per call, and any uptime/SLA commitments
- Commercial model (per-location, per-transaction, revenue share)
Also confirm data rights (redistribution, storage, derived analytics).
What contract terms are most important for parking data and payments partnerships?
Treat contracts as product infrastructure, even for pilots:
- Data ownership (including derived predictions)
- Redistribution rights (can you display and store the data?)
- Privacy/security responsibilities (plates, device IDs, tokens)
- API change notice and deprecation terms
- Liability when availability/rates are wrong
Clear terms prevent “surprise” outages and disputes later.
How do I build parking payments safely without taking on PCI risk?
Minimize what you handle:
- Use a PSP (e.g., Stripe/Adyen/Braintree) with tokenization
- Collect card details via provider SDK components
- Store only payment tokens and necessary metadata
- Support Apple Pay/Google Pay for faster checkout
Add idempotency keys for session starts/charges to prevent double-billing during retries.
What pricing edge cases should a parking app handle from day one?
Plan these early and encode them in receipts:
- Rate changes mid-session (lock at start vs apply new rates after a cutoff)
- Grace periods (free vs discounted vs enforcement-only)
- Rounding and fractional billing rules
- Caps and maximum stay limits
- Overstay handling (auto-extend where allowed vs fees + notifications)
Then test boundary cases (11:59→12:00, DST changes, holidays).
How should I launch a parking app and avoid scaling problems too early?
Phase launches reduce risk and improve learning quality:
- Start with 1–2 areas (one operator + one curb zone)
- Use feature flags and staged releases to disable broken feeds/payment methods
- Monitor:
- Payment failures (by method, issuer codes, app version)
- Availability lag (provider → user-visible)
- Crashes and slow screens (especially checkout)
Expand facility-by-facility once reliability and unit economics are proven.