Exports & Imports — Code Map
Exports
apps/api/src/export/export.module.tsapps/api/src/export/export.controller.ts—@Throttle10/min/IP, enqueue + status endpoints.apps/api/src/export/export.service.ts— enqueue, processExport, getJob, listJobs, email send.apps/api/src/export/export.processor.ts— BullMQexportqueue processor.apps/api/src/export/dto/export-config.dto.ts—ExportMembersDto.- Analytics synchronous tab CSV exports:
apps/api/src/analytics/analytics.controller.ts—@Get('export')handler + localtoCsv().
Imports
apps/api/src/import/import.module.tsapps/api/src/import/import.controller.ts— provider config, Arbox kick-off, CSV upload (?entity=members|leads) + confirm, job status, cancel.apps/api/src/import/import.service.ts— orchestrator:enqueueImport,uploadCsvForPreview,confirmCsvImport,orchestrateImport,orchestrateArboxImport,orchestrateArboxMembersViaManagementApi,orchestrateArboxMembersViaBusinessApi,orchestrateCsvImport,importCsvPlans,importArboxPlans,fanOutLeadJobs,processSingleLead,recordLeadResult,cancelStalePendingCsvJobs.apps/api/src/import/import.processor.ts— BullMQimportqueue processor.apps/api/src/import/import-member.processor.ts— BullMQimport-memberqueue (per-member fan-out).apps/api/src/import/import-lead.processor.ts— BullMQimport-leadqueue (per-lead fan-out for CSV lead imports).apps/api/src/import/import-enrich.processor.ts— BullMQimport-enrichqueue (Business API enrichment after Management API import).apps/api/src/import/arbox-api.service.ts— HTTP client for both Arbox APIs (loginForManagement,fetchActiveMembersReport,fetchInactiveMembersReport,fetchUsers, …).apps/api/src/import/csv-parse.service.ts—parseAndValidate(buffer)+suggestMapping(headers, entity)(member + lead alias sets). Tested incsv-parse.unit.spec.ts.apps/api/src/import/import-provider-config.service.ts— encrypted credentials CRUD.apps/api/src/import/types/arbox.types.ts— Arbox API response shapes.apps/api/src/import/types/normalized.types.ts—NormalizedMemberData,NormalizedLeadData.- DTOs under
apps/api/src/import/dto/:import-config.dto.tscsv-import.dto.tsimport-provider-config.dto.ts
Cross-cutting
apps/api/src/payments/services/credential-encryption.service.ts— shared encryption for provider credentials (also used by payments).apps/api/src/notifications/email.service.ts+apps/api/src/notifications/templates/export-ready.ts— export email.apps/api/src/r2/r2.service.ts— CSV storage for exports.
Schema
libs/db/src/lib/schema/exports.ts—export_jobs.libs/db/src/lib/schema/imports.ts—import_jobs,import_provider_configs.
Queues (BullMQ)
exportimportimport-memberimport-leadimport-enrich
CSV import entity types
The generic CSV pipeline (upload → preview/map → confirm → async fan-out) supports two entity types, selected via ?entity= on upload and the entities flag on confirm:
members(default) — maps toNormalizedMemberData, fans out onimport-member, can run an Arbox enrichment phase. Plans can be imported inline alongside.leads— maps toNormalizedLeadData(name/email/phone/locale/source/note), fans out onimport-lead, insertsleads+organization_leads+ anewlead_status_eventsrow. Per-row email/phone dedup against the org. Does not fire the per-lead follow-up auto-task (avoids flooding the owner on bulk imports). No enrichment phase.
A single CSV job imports one entity type (members or leads); the shared import_jobs.phase enum gained a leads value (migration 0064_bright_banshee.sql).