Skip to main content
The Condo Marketplace lets property management organizations offer services to residents directly within the resident app. Organizations can list services, set prices, and send invoices that residents pay online or in cash.

Market Items

Services or products offered by the organization, organized into a two-level category tree.

Invoicing

Create, publish, and track payment of invoices linked to tickets or issued independently.

Price Scopes

Set prices globally for an organization or override them per property.

Online & Cash

Residents pay online through the acquiring integration or indicate cash payment.

Market Categories

Services are organized in a two-level category tree. Each MarketCategory has:
  • name — Localized category name
  • image — Preview image shown in the app
  • parentCategory — Optional parent category (maximum depth: 2)
  • mobileSettings — Display configuration for the mobile app
The category tree depth is capped at 2 levels. Attempting to nest a subcategory more than one level deep raises a MAXIMUM_DEPTH_REACHED error.

Market Items

A MarketItem is an individual service or product offered by an organization. Fields:
FieldDescription
nameService name displayed to residents
skuStock keeping unit — unique per organization
descriptionDetailed service description
marketCategoryCategory this item belongs to
organizationOwning organization
SKUs are unique per organization (enforced by a conditional unique constraint). When a MarketItem is deleted, all its MarketItemPrice records are soft-deleted automatically.

Pricing & Price Scopes

Prices are stored in MarketItemPrice records, which can be scoped at different levels:
Scope TypeConstantApplies To
Organization-wideMARKETPLACE_PRICE_SCOPE_TYPE_ORGANIZATIONAll properties in the organization
Property-specificMARKETPLACE_PRICE_SCOPE_TYPE_PROPERTYA single building
UnknownMARKETPLACE_PRICE_SCOPE_TYPE_UNKNOWNFallback / unset
A MarketPriceScope record links a price to its scope.
Publishing an invoice that references a MarketItem with no defined price is forbidden — the system raises ERROR_PUBLISHING_WITHOUT_DEFINED_PRICES_FORBIDDEN.

Invoices

A Invoice (in the marketplace domain) is a payment request sent to a resident for one or more services.

Invoice Fields

FieldDescription
numberAuto-incremented invoice number
statusCurrent lifecycle status
paymentTypeonline or cash
toPayTotal amount due
rowsLine items (name, count, unit price, measure)
property / unitName / unitTypeTarget resident’s address
clientName / clientPhoneResident contact details
contactLinked Contact record
ticketOptional linked Ticket
currencyCodeDefaults to RUB

Invoice Lifecycle

1

Draft

Staff creates an invoice in draft status. Line items can be freely edited. The invoice is not visible to the resident yet.
2

Published

Staff publishes the invoice. Status moves to published and the resident receives a push notification with a payment link.
  • Online invoices: MARKETPLACE_INVOICE_PUBLISHED_MESSAGE
  • Cash invoices: MARKETPLACE_INVOICE_CASH_PUBLISHED_MESSAGE
  • With linked ticket: MARKETPLACE_INVOICE_WITH_TICKET_PUBLISHED_MESSAGE
3

Paid

The resident completes payment. Status moves to paid. A paidAt timestamp is recorded. No further edits are allowed.
4

Canceled

Either party cancels the invoice. Status moves to canceled. Invoices not paid within 60 days of publishing are auto-canceled (DAYS_TO_CANCEL_PUBLISHED_INVOICES).

Invoice Status Transitions

draft → published → paid
draft → canceled
published → canceled
paid and canceled are terminal states.

Payment Types

TypeConstantFlow
OnlineINVOICE_PAYMENT_TYPE_ONLINEResident pays via acquiring integration in-app
CashINVOICE_PAYMENT_TYPE_CASHResident pays outside the platform; staff confirms

Fees

A default implicit fee of 5% (DEFAULT_IMPLICIT_FEE_PERCENT) is applied to online invoice payments. Organizations can configure their own fee structure. Minimum line-item price is 10 units (MIN_PRICE_VALUE) in the configured currency.

Organization Setup

Before marketplace features are available, an organization must complete the marketplace setup (MARKETPLACE_SETUP_URL_PATH = '/setupMarketplace'), which includes:
  1. Agreeing to marketplace rules and the offer agreement
  2. Configuring banking/recipient details (InvoiceContext)
  3. Linking an active acquiring integration context (required for online payments)
Without a finished AcquiringIntegrationContext, only cash invoices are allowed.

Resident Experience

Residents discover and interact with marketplace services through the resident app:
1

Browse categories

Residents browse the MarketCategory tree to find services offered by their management organization.
2

Request a service

Residents can request a service directly, or staff can create an invoice on their behalf (optionally linked to an existing ticket).
3

Receive invoice

A push notification arrives with a payment link. Online payment redirects to the acquiring provider’s checkout.
4

Pay

Resident pays online (card) or confirms cash payment. The invoice status updates to paid.

Integration with Tickets

Invoices can be linked to an existing Ticket via the ticket field. This ties the service order to the originating maintenance request, giving both staff and residents a complete picture of the work and its cost. When a ticket link is set, push notifications use the WITH_TICKET message types, and the app presents both the ticket and invoice in context.

Marketplace Settings

MarketSetting holds global marketplace configuration for the organization, including mobile display preferences and payment rules.

Build docs developers (and LLMs) love