Contents

Key takeaways

  • A B2B marketplace for four audiences: sellers, buyers, partners and the internal team.
  • The tax return is read by OCR to pre-fill the listing and compute a valuation.
  • The valuation combines adjusted net assets, EBITDA multiple and DCF, with a PDF report and annexes.
  • Payments go through Stripe on the web and in-app purchases in the apps, with the same rights in the database.
  • Website, API, iOS and Android apps and back office form a single system.

Selling a business is not like selling a car. You have to stay discreet, find a buyer with the right budget and the right plan, set a credible price and get support from professionals. Entreprises à Vendre, published by SWING FINANCES, brings all of this together on one platform: a website, an API and iOS and Android apps. I led its full development as the lead full-stack developer.

A B2B marketplace with four audiences

The platform connects people who do not expect the same things:

  • The seller publishes a listing for free, follows its statistics and chooses whom to answer.
  • The buyer searches for a business, publishes a purchase ad with their criteria and pays to access contact details, one at a time with credits or through a subscription.
  • The partner (accountant, lawyer, broker, real estate agent, insurer) has a profile in the directory and receives requests.
  • The team moderates, monitors activity and manages sales agents from a full back office.

Each role has its own space, on the web and in the app, with its own screens, payments and notifications.

The journey, from listing to sale

  1. The seller submits a listing in several steps. They can pre-fill it from their tax return.
  2. An assistant, Emma, reviews the listing before it goes live: she scores what is missing, spots details that would reveal the company's identity and suggests a title and a description.
  3. The buyer finds the listing with filters (region, sector, price, revenue) or gets an alert from a saved search.
  4. They unlock the seller's contact details with a credit or their subscription. A conversation opens automatically.
  5. Both parties talk in the messaging, up to the visit.
  6. The seller closes the sale from the conversation: the listing switches to "sold", with the chosen buyer, and leaves the results.
Listing submission form with pre-fill from the tax return
Listing submission: pre-fill from the tax return and main information

Notable features

Seller side

  • Listings dashboard: active, pending, total views and contacts received.
  • Emma assistant: completeness score, detection of emails, phone numbers, SIRET numbers and web addresses slipped into the text, indicative estimate based on the prices of listings in the same sector.
  • List of matching buyers, filterable by department, region, sector and budget, with dedicated access.
  • Closing, reactivating and renewing listings.
  • Business valuation from the tax return, with a PDF report.

Buyer side

  • Purchase ad visible to sellers: budget, target revenue, departments, sectors.
  • Favourites, saved searches with alerts, contact history and invoices.
  • Pay-per-use credits or a Premium subscription that unlocks three regions of their choice.
  • "Golden Nugget" badge awarded by the team to the most interesting listings, with a dedicated page.

Partners and team

  • Partner directory with profile, reviews, likes, QR code and statistics (views, clicks on contact details, 7-day chart).
  • Valuation and financing requests sent to the right people.
  • Back office: figures dashboard, moderation, per-page SEO, newsletter, email templates, ads, action history, blog articles generated with AI.
  • Sales agent area with automatic commission calculation.
  • Widget to embed in an agency's website or CRM to publish its listings on the platform without typing them again.
App: seller space with active and sold listingsApp: matching buyers with budget and areasApp: messaging between seller and buyer
iOS and Android app: seller listings, matching buyers, messaging

Technical challenges and how they were solved

Reading a tax return reliably

A tax return comes in every shape: text PDF, scanned PDF, photo. The platform sends it to a shared OCR server, which reads it page by page and returns each financial year with normalised items, the Cerfa boxes and checks (SIREN, balanced balance sheet). This processing is asynchronous: the API polls the server until the result is ready, within a time limit. If the server is unavailable, a second path extracts the text from the PDF and structures it with OpenAI, and flags it as such. The user always checks the suggested values: no listing is ever published automatically.

A valuation that explains itself

The valuation engine does not give a number out of nowhere. It combines three methods:

  • Adjusted net assets, from the latest balance sheet;
  • Normalised EBITDA multiple, with multiples chosen by NAF code and a cross-check against revenue;
  • Discounted cash flows (DCF), over a horizon and with a rate set from the admin, plus a premium based on size and data quality.

It analyses data quality, reconciles the methods into a low and high range with a retained value, raises alerts when a result looks fragile and computes a financing plan. Company information is completed from its SIRET number through the public Recherche Entreprises API. The result is delivered as PDF: a full report and three technical annexes.

Valuation result: range, retained value, report and annexes
Valuation result: low and high range, retained value, full report and annexes (net assets, EBITDA, DCF)

Two payment flows that must agree

On the web, Stripe handles one-off payments and monthly or yearly subscriptions, with a webhook whose signature is verified and PDF invoices generated automatically. In the apps, Apple and Google rules require in-app purchases for digital content. Purchases therefore go through RevenueCat, whose webhook, protected by a secret, updates the same rights in the database: credits, buyer Premium, seller access to buyers. Every transaction is stored with its identifier so the same purchase is never credited twice.

Confidentiality and security

  • Sign-in by email, Google, Apple or Facebook, with email validation by code.
  • Login attempt limit: after 7 tries, a 15-minute wait.
  • Messaging with archiving, conversation reporting and user blocking.
  • CRM widget authenticated by a public key restricted to allowed domains, or by a secret key stored only as a hash.

An app that stays up to date without going through the stores

The app uses Expo over-the-air updates: a fix can reach phones without a new store release. It also handles a mandatory update screen, a maintenance screen and an offline screen. Messaging refreshes every 5 seconds while a conversation is open, and users can tune their push notifications.

The tech stack

  • Website and back office: PHP 7.4 without a framework, MySQL, Tailwind CSS, plain JavaScript, 4-language selector (French, English, Spanish, German).
  • Mobile API: PHP endpoints returning JSON, shared by the iOS and Android app.
  • Apps: React Native and Expo, React Navigation, Stripe, RevenueCat, Expo and Firebase notifications, interface in French and English.
  • Services: Stripe, RevenueCat, OpenAI, OCR server, Recherche Entreprises API, PHPMailer, mPDF.

What this project shows

Entreprises à Vendre brings together what a serious project can require: several roles with different rights, money flowing on the web and through two stores, accounting documents to read, financial calculations to justify and a strong need for confidentiality. The website, the API, the iOS and Android apps, the back office and the integrations with external services form a single coherent system, and the apps are available on the App Store and Google Play.

Do you have a marketplace, a business platform or an app with payments and documents in mind? Get in touch to talk about it. You can also see all the screenshots of the project.

Frequently asked questions

Can automatic business valuation be built into a platform?

Yes. On Entreprises à Vendre, the tax return is read by OCR, then an engine computes a range with three methods (adjusted net assets, EBITDA multiple, DCF) and produces a PDF report with its annexes.

How do you handle payments on the web and in iOS and Android apps at the same time?

Stripe handles the web, and the in-app purchases required by Apple and Google go through RevenueCat. Both flows update the same rights in the database, and each transaction is stored to avoid duplicates.

Can one person deliver the website, the API and the apps?

On this project, the website, the mobile API, the iOS and Android apps and the back office were developed together, with a shared API that keeps the same rules everywhere.