← Back to projects
Marketplaces & FinTech Case study

Tendex — Investment Platform for the Digital Assets Market

Development and evolution of the investment platform for the Swiss fund Tendex: full redesign, investment plan management, user and referral system. Stack: Symfony, ElasticSearch, RabbitMQ, Redis, Twig.

Technologies 7
PHP
Symfony
JavaScript
PostgreSQL
Redis
Elasticsearch
RabbitMQ
Tendex — Investment Platform for the Digital Assets Market
Featured project ↗

About the project

Tendex is a Swiss investment fund regulated by FINMA that since 2019 has been using quantitative analysis and proprietary algorithms to deliver stable and uncorrelated returns on the digital assets market. The platform processes over 100 billion market parameters and ensures automated trade and risk management on a 24/7 basis.

I worked on the project as a Full-Stack Developer (Symfony + Twig): responsible for the complete frontend redesign and for evolving key business processes — investment plan management, freezing and delayed start, forced termination, user deletion, and editing the referral structure. I worked with a high-load architecture built on ElasticSearch, RabbitMQ, and Redis.

Tendex — Investment Platform for the Digital Assets Market

Tendex is a Swiss investment fund regulated by FINMA that since 2019 has been using cutting-edge technology and quantitative analysis to deliver stable and uncorrelated returns on the digital assets market.

The fund's key advantage is deep market monitoring based on more than 100 billion parameters and proprietary algorithms that ensure automated trade and risk management on a 24/7 basis. The platform's goal is to minimize risks and provide investors with high growth potential — offering reliable solutions for diversification and capital protection in a world full of uncertainty.

My Role in the Project

Full-Stack Developer: Symfony (backend), Twig (templates). Responsible for redesigning the customer area and frontend, as well as for evolving the platform's key business processes.

Technology Stack

  • Backend: Symfony (PHP)
  • Frontend: Twig
  • Search and Analytics: ElasticSearch
  • Queues: RabbitMQ
  • Cache and Sessions: Redis
  • Infrastructure: background workers for asynchronous processing of investment events

Key Tasks

  • Complete redesign of the website and the investor's customer area
  • Mechanics for forced termination of an investment plan
  • Correct user deletion while preserving the integrity of financial data
  • Investment plan freezing functionality
  • Delayed start functionality for investment plans
  • Editing of the referral structure
  • Asynchronous event processing via RabbitMQ
  • Indexing and search via ElasticSearch

Outcome

The platform received a modern, updated interface and an expanded set of tools for managing investment plans. This improved the experience for investors and reduced the support workload. The asynchronous architecture based on RabbitMQ and ElasticSearch ensured stable operation under load and fast access to analytics.

What I delivered

01

The existing platform interface was outdated, inconvenient for investors, and did not refl...

The challenge

The existing platform interface was outdated, inconvenient for investors, and did not reflect the status of a regulated Swiss fund. It was necessary to renew the visual part and UX without losing functionality and without disrupting ongoing business processes.

Solution

  • Audited the existing Twig templates and identified reusable components.
  • Developed a new design system: grid, typography, UI components.
  • Reimplemented key pages with Twig and integrated Vue components for interactive areas (charts, tables, forms).
  • Ensured responsiveness and correct rendering on mobile devices.

Results

  • A modern, updated interface matching the fund's positioning.
  • Improved UX in the investor's customer area.
  • Reduced number of support requests related to navigation.

02

Investors or administrators needed to be able to terminate an investment plan early, with...

The challenge

Investors or administrators needed to be able to terminate an investment plan early, with correct recalculation of returns, fees, and refunds. Data desynchronization during parallel operations had to be avoided.

Solution

  • Designed a domain model for plan termination covering all states (active, frozen, queued).
  • Implemented a service for calculating final returns and fees.
  • Moved heavy operations into asynchronous tasks via RabbitMQ.
  • Added idempotency of operations and locking via Redis.

Results

  • Correct and predictable termination of plans in any state.
  • No double charges and no data desynchronization.
  • Transparent operation history for the investor.

03

Simple user deletion broke related entities (investment plans, transactions, referrals). A...

The challenge

Simple user deletion broke related entities (investment plans, transactions, referrals). A safe deletion mechanism was needed that preserves financial history and regulatory requirements.

Solution

  • Introduced a soft-delete mechanism for users while preserving relations.
  • Designed cascade processing: anonymization of personal data, preservation of transaction history.
  • Implemented a background task for cleaning up related entities via RabbitMQ.
  • Added logging and auditing of deletion operations.

Results

  • Safe deletion without violating data integrity.
  • Compliance with regulatory requirements for retaining financial history.
  • Reduced risk of errors during manual intervention.

04

Investors needed the ability to temporarily pause return accrual on a plan without closing...

The challenge

