Contact
Let's work together
European Sourcing - B2B Promotional Products Platform

European Sourcing - B2B Promotional Products Platform

A permanent European online tradeshow for the promotional products industry - 15+ interconnected applications, 9M+ lines of code, 7 languages, 8 years of development.

2010 - 2016
~6 years
Software Engineer then Senior Software Engineer
PHP 5.xSymfony 2/3MySQLElasticsearchAngularJSPropel ORMDoctrine ORMZend FrameworkMemcacheRabbitMQApacheProxmox VEAWS SESChefCoffeeScriptjQuery MobilePhoneGap/CordovaExtJS

Lines of Code

~9.2M

PHP, JS, Twig, CSS, HTML

Database Tables

97

MySQL (master-slave)

Sub-Applications

15+

Microservices ecosystem

Languages Supported

7

FR, EN, DE, ES, IT, NL, PT

Dedicated Servers

9

OVH Proxmox VE

Supplier Connectors

26+

Automated data import

Versioning Entries

1,234

836 Git + 398 SVN

Reseller Websites

~60

MyEasyWeb hosted CMS

Presentation & Project Definition

A permanent European online tradeshow for promotional products

European Sourcing is a B2B sourcing platform for promotional products at European scale. The project constitutes a complete application ecosystem composed of fifteen interconnected sub-applications, developed over more than 6 years (2010-2017).

The platform connects three types of actors in the promotional products market:

  • Suppliers (manufacturers/wholesalers) who list their product catalogs
  • Resellers/Distributors (communication agencies) who search products for their clients
  • Visitors who browse the online catalog

The system functions as a permanent professional online tradeshow ("The European Online Tradeshow"), offering suppliers a multi-channel showcase (online catalog, newsletters, advertising banners, annual guidebook, Google Ads) and resellers a multilingual product search engine covering 7 European languages.

Business Domain

B2B communication through promotional objects - connecting European suppliers, resellers, and agencies in the promotional products industry.

Target Users

B2B professionals across Europe - ~60 hosted reseller agencies, major European suppliers (Midocean, PF Concept, BIC, Paul Stricker, Topico, Inspirion, Makito, TopTex).

Functional Scope
Multilingual Product Catalog (7 languages)
Full-Text Search (Elasticsearch)
Supplier/Reseller Back-Office
Automated Supplier Data Import (26+ connectors)
REST API with WSSE Authentication
Centralized Translation System
Online Payment (Sogenactif)
Reseller Mini-Sites CMS (MyEasyWeb)
Mobile Applications (PhoneGap/Cordova)

Objectives, Context, Stakes & Risks

Digitalizing the European promotional products market

Objectives
  • Create the **first permanent online professional tradeshow** for the European promotional products market
  • Build a **multilingual product catalog** (7 languages) aggregating catalogs from dozens of suppliers
  • Provide resellers with an **advanced search engine** with filters by category, brand, price, attributes, marking
  • Automate the **import of supplier data feeds** (prices, stocks, docs, descriptions) from 26+ suppliers
  • Offer resellers a **turnkey mini-site e-commerce solution** (MyEasyWeb) with ~60 hosted sites
  • Generate **detailed consultation statistics** for suppliers (product views, searches, clicks)
Context

The initial project (v1/v2) was developed by SQLI, a French IT services company, with a custom PHP framework and Smarty templates. The legacy code contained 398 SVN revisions covering 2010-2013.

From 2014-2016, the Medialeads team undertook a complete rewrite of the platform (nicknamed "Phoenix" for the API and "Rebirth" for the extranet), progressively migrating from the custom framework to Symfony 2/3 while maintaining the public site on a lighter custom MVC framework.

The platform was multilingual (7 languages), multi-country, with high product data volumes, and the need to maintain compatibility with existing supplier data feeds - all hosted on self-managed OVH dedicated servers.

Stakes

Business Model

Revenue from supplier subscriptions (240-288 EUR/year) and advertising services (banners, newsletters, guidebook, Google Ads, media planning).

Strategic Position

European Sourcing positioned itself as the go-to reference for online promotional product sourcing in Europe, replacing traditional paper catalogs and physical tradeshows.

Brand Ecosystem

The company also operated TendanceObjet.com, Kadobjet.fr, FranceObjet.com, Omyague.com, GourmetOnline.pro - each targeting a specific market segment.

Identified Risks

Technical Debt

Progressive migration from a custom framework to Symfony, coexistence of two architectures (SVN legacy + Git modern), MD5 password hashing with a single iteration and no salt.

Integration Complexity

Supplier data feeds were heterogeneous (CSV, XML, API), requiring specific adapters per supplier - 26+ connectors identified in flux.europeansourcing.com.

Infrastructure Dependency

