Platform ·DarDev Team · 7 min read

Prospect import pipelines: OECT, SMB, schools, services

Four parallel CRM-only import tracks—OECT accountants, Startup Tunisia SMB, DarDev Services, and 20.tn schools—share Twenty fields, locks, and consent-unknown discipline.

Four prospect import tracks converging on Twenty CRM without Listmonk on cold import

DarDev runs four parallel prospect import pipelines into Twenty CRM—OECT accountants, Startup Tunisia SMB, DarDev Services consulting, and 20.tn schools—each CRM-only on import with consentEmail UNKNOWN and no Listmonk subscription until explicit opt-in. Shared infrastructure covers custom fields, enum sync, file locks, and rate limiting. Ops assigns each pipeline to a solution workspace while utilities stay in DarDev central, as described in crm-orchestrates-bus-executes and inside-unified-mailer-stack.

This article is the public map of integrations/PROSPECT-IMPORT-PIPELINES.md. It emphasizes DarDev Services (Tunisia startups and PME buying cloud, DevOps, and custom development) alongside Hesabi and 20.tn tracks—same ethics, different ICP and targetSolution enum.

Shared CRM foundation

One-time setup from repo root provisions Person and Company custom fields, enum values (STARTUP_TUNISIA, PME, OPT20TN, DARDEV), and filtered views. Scripts live under scripts/twenty/: setup-prospect-fields.js, sync-prospect-enums.js, plus track-specific view setup (setup-oect-views.js, setup-smb-views.js, setup-services-views.js, setup_20tn_crm_fields.py).

  • TWENTY_API_URL defaults to https://crm.dardev.net
  • TWENTY_API_KEY required in operator .env—never published
  • TWENTY_IMPORT_DELAY_MS default 2100 ms (~28 records/min)
  • data/.twenty-crm-import.lock serializes imports across tracks

Track comparison

  • OECT — Experts-comptables and cabinets → Hesabi Cabinet offer; scripts/oect/; operator PC scrape
  • Hesabi SMB — Startup Tunisia database CSV → Hesabi Starter/Pro; scripts/hesabi-smb/
  • DarDev Services — Same Startup TN source, different CRM segment → consulting; scripts/dardev-services/
  • 20.tn Ecoles — ecoles.com.tn Playwright scrape → school ENT platform; scripts/20tn-ecoles/

OECT pipeline (accountants)

Folder data/oect/. Live scrape and import via python scripts/oect/restart_oect_import.py or resume_oect/resume_oect_import.py for safe resume alongside SMB jobs. Tags on import: lead:hesabi, icp:cabinet-comptable, source:oect-annuaire-2026, consent:unknown—never product:hesabi:marketing.

OECT blocks VPS bots; scraping runs on the operator PC permanently. DarDev Ops registers scraper-oect connector with staging-status and trigger-resume capabilities—remote Ops shows status, local machine executes Playwright.

Hesabi SMB pipeline

Folder data/hesabi-smb/. Wave one source: Startup Tunisia database at startup.gov.tn/fr/database exported to data/hesabi-smb/raw/startup-tunisia.csv. import_startup_tunisia.py supports --sample dry-run and --live fetch plus import.

CRM fields: DarDev solution HESABI, Lead source STARTUP_TUNISIA, Segment STARTUP or PME, Consentement email UNKNOWN. Views: Hesabi PME and startups, Hesabi SMB contacts. Marketing list entry waits for subscribe form or documented consent per deployed-realities-explained.

DarDev Services pipeline (focus)

Folder data/dardev-services/. Scripts parse the same Startup Tunisia CSV when present under data/hesabi-smb/raw/—reusing fetch infrastructure while writing a separate staging file and CRM segment for consulting outreach.

  1. node scripts/twenty/setup-prospect-fields.js — includes serviceInterest, engagementModel, regionMarket
  2. node scripts/twenty/setup-services-views.js — DarDev Services Tunisia views
  3. python scripts/dardev-services/import_startup_services.py --sample — dry-run
  4. python scripts/dardev-services/import_startup_services.py --live --no-fetch — parse existing CSV and import

CRM fields: DarDev solution DARDEV, Lead source STARTUP_TUNISIA, Segment STARTUP or PME, Region market TUNISIA, Consentement email UNKNOWN. Views: DarDev Services Tunisia, DarDev Services PME Tunisia, DarDev Services contacts.

First outreach runs via scripts/dardev-services/run-services-outreach.sh after CRM QA—sync-worker POST /api/sync/services-outreach with tracked templates, not Listmonk cold blast. Listmonk list dardev-services-marketing receives subscribers only after opt-in at mail.dardev.net/subscribe/dardev-services-marketing.html. Twenty welcome workflow sends staff 1:1 from Zoho contact@dardev.net with booking link—human channel, not Stalwart bulk.

20.tn Ecoles pipeline

Folder data/20tn-ecoles/. Playwright scrape of ecoles.com.tn/etablissements-clubs; ~970 schools imported aggregate in phase one. CRM: targetSolution OPT20TN, leadSource ECOLES_ANNUAIRE, schoolLevel, schoolOwnership, consentEmail UNKNOWN.