Investors needed the ability to temporarily pause return accrual on a plan without closing it — for example, during market instability. Such periods had to be correctly accounted for in calculations.

Solution

  • Added the "frozen" state to the investment plan lifecycle.
  • Implemented the logic for pausing accruals and correct resumption.
  • Updated return calculation to account for freezing periods.
  • Added notifications to the investor about the plan status.

Results

  • Flexible plan management without losing history.
  • Accurate return calculations accounting for freezing periods.
  • Increased investor trust in the instrument.

05

Investors wanted to create a plan in advance with automatic launch on a specified date. Re...

The challenge

Investors wanted to create a plan in advance with automatic launch on a specified date. Reliable task scheduling was required, robust against failures and service restarts.

Solution

  • Implemented delayed start via the Symfony scheduler + RabbitMQ delayed messages.
  • Added idempotent start processing (protection against double start).
  • Provided monitoring of delayed tasks and logging.
  • Implemented notifications to the investor about the start.

Results

  • Reliable delayed start without manual intervention.
  • No duplicates and no missed launches.
  • A convenient planning tool for investors.

06

The referral system required flexibility: administrators needed to be able to change refer...

The challenge

The referral system required flexibility: administrators needed to be able to change referral assignments, and investors needed to see the current structure. The existing implementation did not allow editing assignments without losing accrual history.

Solution

  • Designed a referral relationship model with versioning.
  • Implemented an editing interface for referrals for administrators.
  • Preserved accrual history when assignments change.
  • Added validation against cyclic dependencies.

Results

  • Flexible management of the referral structure.
  • Preservation of history and correctness of accruals.
  • Reduced manual support workload.

07

Growing load and the number of operations (accruals, plan start/stop, notifications) requi...

The challenge

Growing load and the number of operations (accruals, plan start/stop, notifications) required moving heavy operations out of the synchronous HTTP cycle so as not to block user requests.

Solution

  • Designed an event queue for key domain operations.
  • Implemented workers using Symfony Messenger + RabbitMQ.
  • Added retry policies, a dead-letter queue, and monitoring.
  • Ensured idempotency of handlers.

Results

  • Fast interface response regardless of background operations.
  • Fault tolerance through retry and DLQ.
  • Scalable processing under load.

08

Fast search across large volumes of data (transactions, plans, users) and building analyti...

The challenge

Fast search across large volumes of data (transactions, plans, users) and building analytics required a specialized search engine instead of heavy SQL queries.

Solution

  • Configured ElasticSearch indices for key entities.
  • Implemented data synchronization via RabbitMQ events.
  • Added search queries with filters and aggregations for analytics.
  • Optimized mappings and reindexing.

Results

  • Fast search across large volumes of data.
  • Flexible analytics for administrators and investors.
  • Reduced load on the primary database.

09

High frequency of access to frequently used data and the need for protection against race...

The challenge

High frequency of access to frequently used data and the need for protection against race conditions during parallel operations required a reliable cache and locking mechanism.

Solution

  • Introduced caching of hot data and aggregates in Redis.
  • Implemented distributed locks for critical operations (plan start/termination).
  • Configured cache invalidation via events.
  • Added monitoring of hit/miss and response times.

Results

  • Reduced response time for key pages.
  • Protection against race conditions and double operations.
  • Lower load on the database.

10

A regulated fund requires a complete audit of all financial operations: who, when, what, a...

The challenge

A regulated fund requires a complete audit of all financial operations: who, when, what, and on what basis. An audit system had to be built that does not slow down core processes.

Solution

  • Designed an audit log schema linked to user, plan, and transaction.
  • Implemented asynchronous audit writing via RabbitMQ.
  • Added tools for searching and exporting audit logs for administrators (ElasticSearch).
  • Ensured immutability of records.

Results

  • Complete audit of financial operations.
  • Compliance with regulatory requirements.
  • Fast access to history via search.

11

The investment platform operates 24/7, and any delay in event processing or worker failure...

The challenge

The investment platform operates 24/7, and any delay in event processing or worker failure is critical. A system for monitoring key metrics and alerts was required.

Solution

  • Set up collection of metrics for queues (RabbitMQ), Redis, ElasticSearch, and key business events.
  • Implemented alerts for anomalies (DLQ growth, delays, worker errors).
  • Added dashboards for the team.
  • Integrated logging of critical operations.

Results

  • Fast detection and response to incidents.
  • Reduced downtime.
  • Transparency of platform state for the team.

Technologies & topics

Project tags

#Symfony #PHP #Twig #ElasticSearch #RabbitMQ #Redis #Fintech #Investment Platform #Crypto #REST API #Symfony Messenger #High Load #Async Processing #Redesign #Referral System #Audit Logging
04
Start a project

Want a similar technical approach?

Let's discuss your project, architecture and the best technology stack for it.

Let's talk ↗