Payment and CRM providers became configuration, not code
An online school with 10,000+ students got its own billing and student accounts, synced with the course platform. Switching CRM took 48 hours instead of a rewrite.
before
6 systems with no sync, changing a provider meant a rewrite
after
CRM switched in 48 h, one codebase for several branded portals
Yii2 WordPress REST API WayForPay Fondy Pipedrive Mailchimp
Context. A Ukrainian online school: 10,000+ students, 20+ programs. Payments, CRM, email, the website and the course platform lived apart with no sync. The business wanted to change CRM and payment providers without rewriting order logic, and to launch new branded portals without forking the project. I was the primary developer on the studio side, 2020–2023.
What I did.
- Put payments and CRM behind shared interfaces. The provider is chosen in each portal's settings, not in code.
- Built an event-driven order pipeline: every order change syncs to the course platform, updates the CRM deal and sends emails.
- Built a separate hub service between billing and the course platform: one source of truth for students, purchases, trials and progress.
- Added multi-tenancy: each portal has its own domain, branding, providers and language, with data isolated at the model level.
- Set up student deduplication across platforms by normalized email, phone and name.
Result.
- A new payment provider and a new CRM were added without touching order logic.
- AmoCRM to Pipedrive in 48 hours, 7,000+ contacts, no data lost.
- One codebase running several branded portals.
- 10+ hours a week less manual work on enrollment and email.