Outreach automation is separate—Twenty workflows plus bus send-one documented in 20TN-OUTREACH-IMPLEMENTATION. Import stops at CRM; tracked mail requires workflow approval per 20tn-outreach-one-school-at-a-time.

From import to campaign

All four tracks follow the same ladder: CRM import with consent unknown → phone or LinkedIn or 1:1 email outreach → subscribe form or written consent → update consent field and marketing tag → Listmonk sync via bus webhooks. Skipping steps violates crm-driven-product-lists discipline and risks deliverability on inside-unified-mailer-stack identities.

CRM views after setup

  • Hesabi OECT prospects and OECT cabinets
  • Hesabi PME and startups plus SMB contacts
  • DarDev Services Tunisia / PME / contacts
  • 20.tn school filters via setup_20tn_crm_fields views

Ops solution ownership

Hesabi manifest owns OECT and SMB pipelines. DarDev Services manifest owns services import and outreach playbook links. 20tn manifest owns ecoles-import scraper-custom connector. Company manifest holds shared lock utilities and verify scripts. Pipelines declare runsOn operator-pc with stagingFile and logFile paths—Ops Pipelines tab shows run history without executing Playwright on dardev-vps.

Logs and troubleshooting

  • OECT — data/oect/import-run.log, resume-run.log
  • Hesabi SMB — data/hesabi-smb/import-run.log
  • DarDev Services — data/dardev-services/staging.json batch output
  • 20.tn Ecoles — data/20tn-ecoles/import-run.log

CRM import errors: see runbooks/TROUBLESHOOTING.md. Rate limit bumps on self-hosted Twenty require Postgres keyValuePair patch via scripts/vps/update-twenty-rate-limits.sh—.env alone is insufficient on VPS.

DarDev Services go-to-market detail

Services ICP is Tunisia startups and PME needing cloud migration, Kubernetes operations, or custom product development—not Hesabi fiscal software. Imported Companies carry serviceInterest and engagementModel fields for segmentation in CRM views. Sales reads DarDev Services Tunisia and PME Tunisia tables before run-services-outreach.sh; script calls sync-worker with tracked templates on sales.dardev.net identity, separate from news@send.dardev.net product digest sender.

Webhook path POST /api/site/contact and POST /api/sync/services-outreach bridge inbound interest to CRM updates. Opt-in subscribe at mail.dardev.net/subscribe/dardev-services-marketing.html gates Listmonk dardev-services-marketing list—sync-worker adds product marketing tag only after documented consent. Twenty welcome workflow for DARDEV plus TUNISIA filter sends human booking mail from Zoho contact@dardev.net—appropriate for warm replies, not cold bulk.

Cross-pipeline dedupe and ethics

Startup Tunisia CSV may feed both Hesabi SMB and DarDev Services importers with different targetSolution values. Operators review overlap in CRM before dual outreach—same founder should not receive unrelated cold tracks the same week. consentEmail UNKNOWN on all imports; phone-first when email missing matches OECT and ecoles pipelines. crm-driven-product-lists article explains tag vocabulary; this overview maps which script owns which tag set.

Environment and operator machine

All import scripts expect TWENTY_API_KEY and optional TWENTY_API_URL in repo root .env on the operator workstation. Playwright-based fetchers need local browser deps; VPS cron is wrong place for OECT and ecoles jobs. Fabric deploy scripts on dardev-vps do not replace import runs—they deploy bus and CRM infrastructure imports depend on. After VPS Twenty upgrade, re-run setup scripts if enum values drift.

Twenty user guide docs/user-guides/TWENTY-CRM.md explains view picker for sales staff after imports complete. Listmonk campaign steps remain in user-guides/LISTMONK-CAMPAIGNS.md—only after opt-in tags appear. The ladder from import to campaign is identical across tracks; only ICP, scripts folder, and targetSolution enum change.

CRM-PRODUCT-INTEGRATION.md covers inbound product signups (paying customers)—distinct from these cold import pipelines. Do not route checkout webhooks through OECT or Startup TN staging; customer records already carry consent implied by purchase.

Privacy in public writing

News articles cite aggregate counts and field names only—no sample emails, staging JSON paths with PII, or internal test cohort fixtures. Playbooks with operator detail stay in docs/ and staff runbooks.

Does any import add Listmonk subscribers?

No. All four tracks are CRM-only on create. Listmonk enters after opt-in and bus sync—not on import day.

Can OECT and SMB import run simultaneously?

No. They share data/.twenty-crm-import.lock. Queue one job at a time.

How is DarDev Services different from Hesabi SMB?

Same Startup Tunisia source possible, but targetSolution DARDEV, consulting ICP, separate views, and services-outreach bus path—not Hesabi product tags or hesabi-marketing list.

Where do schools fit?

20.tn ecoles pipeline imports OPT20TN records from ecoles.com.tn. Sales motion is school directors, not Startup TN founders.

What playbook covers Services first send?

docs/DARDEV-SERVICES-OUTREACH-PLAN.md and run-services-outreach.sh after CRM QA and consent discipline review.

Get company news

Releases and announcements — confirm from your inbox.

Subscribe to updates