Skip to Content
Living documentation — last reviewed 2026-05-28
FeaturesExports ImportsExports & Imports — Code Map

Exports & Imports — Code Map

Exports

  • apps/api/src/export/export.module.ts
  • apps/api/src/export/export.controller.ts@Throttle 10/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 — BullMQ export queue processor.
  • apps/api/src/export/dto/export-config.dto.tsExportMembersDto.
  • Analytics synchronous tab CSV exports:
    • apps/api/src/analytics/analytics.controller.ts@Get('export') handler + local toCsv().

Imports

  • apps/api/src/import/import.module.ts
  • apps/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 — BullMQ import queue processor.
  • apps/api/src/import/import-member.processor.ts — BullMQ import-member queue (per-member fan-out).
  • apps/api/src/import/import-lead.processor.ts — BullMQ import-lead queue (per-lead fan-out for CSV lead imports).
  • apps/api/src/import/import-enrich.processor.ts — BullMQ import-enrich queue (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.tsparseAndValidate(buffer) + suggestMapping(headers, entity) (member + lead alias sets). Tested in csv-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.tsNormalizedMemberData, NormalizedLeadData.
  • DTOs under apps/api/src/import/dto/:
    • import-config.dto.ts
    • csv-import.dto.ts
    • import-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.tsexport_jobs.
  • libs/db/src/lib/schema/imports.tsimport_jobs, import_provider_configs.

Queues (BullMQ)

  • export
  • import
  • import-member
  • import-lead
  • import-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 to NormalizedMemberData, fans out on import-member, can run an Arbox enrichment phase. Plans can be imported inline alongside.
  • leads — maps to NormalizedLeadData (name/email/phone/locale/source/note), fans out on import-lead, inserts leads + organization_leads + a new lead_status_events row. 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).