AGdev
AGdev

FixDas

Home services · Two-sided marketplace

One job. Two sides. A lot has to work in between.A lot has to work in between.

I designed and built FixDas as a two-sided marketplace for clients who need work done and local professionals deciding which jobs are worth taking on.

View live site
FixDas marketplace interface showing job posting, local matching, and messaging
Role
Full-Stack Product Engineer
Ownership
End-to-end marketplace
Status
Production
Core flow
Post → Match → Connect
Project snapshotThe challenge01 Relevant opportunity02 Subscription model03 Production statesHow it connectsThe outcomeWhat I ownedBuilt with

[ Project snapshot ]

Problem

Clients need a simple way to explain what needs doing. Professionals need enough context to decide whether a job fits their trade, services, location and availability.

[ Let’s work together ]

Building a marketplace where the hard part sits between the screens?sits between the screens?

I can help turn the rules behind it into a product that works end to end.

AGdev
ImprintPrivacy policy
ImprintPrivacy policy

© 2026 Aleksandar Gjurchevski. All Rights Reserved.

© 2026 Aleksandar Gjurchevski. All Rights Reserved.

What I built

A marketplace that turns client requests into structured jobs, finds relevant local professionals, and connects subscription state to lead access, communication, professional discovery, public profiles, and guided onboarding tour.

My responsibility

Product flows and UX/UI, frontend and backend, marketplace rules, authentication, realtime communication, notifications, public discovery, infrastructure, and production.

[ The challenge ]

A simple request has to become useful to the whole marketplace.

The client-facing side of FixDas needs to feel straightforward: describe the work, add the practical details, and publish the request. The professional side needs much more context before that same request becomes useful.

Job creation therefore could not be treated as an isolated form. Information captured at the beginning had to support decisions later: whether a professional is relevant, whether the job is within their service area, whether the timing fits, and whether there is enough context to respond.

FixDas job request flow
The job became the shared piece of data connecting both sides of the marketplace.
01

[ From a request to a relevant opportunity ]

Filter first. Rank what remains.

I structured job data so it could be reused beyond the posting flow. Services support matching, location supports distance filtering, timing and availability rule out poor fits, and budget and project details give professionals useful context before a conversation begins.

FixDas first checks whether an opportunity can be relevant at all. Only after those eligibility checks does ranking become useful.

FixDas matching flow showing unsuitable professionals filtered out by category, distance and availability before the remaining matches are ranked by relevance
Eligibility and ranking work as separate stages
Filtering decides whether an opportunity belongs in the result set; ranking decides how relevant options are ordered.
02

[ The business model became product behaviour ]

Subscription state changes how a professional participates in the marketplace.

Matching and subscription solve different problems in FixDas. A professional can be a strong match for a job regardless of whether they currently have a paid subscription, so I kept relevance independent from billing.

Subscription state instead changes what happens after that match. A professional with active or trial access receives an actionable opportunity and can contact the client, while a professional without the required access can still see that a relevant opportunity exists without being able to act on it.

The same billing state reaches beyond leads and messaging. Active or trial professionals receive priority in featured-professional discovery, and the public FixDas Pro Website is available only to subscribed professionals who have chosen to enable it.

A first contact also starts as a connection request. The recipient can accept or decline it before the exchange becomes a normal two-way conversation.

Matching stays independent from billing; subscription changes what becomes actionable

Relevance decides whether the opportunity fits. Subscription decides how the professional can participate in the marketplace.

03

[ Production meant modelling more than the happy path ]

Real usage adds the states around the clean marketplace flow.

  1. Post
  2. Match
  3. Connect

[ How the system connects ]

The rules stay consistent as users move through the marketplace.

  1. Request
  2. Job
  3. Eligibility

[ The outcome ]

A working marketplace, not a collection of isolated features.

FixDas connects structured job creation, relevant professional matching, subscription-driven access, communication, job progression, and public discovery in one product.

Matching remains based on relevance rather than payment. Subscription state changes whether a lead is actionable, whether a professional can contact a client, how professionals are prioritised in discovery, and whether their Pro Website can be published. Connection and job states then control what happens as the relationship progresses.

The business rules carry across the marketplace instead of being reimplemented screen by screen.

[ What I owned ]

I worked across the full product.

From shaping marketplace flows and designing the UX/UI to implementing the frontend, backend, data model, business rules, integrations, infrastructure, and production.

I also built a guided onboarding tour for first-time users, helping them understand the dashboard and the main actions without having to explore the product on their own.

  • Product & UX/UI01
  • Frontend02
  • Backend03
  • Marketplace logic04
  • Authentication05
  • Payments06
  • Realtime communication07
  • Notifications08
  • Public discovery & SEO09
  • Infrastructure & production10
  • Product & UX/UI01
  • Frontend02
  • Backend03
  • Marketplace logic04
  • Authentication05
  • Payments06
  • Realtime communication07
  • Notifications08
  • Public discovery & SEO09
  • Infrastructure & production10

[ Built with ]

Application
  • Work
    • A job can be cancelled, reassigned, completed, or archived.
    • A connection can be declined.
    • Access can change when a subscription state changes.
    • A payment or webhook can fail.
    • A conversation can receive new activity after being removed.
    • A notification can become outdated before an email is sent.

    I modelled those states across jobs, conversations, subscriptions, payments, notifications, and external integrations instead of leaving individual screens to guess what should happen.

    Public professional profiles use the same state-driven approach. A professional must explicitly enable the Pro Website and have active or trial access before the public page is available. Content quality is evaluated separately: incomplete profiles remain noindex until they contain enough useful, distinct information.

    Publication and sitemap eligibility use shared rules, while canonical URLs, structured data, and indexing metadata are generated from the same profile state. That keeps public discovery aligned with what the product actually allows.

    This is what turns a feature set into software that keeps behaving predictably after launch.
  • Subscription access
  • Connection
  • Conversation
  • Work
  • Authentication, subscription state, notifications, job lifecycle rules, and public discovery sit around that flow. They do not operate as separate feature checks: they read the same underlying product state so the rules stay consistent as users move through the marketplace.

  • Backend & Realtime
    • Convex
    Authentication & Payments
    • Clerk
    Communication
    • Resend
    Location
    • Mapbox
    Analytics, Privacy & Security
  • Relevant opportunity

    Subscription state

    Active or trial

    • Opportunity becomes actionable
    • Connection request available
    • Priority in featured discovery
    • Pro Website available when enabled

    No active access

    • Relevant opportunity stays visible
    • Contact remains locked
    Acceptance opens the conversation