9 dedicated OVH servers with Proxmox virtualization, MySQL master/slave replication, manual deployments via svn up + chmod -R 777.

Bus Factor

Only 3 main developers for the entire ecosystem of 38 sub-projects and 9 servers.

The Steps - What I Did

From SQLI monolith to distributed microservices architecture

Phase 1
SQLI Development & SVN Legacy (2008-2013)
2008 - 2013
  • Managed the legacy codebase inherited from SQLI - a PHP monolith with Smarty templates, under SVN versioning (398 revisions)
  • Maintained and extended the extranet for suppliers and resellers (product CRUD, image management, pricing, attributes, markings)
  • Handled deployment operations on dedicated servers and coordinated with SQLI documentation (47+ specification documents)
  • Developed data correction scripts to fix quality issues (missing parent categories, incorrect colors, broken docs)
Phase 2
Internal Takeover & Microservices (2014-2016)
Jan 2016 - Dec 2016
  • Led the **migration from SVN to GitHub** - 13 repositories created in January 2016, organization medialeads with 8 members and 20+ private repos
  • Rewrote the extranet (177 commits) on a custom PHP MVC framework with direct MySQL database access
  • Developed the REST API (api.europeansourcing.com) on Symfony 2.4 with Propel ORM and WSSE authentication
  • Built automated supplier data connectors (15+ connectors: Pixika, Makito, Midocean, BIC, Paul Stricker, TopTex, Cybernecard)
  • Implemented Elasticsearch for multilingual full-text search across 7 language indexes
  • Created the centralized translation system (translate.europeansourcing.com) on Symfony 3.0
Phase 3
Modernization "Rebirth" (2016-2017)
Mar 2016 - Nov 2016
  • Initiated the **architectural rewrite** with shared Symfony bundles (ESCoreBundle: 143 commits, ESSourcingBundle: 15 commits)
  • Designed Doctrine behaviors: Sluggable, Sortable, Timestampable, Translatable, Blameable, Toggleable, Visible, Overloadable, Tree
  • Implemented asynchronous processing with RabbitMQ for data import and visibility computations
  • Set up infrastructure provisioning with Chef for the extranet_rebirth project
Project Timeline
European Sourcing - 2008-2017
Supplier Data Import Flow
Versioning Activity Timeline

The Actors - Interactions

Collaborating within a small but highly productive team

Development Team

3 to 5 active developers depending on the period, with clearly divided responsibilities:

Jose DA COSTA

Lead Developer - 35.3% of total versioning (225 Git + 116 SVN). Dominant on extranet (177 commits), flux (15), SVN legacy management.

Thomas C.

Senior Developer - 36.9% (355 Git + 1 SVN). Dominant on ESCoreBundle (113), translate (88), supplierbo (19).

wamania

Developer - 24.2% (226 Git + 8 SVN). Dominant on europeansourcing.com (166 commits), extranet (49).

IronXtreme

Developer - 3.0% (29 Git commits on ESCoreBundle).

Contribution Distribution (Git + SVN)
Commits per Repository
External Stakeholders

SQLI

IT services company that developed v1/v2/v3 (specifications, initial development)

Dolead

Google AdWords management agency (MCC 187-710-9091)

Universem

SEO agency (audits for TendanceObjet and Kadobjet)

OVH

Hosting provider (9 dedicated servers, account LB6978-OVH)

Development Workflow

GitHub organization medialeads (Bordeaux), branches per developer (jose, fancyweb, wamania), internal DokuWiki documentation. No formal Pull Request process was identified - the team relied on direct branch merges and developer-owned areas of the codebase.

The Results

Measurable impact for the business and for my career

For Me
  • Mastered Symfony 2/3 ecosystem at production scale (Propel, Doctrine, bundles, services, security, WSSE)
  • Gained deep expertise in MySQL master-slave replication, Elasticsearch multilingual indexing, and Memcache caching
  • Developed strong skills in legacy code migration - transitioning from SVN monolith to Git-based microservices without downtime
  • Built domain knowledge in B2B promotional products market, data feed automation, and multi-country e-commerce
  • Learned to coordinate within a small team where each developer owns significant portions of the codebase
For the Company

Functional Coverage

Complete B2B sourcing lifecycle covered: catalog, search, import, extranet, reseller sites, translation, statistics, payment, SEO

Multilingual Reach

7 European languages with dedicated Elasticsearch indexes and centralized translation management

Automation Scale

26+ automated supplier connectors handling heterogeneous formats (CSV, XML, API) from major European brands

Reseller Network

~60 hosted reseller mini-sites on the MyEasyWeb CMS platform

Brand Ecosystem

11+ domain brands operated: europeansourcing.com, tendanceobjet.com, kadobjet.fr, franceobjet.com, omyague.com, and more

Revenue Model

