Marketplace · Case study

VendoHub AI

A seller builds a listing, Google Vision reads the photos, and a reviewer decides whether it goes live.

VendoHub AI is a Laravel marketplace I built end to end: a listing composer with a live preview, queued image processing, a reviewer dashboard and a rule-based Listing Coach. Search, chat, favourites and accounts sit around the published listing.

Open the repository (opens in a new tab)

The code is public. A hosted demo is not: every screen below comes from a local clone with demo data.

VendoHub listing composer: a form with title, brand, price, category and tag fields, a description panel, and a live preview card showing the product image, category and price.
The listing composer. Structured fields on the left, description in the middle, live preview on the right.

01 Publishing flow

From a new listing to a published one.

Five stages share one listing record. Automated jobs add information to it; none of them decides whether it can be published.

  1. 01 Person

    Compose

    The seller fills structured fields — title, brand, price, category, tags — and uploads up to six images. The preview beside the form updates while they type.

  2. 02 System

    Process the images

    Saving the listing dispatches a chain of queued jobs: detect and mask faces, cut a 300 × 300 watermarked crop, then read SafeSearch ratings and labels from Google Vision.

  3. 03 System

    Queue for review

    The listing is stored with no decision on it. It appears in the reviewer dashboard together with its images, labels and safety ratings.

  4. 04 Person

    Decide

    A reviewer accepts or rejects the listing. This is the only stage that changes whether it can reach the catalogue.

  5. 05 Person

    Marketplace interaction

    An accepted listing enters the catalogue, where search, favourites, chat and the session cart take over.

02 Architecture

Image processing runs outside the request.

Masking faces and calling a vision API is too slow to do while the seller waits, so it happens in a queued chain. Everything around it is a plain Laravel application.

Select a layer to read what it is responsible for.

Interface

The composer is a Livewire component, which is what lets the preview redraw as the seller types instead of after a submit.

Application

A seller can only edit their own listings, and the reviewer dashboard sits behind its own middleware. Fortify handles authentication and login rate limiting.

Domain and data

Seller, buyer and reviewer screens all read the same Article model. It is prepared for Scout indexing, but public search still runs as Eloquent text filters — the index is wired up, not switched on.

Media queue

Google Vision is called here, in the queue, and never in the request the seller is waiting on. Its answers are stored alongside the image and read back later by the reviewer.

03 Moderation

What the analysis returns, and what the reviewer does with it.

Vision results are stored per image and shown next to the listing. Accepting and rejecting are the only two actions that move a listing in or out of the catalogue, and both are human.

VendoHub reviewer dashboard showing a pending armchair listing with its category, price, demo seller, current state and description.
A pending listing as the reviewer receives it: demo seller, current state, description and the processed image.

Select a state to read what it means for the listing.

Pending

Every new listing lands here. It exists, it is not in the catalogue, and it waits in the reviewer queue with its processed images attached.

Accepted

The reviewer has approved the listing. It becomes eligible for the catalogue and can be found through search and category pages.

Rejected

The reviewer has turned the listing down. It stays with the seller and out of the catalogue.

What the automated layer produces

  • Faces found in an upload, masked before the image is stored.
  • A fixed 300 × 300 crop carrying the project watermark.
  • SafeSearch likelihoods, mapped to states the dashboard can display.
  • Label detection results, kept as context for the person reviewing.

The product includes a labels and SafeSearch ratings panel, but the text is too small to read in this capture.

Close-up of the reviewer controls: a Reject button and an Accept button.
The two controls that change the state. No automated job can press them.

04 Listing Coach

A 0–100 score based on explicit rules.

The seller console rates how complete a listing is and puts that next to its own traffic. The product calls it AI; under the hood, it’s a transparent set of rules and thresholds.

VendoHub Listing Coach card scoring a headphones listing 76 out of 100, with views, clicks, favourites and chat counts, two diagnoses, three suggested actions and a suggested price.
One listing at 76 out of 100: two diagnoses, three suggested actions, and a lower suggested price because views are not turning into messages.

How the score adds up

Select a criterion to see which signals it reads.

Maximum 100

Signals it reads

  • Description length
  • Image count
  • Category
  • Price
  • Title length
  • Highlight state
  • Views
  • Clicks
  • Favourites
  • Messages
  • Days online

The last five signals feed the diagnosis and the price suggestion rather than the score itself.

05 Limits

What it doesn’t do yet.

The project works end to end locally. Here’s what it doesn’t do yet.

  • There is no production traffic, so there are no conversion or revenue figures. No user research has been conducted.
  • Public search runs on Eloquent text filters. Scout is integrated on the model but not serving queries.
  • The Listing Coach is rule-based. The term “AI” belongs to the product language and does not indicate a generative model.
  • Checkout records a completed transaction inside the prototype. It is not a verified payment integration.