Koja Scripts
FREE

Auctions

Time-boxed bidding with a clear winner and a buy-out finalization step.

Auctions

Time-boxed bidding with a clear winner and a buy-out finalization step. Built on top of the basic listing flow.


Auction lifecycle

       ┌─────────┐       ┌────────┐       ┌─────────┐
create │ waiting │──────▶│ active │──────▶│  ended  │ ──▶ winner buys out
       └─────────┘       └────────┘       └─────────┘
            ▲                                  │
            │                                  │
       (no bids,                          (winner inactive
        can remove)                       48h auto-cleanup)
  • waitingnow < auction_starts_at. Visible in the market but Submit bid is disabled.
  • active — bids accepted; current price = highest bid.
  • endednow > auction_ends_at. No more bids. Only the highest bidder sees Buy out.

Bidding rules

A bid is accepted if all of these hold:

  1. Listing exists and is of type auction.
  2. Auction has not ended (auction_ends_at > NOW()).
  3. amount >= price (the seller's reserve).
  4. amount > currentMax (must outbid the leader).
  5. Bidder has at least amount in their bank.

What auctions cost

  • No fee to bid — submitting an offer is free.
  • Listing fees still apply to the seller, same as buy-now. See Exchange.
  • Commission is taken from the final sale price the same way as buy-now.

After the auction ends

The seller has nothing to do. The winner sees a Buy out button next to the listing:

  1. Winner clicks Buy out.
  2. Server validates: are they the highest bidder? does the auction actually end?
  3. Money moves: winner → seller (minus commission) → zone owner (if any).
  4. Vehicle is transferred to the winner's garage; listing is deleted.

Cancellation

You can cancel an auction:

  • If status == 'waiting' (no bids yet)

You cannot cancel:

  • Once active (any bid placed locks the auction)
  • Once ended (winner gets first dibs)

UI events

The frontend listens to koja_carmarket:client:auctionUpdated:

{ listingId: number, event: 'started' | 'ended' | 'bid_placed' }
  • started — fires the minute auction_starts_at is crossed
  • bid_placed — fires on every accepted bid (broadcast to all clients)
  • ended — fires when the auction is over (either by time or by buy-out)

The market view auto-refreshes on these events so bidders see live data without polling.

  • Exchange Zones — A player can own an entire zone and run it like a small business: set listing fees, take commission on every sale, cap how many listings can run concurrently.
  • Overview — What players can actually do with Koja-Carmarket, from their POV.
  • Parking Slots — Before a player can list a car, they need at least one parking slot in the zone they want to list in.
  • Listings — The simplest flow: a player lists a vehicle from their garage at a fixed price; another player walks up to the market zone, opens the tablet, and buys it.
  • Test Drives — Let a buyer try the vehicle before they commit.
  • Features — back to the section overview