Stop Paying Five Figures to Move NetSuite Data into Azure.
Azure Data Factory has no native NetSuite connector. This Dockerized FastAPI bridge handles TBA auth and SuiteQL pagination so you can own the pipeline for a one-time fee — not a SaaS subscription that outlives your marriage.
~1052 words · field guide
If your current NetSuite extract is a Jupyter notebook named final_final_v3_REALLY.ipynb, this page is a safe space.
Why NetSuite → Azure feels like a side quest designed by a villain
- Option A: Pay hundreds a month for SuiteAnalytics Connect ODBC and still configure half a zoo.
- Option B: Buy a managed connector (Fivetran / Celigo / friends) and discover annual invoices that look like car payments.
- Option C: Hand-roll TBA HMAC-SHA256 at 11pm, then learn SuiteQL’s 1,000-row page limit the hard way when finance asks where January went.
The shape of the solution
A stateless, Dockerized FastAPI microservice. ADF fires a Web Activity POST to /v1/extract with SuiteQL + a blob path. The service signs TBA, paginates until hasMore is false, and writes JSON to Azure Blob / ADLS Gen2. Secrets stay in .env — not in your ADF JSON like a ransom note.
- TBA authentication solved — OAuth 1.0a HMAC-SHA256 handshake without inventing cryptography from vibes
- Automatic pagination until NetSuite says hasMore: false
- Zero hardcoded secrets — env-driven config
- Mock mode — prove the ADF contract before you touch prod tokens
- Docker / docker-compose ready for Container Apps or a VM that still remembers Ubuntu
What's in the download
- FastAPI app with /health and /v1/extract
- NetSuiteTokenAuthenticator — TBA signing
- NetSuiteSuiteQLExtractor — SuiteQL + pagination
- AzureDataLakeUploader — JSON to Blob
- Dockerfile + docker-compose.yml
- README, .env.example, verify + demo scripts
- Commercial license for client projects
What an ADF-style call can look like
{
"method": "POST",
"url": "https://bridge.example/v1/extract",
"body": {
"query": "SELECT id, tranid FROM transaction",
"destination_blob": "bronze/netsuite/transactions/day.json"
}
}
What NetSuite to ADF Enterprise Bridge is for (and what it isn’t)
NetSuite to ADF Enterprise Bridge lives in the NetSuite · Azure · ADF lane. It’s a downloadable workshop folder — code you unzip, run in mock mode, and adapt — not a hosted product with seats, SLAs, or a customer success manager named Chad.
In plain terms: A stateless, Dockerized FastAPI microservice. ADF fires a Web Activity POST to /v1/extract with SuiteQL + a blob path. The service signs TBA, paginates until hasMore is false, and writes JSON to Azure Blob / ADLS Gen2. Secrets stay in .env — not in your ADF JSON like a ransom note.
If you came here for a soft-focus brand story about ‘empowering data journeys,’ you’re in the wrong harbor. This is notes from people who got tired of rebuilding the same bridge on every engagement.
The Tuesday-afternoon version of the problem
These kits start on a Tuesday afternoon. Someone asks for a ‘thin wrapper’ or a ‘quick sync.’ Three weeks later you’re debugging pagination while Slack blinks like a smoke alarm.
For this one, the pain usually shows up as: (1) Option A: Pay hundreds a month for SuiteAnalytics Connect ODBC and still configure half a zoo. (2) Option B: Buy a managed connector (Fivetran / Celigo / friends) and discover annual invoices that look like car payments. (3) Option C: Hand-roll TBA HMAC-SHA256 at 11pm, then learn SuiteQL’s 1,000-row page limit the hard way when finance asks where January went.
If your current NetSuite extract is a Jupyter notebook named final_final_v3_REALLY.ipynb, this page is a safe space.
The missing connector nobody wants to admit is missing
Azure Data Factory will happily talk to half the planet. NetSuite is somehow still “bring your own suffering.” That’s not a dig at Microsoft — it’s just the reality every NetSuite shop discovers around month two of the lakehouse roadmap.
Teams either pay for SuiteAnalytics Connect, rent a managed sync product, or commission a custom bridge that becomes tribal knowledge the day the contractor vanishes into a ski trip. We built this kit because we were that contractor one too many times — and we wanted a reusable, readable, Dockerized answer instead of another private repo named netsuite_thing.
TBA is not “just OAuth”
NetSuite Token-Based Auth is OAuth 1.0a with opinions. The signature base string is a delicate lasagna of method, URL, and parameters. Get one encoding wrong and you get a 401 that means everything and nothing.
This kit’s authenticator exists so you don’t relearn that lasagna every fiscal year. Pair it with SuiteQL pagination and you stop writing one-off loops inside ADF that nobody wants to on-call.
Mock mode is the adult supervision
Nothing says “enterprise ready” like wiring production TBA into a pipeline you haven’t smoke-tested. Mock mode returns deterministic rows so Web Activity, retries, and blob paths can be proven first.
Then flip MOCK_MODE off, drop in tokens, and let the same contract hit the real tenant. Same shape. Fewer heart attacks.
How to evaluate it without vibes
Open the README. Copy .env.example. Run the verify script or mock path. You want a boring green signal that the contract works. Flashy demos that only run on the author’s laptop are how ‘kits’ earned a bad name.
Then read the modules like a colleague’s PR. If the structure looks reusable, keep going. If it feels like generated goo, close the tab — life’s short.
You’ll see pieces aimed at: TBA authentication solved — OAuth 1.0a HMAC-SHA256 handshake without inventing cryptography from vibes; Automatic pagination until NetSuite says hasMore: false; Zero hardcoded secrets — env-driven config; Mock mode — prove the ADF contract before you touch prod tokens; Docker / docker-compose ready for Container Apps or a VM that still remembers Ubuntu.
A realistic first week (no hero montage)
Day 0: unzip, skim the license, run verify/mock. Day 1: point env vars at non-prod credentials if you have them. Day 2: hang it behind ADF, your app, or cron — depending on what this kit is — and watch one happy path.
Day 3 is when you stop treating it like a demo: logging, retries, secrets in a real secret store, and the inevitable ‘can we also support X?’ You own the code. Extend it. That’s the whole point of a workshop asset versus renting another logo.
If your process requires a design doc before a Dockerfile, paste the architecture from this page into the doc and skip inventing folklore from Slack threads.
Where the jokes stop
Humor is here so the page isn’t a funeral. It is not a substitute for signature checks, pagination, role gates, or private networks. If you smirked and skipped verify, that’s on both of us.
Checklist: secrets out of git, mock before prod, verify in CI if you can. The ZIP is the workshop. This page is the field notes.
Dark Lighthouse is a consulting alias with a product habit — reusable bridges because rewriting them from scratch was getting old.
Where it fits
NetSuite to ADF Enterprise Bridge is aimed at data, platform, or SaaS engineers who recognize the pain bullets above and want a deployable starting point instead of a six-week inventing contest.
It won’t replace a fully managed sync, a white-glove marketplace app, or a promise that vendors never change APIs. Sharp tools, not frozen oceans.
Wrap-up
That’s the field notes for NetSuite to ADF Enterprise Bridge. Next step is the ZIP and the verify script — not another meeting. Questions: admin@darklighthousesolutions.com.
More bridges in the same style live on the kit guides index.
FAQ
Who made this?
Dark Lighthouse Solutions — data engineers who got tired of rewriting the same NetSuite glue for enterprise clients and decided the glue deserved a ZIP file and a nap.
Will it handle large extracts?
Yes. The extractor loops pages until NetSuite reports hasMore: false. Your Azure bill may have opinions; SuiteQL will keep walking.
Can I test without NetSuite?
Mock mode verifies the HTTP contract in ADF before TBA credentials exist. Ideal for demos and for managers who say “just connect it” like USB.
Refunds?
Ask via Polar within 14 days if the kit doesn’t match the advertised engineering path. Digital goods are awkward — we still stand behind “this isn’t a blank README.”
Download on Polar if you want the ZIP · All guides