Skip to content

Integration Architecture Overview

This document provides an overview of the integration module in retail-api, connecting 46+ external financial platforms to synchronize accounts, holdings, and transaction data.

Responsibilities:

  • Connect to external financial platforms (brokerages, custodians, CRMs, aggregators)
  • Synchronize account data, holdings, transactions, and insurance policies
  • Map external entities to internal Households, Accounts, and Persons

Code Locations:

  • /retail-api/app/Integrations/ - 46+ vendor implementations
  • /retail-api/app/Http/Controllers/Advisors/Integrations/ - REST API endpoints
  • /packages/libs/integrations-core/ - Core abstractions (Integrator, EntityProvider, Exceptions)
  • /packages/libs/integrations-file-based/ - Shared file-based integration logic
DimensionAPI-basedFile-based
Data SourceReal-time external API callsUser-uploaded files (CSV/Excel)
AuthenticationOAuth 2.0 / JWT / API Key / SOAPNone (file validation only)
Sync TriggerScheduled + Webhook + ManualManual upload only
ComplexityHigh (state machine, error recovery)Medium (parsing, mapping)
Count27 integrations19 integrations
ExamplesYodlee, Schwab API, Orion, AddeparFidelity, Pershing, LPL, Schwab (file)

Note: Some vendors have both API and file-based versions (e.g., Schwab, LPL, Betterment).

┌─────────────────────────────────────────────────────────────────────────────┐
│ User Action │
│ (Link Account / Upload File / Sync) │
└─────────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────────────┐
│ Controller Layer │
│ EntityController | IntegrationMappingController | SyncController │
│ #[IntegrationScenario(Scenario::*)] │
└─────────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────────────┐
│ Job Queue (Async) │
│ Dispatch sync jobs for background processing │
└─────────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────────────┐
│ Integrator Layer │
│ Integration::getIntegratorFqcn() → App\Integrations\[Vendor]\Integrator │
│ │
│ API-based: listEntities(), sync(), syncAll() │
│ File-based: parse(), map(), import() │
└─────────────────────────────────────────────────────────────────────────────┘
┌───────────────┴───────────────┐
▼ ▼
┌───────────────────────────────┐ ┌───────────────────────────────┐
│ Connector (API-based) │ │ Parser (File-based) │
│ HttpConnector | OAuthConnector│ │ CSV/Excel parsing & mapping │
│ SoapConnector │ │ │
└───────────────────────────────┘ └───────────────────────────────┘
│ │
▼ ▼
┌───────────────────────────────┐ ┌───────────────────────────────┐
│ External API │ │ S3 Storage │
│ (Vendor REST/SOAP/OAuth) │ │ (Uploaded files) │
└───────────────────────────────┘ └───────────────────────────────┘
│ │
└───────────────┬───────────────┘
┌─────────────────────────────────────────────────────────────────────────────┐
│ Vendor Models Layer │
│ Parse response → Vendor-specific Account/Holding models │
└─────────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────────────┐
│ Internal Models Layer │
│ Map to: Household | Account | Insurance | Person | TargetCategoryMix │
│ Create/Update IntegrationMapping │
└─────────────────────────────────────────────────────────────────────────────┘
app/Integrations/
├── [Vendor]/
│ ├── Api.php # API client wrapper (optional)
│ ├── Connector.php # Transport: HTTP/OAuth/SOAP
│ ├── Integrator.php # Core sync logic
│ ├── Importer.php # Household import logic
│ ├── Models/ # Vendor-specific data models
│ │ ├── Account.php
│ │ ├── Holding.php
│ │ └── ...
│ ├── Exceptions/ # Vendor-specific exceptions
│ └── OAuth2/ # OAuth config (if OAuth-based)
└── Support/
├── Scenario.php # 10 integration scenarios
├── Developer.php # Developer ownership map
├── LegacyApiBased/
│ ├── Connectors/ # Base connector classes
│ │ ├── HttpConnectorWithIntegration.php
│ │ ├── OauthConnectorWithIntegration.php
│ │ └── SoapConnectorWithIntegration.php
│ ├── Integrators/
│ └── Exceptions/
└── ApiBased/ # Modern API-based infrastructure
├── Connectors/
└── Integrators/
PackageLocationPurpose
integrations-core/packages/libs/integrations-core/Base classes: Integrator, EntityProvider, CursorPage, Exceptions
integrations-file-based/packages/libs/integrations-file-based/Shared file parsing and mapping logic
core-models/packages/libs/core-models/IntegrationType enum, base models

An instance of a configured integration for an advisor.