Stable B2B subscription model (240-288 EUR/year per supplier) plus multi-channel advertising services

  • Multilingual product catalog with 7-language Elasticsearch search
  • REST API with WSSE stateless authentication
  • 26+ automated supplier data import connectors
  • Supplier/reseller back-office with complete product management
  • SPA supplier dashboard (AngularJS + CoffeeScript)
  • ~60 hosted reseller mini-sites (MyEasyWeb)
  • Online payment system (Sogenactif)
  • SEO/marketing back-office (Zend Framework + ExtJS)
  • Mobile applications (jQuery Mobile + PhoneGap/Cordova)
Codebase Metrics
Microservices Ecosystem
Technology Distribution

Architecture & Diagrams

Technical architecture visualizations

Architecture Phase 2 (2016) - Draw.io
European Sourcing - Architecture Phase 2 (2016) - 9+ microservices on 9 OVH Proxmox servers
Architectural Évolution - Monolith to Microservices
WSSE Authentication - Inter-Service Communication
Entity-Relationship Diagram (Simplified)

The Aftermath

What happened after the project

The last identified commits date from late 2016 (ESCoreBundle, bo.myeasyweb.pro) with the final dated file being a Google AdWords export from February 2017. The "Rebirth" modernization phase (Phase 3) appears to have been interrupted before completion.

The platform's data and code were archived on a NAS backup system, preserving the complete SVN history (398 revisions), all 13 Git repositories (836 commits), the full SQLI documentation library (47+ documents), database dumps, and internal DokuWiki pages.

The project demonstrates a classic pattern in legacy modernization: a phased migration that achieves significant progress (monolith to microservices, SVN to Git, custom framework to Symfony) but where the final consolidation phase ("Rebirth" with shared bundles) gets interrupted by business or organizational changes.

The architectural choices from Phase 2 - particularly the service-oriented approach with dedicated subdomains and WSSE authentication - proved sound and modern for their era. The Elasticsearch integration for multilingual search and the automated supplier connector infrastructure remain technically impressive achievements.

My Critical Perspective

Honest retrospective on 8 years of development

Strengths
  • Well-designed microservices architecture

    The decomposition of the SQLI monolith into specialized services (API, search, flux, translation, export, statistics) demonstrates solid architectural vision. Each service has a clear responsibility and well-defined functional perimeter.

  • Exceptional functional coverage

    The platform covers the entire B2B sourcing lifecycle: catalog, search, automated import, supplier extranet, reseller mini-sites, translation, statistics, payment, SEO.

  • Native internationalization

    Support for 7 languages with dedicated Elasticsearch indexes and a centralized translation system demonstrates genuine European ambition.

  • Supplier import automation

    The 26+ connectors handling heterogeneous formats (CSV, XML, API) represent considerable technical investment and core business value.

Areas for Improvement
  • Security practices

    MD5 password hashing with a single iteration and no base64 salt - an obsolete and vulnerable practice even in 2016. Configuration files contained plaintext passwords. Deployment via chmod -R 777.

  • No CI/CD

    Manual deployment via svn up, no continuous integration pipeline, no automated testing in the deployment workflow.

  • No releases or tags

    Zero Git tags across all 13 repositories - no formal version management, making rollbacks difficult.

  • Technology fragmentation

    Coexistence of 4+ frameworks (custom PHP, Symfony 2.4, 2.8, 3.0, 3.1, Zend Framework 1) and 2 ORMs (Propel, Doctrine) in the same ecosystem.

What I Would Do Differently
  • Adopt a single framework from the start rather than maintaining a custom PHP framework alongside Symfony. The migration could have been more radical with a unified Symfony/Twig frontend.
  • Set up CI/CD from the GitHub migration (January 2016) - GitHub Actions did not exist yet, but Jenkins, Travis CI, or GitLab CI were available.
  • Use Docker for development and deployment environments, rather than Proxmox VPS with manual configuration.
  • Centralize data access via a single API rather than connecting each service directly to the MySQL database.
  • Adopt bcrypt/scrypt for password hashing from the Symfony migration onwards.
Lasting Lessons

Legacy migration is a marathon

The transition from SQLI monolith to microservices architecture took 3+ years and was never completed. Planning realistic milestones and temporary compromises is essential.

Data import automation is critical

The 26+ supplier connectors represent considerable business value but also permanent maintenance debt - any supplier can change their format at any time.

Internationalization must be planned from day one

The centralized translation system is an excellent pattern. Managing 7 languages after the fact would have been exponentially more expensive.

SSII documentation is precious

SQLI's specifications allowed understanding the architecture years after the end of service. Investing in technical documentation has a long-term ROI.

Related journey

Professional experience linked to this achievement

Skills applied

Technical and soft skills applied

Image gallery

Project screenshots and visuals