// Key fields
$integration->type; // IntegrationType enum (46 types)
$integration->reference; // Vendor-specific identifier
$integration->credentials; // Encrypted JSON credentials
$integration->failed_since; // When sync started failing
$integration->failed_biz_days; // Consecutive failure days
// Key methods
$integration->getIntegratorFqcn(); // Get Integrator class
$integration->getConnectorFqcn(); // Get Connector class
$integration->getSynchronizer(); // Get Sync handler

Links an external entity (vendor account) to an internal object (Household, Account, etc.).

// Key fields
$mapping->integration_id; // Parent Integration
$mapping->parent_id; // Hierarchical parent (for nested mappings)
$mapping->mappable_type; // HOUSEHOLD | ACCOUNT | INSURANCE | PERSON | CONTACT | TARGET_CATEGORY_MIX
$mapping->mappable_id; // ID of mapped internal object
$mapping->reference; // Vendor-specific entity ID
$mapping->sync_status; // Current sync status
$mapping->last_completed_at; // Last successful sync
// Key methods
$mapping->sync(); // Synchronize this mapping

Core class implementing sync logic for each vendor.

abstract class Integrator
{
abstract public function syncAll(): void;
abstract public static function sync(IntegrationMapping $mapping): array|null;
abstract protected static function getVendor(): IntegrationType;
}

Transport layer handling API communication.

TypeClassUse Case
HTTPHttpConnectorWithIntegrationREST APIs with API Key/Token
OAuthOauthConnectorWithIntegrationOAuth 2.0 flow (Schwab, Addepar, Orion)
SOAPSoapConnectorWithIntegrationLegacy SOAP services

Interface for listing available entities from external service.

interface EntityProvider
{
public function listEntities(array $conditions, ?string $cursor = null): CursorPage;
}

Defined in Support/Scenario.php, used to track operation context:

ScenarioDescription
CREATE_INTEGRATIONInitial integration setup
LINK_ENTITYLink vendor entity to household
LIST_ENTITIESDiscover available accounts
SYNC_HOUSEHOLDSync single household
SYNC_INTEGRATIONSync all accounts for integration
NIGHTLY_SYNCScheduled background sync
IMPORT_HOUSEHOLDBulk household import
IMPORT_CLIENTSImport client data
LIST_TAGSGet CRM tags/categories
SEND_PDFDocument delivery
GET /advisors/{advisor}/integrations/{integration}/entities
List available entities from vendor (with search, cursor pagination)
GET /advisors/{advisor}/integrations/{integration}/mappings
List linked accounts with household info
POST /advisors/{advisor}/integrations/{integration}/mappings
Link vendor entity to household
DELETE /advisors/{advisor}/integrations/{integration}/mappings/{mapping}
Unlink entity (soft delete)
POST /advisors/{advisor}/integrations/{integration}/mappings/{mapping}/sync
Sync single household mapping
POST /advisors/{advisor}/integrations/{integration}/sync
Sync entire integration
GET /advisors/{advisor}/integrations/{integration}/tags
List household tags from CRM integration
VendorAuth TypeDeveloper
AddeparOAuth 2.0Winston Li
AdvyzonOAuthKewei Yan
AlbridgeAPITingsong Xu
Allianz APIOAuthYan Hu
Asset BookOAuthQianwei Hao
Asset MarkAPIQianwei Hao
Black DiamondAPIQianwei Hao
BlueleafHTTPTingsong Xu
Bridge FTAPIYan Hu
CapitectOAuthYan Hu
Circle BlackAPITingsong Xu
CommonwealthHTTPTingsong Xu
DSTAPIYan Hu
FinFolioAPIYan Hu
InvestigoAPIKewei Yan
LPL (API)APIQianwei Hao
Max My InterestAPIWinston Li
Morningstar AdvisorAPIQianwei Hao
Morningstar OfficeAPIWinston Li
NationwideAPIWinston Li
OrionOAuthKewei Yan
PanoramixOAuthTingsong Xu
RedtailAPIQianwei Hao
RiskalyzeAPITingsong Xu
Schwab APIOAuth 2.0Yan Hu
Smart OfficeAPIWinston Li
TamaracSOAPTingsong Xu
Wealth AccessAPIYan Hu
WealthboxAPI KeyKewei Yan
VendorFile TypeDeveloper
AllianzFileYan Hu
AltruistFileYan Hu
ApexFileTingsong Xu
BettermentFileKewei Yan
FidelityCSVQianwei Hao
First ClearingFileQianwei Hao
FlourishFileTingsong Xu
Folio InvestingFileQianwei Hao
Interactive BrokersFileWinston Li
JacksonFileWinston Li
LPL (File)FileQianwei Hao
My529FileKewei Yan
Pacific LifeFileWinston Li
PershingExcelKewei Yan
Raymond JamesFileWinston Li
RBCFileYan Hu
Schwab (File)CSVYan Hu
SEIFileWinston Li
Trust AmericaFileKewei Yan