Nexus
Azure-native data platform

Your ERP, your databases, your SaaS — behind one governed query layer.

Nexus reads, stages, automates and reports across the systems you already run, without copying the data into a warehouse. Deploy it into your own Azure subscription as a managed application, or let us host it.

Free month on the Microsoft Marketplace, then $150/month. Self-hosted and GCC High are sold as a private offer — talk to sales.

Datasheet
Delivery
Azure Marketplace — managed application in your tenant, or Stingray-hosted SaaS
Runs on
Azure Container Apps · PostgreSQL · Key Vault · Storage · private endpoints
Identity
Microsoft Entra ID — OAuth2 PKCE for users, client credentials for apps
Access
Per-resource RBAC grants, execution roles, append-only audit log
Connects
NetSuite · SQL Server · PostgreSQL · MySQL · QuickBooks · Monday.com · Stripe · REST · JDBC
Interfaces
Web console, desktop app, Excel add-in, and an MCP server for AI agents
Price
Free for one month, then $150/mo hosted · private offer for self-hosted and GCC High
See it work

Describe what you want in plain English, and watch it get built.

Pick a question below. Nexus reads your systems, builds the automation, wires up the alerts and publishes the app your team actually uses — no ticket, no integration project.

Claude · connected to Nexus over MCP
Look at my NetSuite and JobBoss to see if there are any mismatched records.
Used 4 tools, read a memory
  1. Recalled memoryAreas › NexusJobBoss job numbers map to the NetSuite custbody_jobno field, not the transaction id
  2. Uql list bridges
  3. Discover schema
  4. Query data
  5. Query data

Both bridges answered. I compared 1,284 JobBoss job records against the matching NetSuite sales orders for the last 90 days, keyed on custbody_jobno.

23 records do not agree. They fall into three groups:

MismatchCountWhat it means
Quantity differs11JobBoss shipped qty ≠ NetSuite fulfilled qty
Missing in NetSuite7Job closed in JobBoss, no sales order line exists
Price differs5Unit price was edited in one system only

The three worst by value:

  • JOB-40912 — JobBoss 240 ea, NetSuite 200 ea — $18,400 unbilled
  • JOB-41077 — closed 2026-08-04, never reached NetSuite — $11,950
  • JOB-40688 — unit price $84.00 against $79.50 — $4,050

Nothing was written to either system — this was a read. Total exposure across the 23 is $61,318.

Build me a pipeline to reconcile these records automatically, without me having to touch it.
Used 5 tools
  1. Uql savepipeline
  2. Uql test pipeline
  3. Uql execute pipeline
  4. Uql saveschedule
  5. Uql list pipeline runs

Done. jobboss-netsuite-reconcile is saved, tested and scheduled. On each run it:

  1. Pulls open and closed jobs from JobBoss for a rolling 7-day window
  2. Pulls the matching NetSuite sales orders in one pushdown query — the filter runs inside NetSuite, not over the whole table in memory
  3. Matches on custbody_jobno, then compares quantity, price and status
  4. Writes every exception to the recon_exceptions workspace table under a stable hash, so a repeat offender does not create a second row
  5. Auto-corrects only the safe class — quantity drift inside the 2% tolerance in the pipeline config. Everything else is flagged and left alone.

Dry run over the last 90 days: 23 exceptions found, 6 auto-corrected, 17 held for review, 4.1s.

It runs nightly at 02:00 America/New_York under a dedicated execution role that can read JobBoss and write only the two NetSuite fields it needs. Every save is a commit in your tenant's git history, so you can diff it or roll it back.

It will not post to NetSuite outside the tolerance window without a person approving that exception first.
Build a Telegram notifier pipeline that tells me when something goes wrong.
Used 5 tools
  1. Uql save connectortelegram
  2. Uql add secret
  3. Uql savepipeline
  4. Uql test pipeline
  5. Uql create grant

recon-alerts is live. The bot token went into Key Vault as telegram-bot-token — it is resolved server-side at run time, and it is never returned through the API or written to a log.

It fires on three conditions rather than on every run:

  • The reconcile pipeline fails or times out
  • Exceptions held for review pass 10 in one night
  • Any single exception is worth more than $5,000

Test message delivered to Operations just now:

Telegram · Operations
Nexus · nightly reconcile finished 02:00
17 exceptions held for review (limit 10)
Largest: JOB-40912 · $18,400 · quantity
Oldest unresolved: 6 days
→ Review in the reconciliation dashboard

Quiet hours are on: anything raised between 22:00 and 06:00 is queued and delivered at 06:00, unless it is an outright failure.

Build me a dashboard to manage all of this.
Used 6 tools
  1. Uql savereport
  2. Uql savesite
  3. Uql put site fileindex.html
  4. Uql put site fileapp.js
  5. Uql put site filestyles.css
  6. Uql create grant

Built and published. It reads the same recon_exceptions table the pipeline writes, so there is no second copy of the truth to drift.

  • Live counts — held, auto-corrected, failed, and the dollar value at risk
  • The exception queue, with approve, reject and post-to-NetSuite on each row
  • Run history, and the full log of any night that failed
  • Sign-in is your Entra ID, and a person sees only the exceptions their role can act on
Open the reconciliation dashboardnexus.yourcompany.com › sites › reconciliation

Approving an exception there calls the same governed write path the pipeline uses. It is audited under the approver's identity, not the pipeline's.

Create an MCP tool that lets someone post a journal entry to NetSuite. Give our accountant access to it and nobody else.
Used 5 tools
  1. Discover schemanetsuite
  2. Uql save mcp tool
  3. Uql create role
  4. Uql create grant
  5. Uql effective permissions

netsuite_post_journal_entry is registered and live on your MCP server. It takes a subsidiary, a period, a memo and balanced lines, checks that debits equal credits before it touches NetSuite, and returns the created internal id.

Access is a new role, Accounting — JE Post, holding exactly one permission: mcp_tool:invoke scoped to that single tool. It grants nothing else — no query access, no other tool, no admin.

IdentityCan invokeWhy
dana@ (Accountant)YesHolds Accounting — JE Post
Everyone with ReaderNoReader does not carry the grant
Workspace AdminNoAdmin is built from Reader; the grant is in neither
The reconcile pipelineNoPipelines run under their own execution role

I checked that rather than assuming it — the table is what uql_effective_permissions returned for each identity.

Every invocation is audited with the caller's identity, the arguments and the NetSuite response, and the tool refuses any entry that does not balance to zero.

Now build her a website for it, so she isn't posting entries from a chat window.
Used 5 tools
  1. Uql savesite
  2. Uql put site fileindex.html
  3. Uql put site fileapp.js
  4. Uql savereport
  5. Uql create grant

Published. It is a form, not a console — she never sees UQL, the MCP tool, or NetSuite's field names.

  • Lines validate as she types, and Post stays disabled until debits equal credits
  • Accounts and subsidiaries load live from NetSuite, so she cannot pick one that no longer exists
  • Posting calls the same MCP tool through the same single permission — the website did not get its own back door
  • Her last entries are listed with the NetSuite internal id, so she can confirm without opening NetSuite
Open the journal entry appnexus.yourcompany.com › sites › journal-entry

Anyone without Accounting — JE Post who opens that URL is refused at sign-in. There is no hidden button to find.

Generate a report on our entire financial situation that I can hand to investors.
Used 6 tools, read a memory
  1. Recalled memoryAreas › FinanceThe board reads margin by line of business, not consolidated — split hardware and service
  2. Uql list bridges
  3. Query dataquickbooks
  4. Query datamssql
  5. Query datastripe
  6. Execute report

Pulled from all three connected systems — QuickBooks Online for the ledger, SQL Server for the operational pipeline, Stripe for recurring revenue — as of 31 July 2026, unaudited.

MetricValuevs prior quarter
Revenue (TTM)$14.8M+11.4%
Gross margin61.2%+1.8 pts
ARR$3.41M+19.0%
Net revenue retention114%+3 pts
Cash$4.62M−$310K
Runway at current burn19 months−2 months

Three things an investor will ask about, so they are in the report rather than buried in a footnote:

  • Cash fell while revenue rose — $1.1M of that is inventory build against the Q4 order book, not burn
  • The margin gain is mix, not price: the service line grew three times faster than hardware
  • Two customers are 21% of revenue; the concentration table is on page 4
Open the investor reportnexus.yourcompany.com › reports › investor-summary

Every figure traces to its source — each number carries the query that produced it, the system it came from, and the timestamp it was read.

Have it rebuild itself every quarter and send it to the board.
Used 4 tools
  1. Uql savepipeline
  2. Uql saveschedule
  3. Uql test pipeline
  4. Uql create grant

Scheduled. On the first business day after each quarter closes it rebuilds from live data, renders to PDF, and emails the board list with the quarter in the subject.

  • It will not send on stale data — a QuickBooks sync older than 24 hours holds the run and notifies you instead of shipping a wrong number
  • Each edition is committed to your tenant's git history, so Q3's report stays exactly as the board saw it even after the underlying data moves
  • The board list gets the PDF; nobody outside the finance role can open the live report

Next run: 1 October 2026, 07:00. The dry run rendered in 6.2s.

A scripted walkthrough with sample data. Every step shown is a real Nexus capability; the records, figures and run times are illustrative.

Architecture

The whole platform sits inside the boundary you already control

Connectors, the query engine, the Python sandbox, the authoring history and every secret are provisioned into one resource group in your own subscription. Stingray publishes signed image updates through the managed-application contract and holds no data plane in your tenant.

YOUR AZURE TENANT your subscription · your region MICROSOFT AZURE no vendor data plane SOURCE SYSTEMS NetSuiteSQL ServerPostgreSQLQuickBooksMonday.comREST · files CONNECTORS UQL QUERY ENGINE one request shape · pushdown to each source staging · sandboxed Python · nothing copied out BUILD SURFACES Reports & dashboardslive sources, no copyPipelinesscheduled · retriedSitesinternal apps, in-tenantMCP agentsgoverned AI authoring KEY VAULTsecrets · keysENTRA IDsign-in · policyRBACper-resource grantsAUDIT LOGappend-only
Self-hosted deployment. Source systems stay where they are; only the query engine reaches them, and only through connectors your RBAC allows.

No data is copied out

Queries compile to each source's native operations and compose in your tenant. There is no vendor-side store to leak, subpoena, or breach.

Secrets stay yours

Connector credentials and signing keys live in your Key Vault, reached through managed identity. Secret values are never returned by the API or written to logs.

Your controls still apply

Private endpoints, egress rules, conditional access and Azure Policy govern Nexus the same way they govern everything else you run.

Universal Query Language

One request shape. Every system's own dialect.

A UQL read names a bridge, a collection, the fields and the filters. Nexus pushes down everything that adapter can honour, applies the rest in the engine, and hands back a flat array of rows — whichever system produced them.

read · NETSUITE.production
{
  "bridge":     "NETSUITE.production",
  "collection": "transaction",
  "select":     ["entity", "trandate", "foreignamount", "status"],
  "where": {
    "type":     { "$eq":  "CustInvc" },
    "status":   { "$eq":  "PAID" },
    "trandate": { "$gte": "2026-07-01" }
  },
  "order_by":   [{ "field": "trandate", "direction": "desc" }],
  "limit":      500
}

Change the bridge, keep the shape — each adapter compiles it to its own dialect:

→ netsuite · SuiteQL
SELECT entity, trandate, foreignamount, status
FROM   transaction
WHERE  type = 'CustInvc' AND status = 'PAID'
  AND  trandate >= ?
ORDER BY trandate DESC
→ mssql · T-SQL
SELECT TOP 500 entity, trandate, amount, status
FROM   dbo.invoices
WHERE  status = 'PAID' AND trandate >= @p1
ORDER BY trandate DESC
→ monday · GraphQL
query { boards(ids: 4471) { items_page(limit: 500) {
  items { column_values(ids: ["status","date","amount"])
          { text } } } } }

Honest pushdown

Every adapter declares which operators it can push to the source. What it cannot push is applied in the engine — filters are never silently dropped, and the run log records which was which.

Runs as you

Execution carries the caller's identity and grants, so a query cannot reach a system the person running it cannot reach.

Crossing systems is explicit

One read targets one bridge. To combine two systems you stage both through the built-in workspace in a pipeline — Nexus does not pretend to run a distributed join.

Versioned

Every saved query, report and pipeline is a commit in the tenant's own git repository. History, diff and restore are always available.

Governance

What "governed" actually means here

Not a trust badge — these are the controls that ship in the product, and what each one actually does.

ControlImplementation
AuthenticationMicrosoft Entra ID, OAuth2 with PKCE for users and client credentials for applications. Conditional access applies.
AuthorizationPer-resource grants on every adapter, query, report, pipeline and admin action — checked against the caller, not the server identity.
Automation identityExecution roles let a scheduled pipeline run with least privilege instead of the author's full access.
SecretsStored in your Key Vault, resolved through managed identity, never returned by the API and never logged.
IsolationCustom Python runs in a separate process with constrained resources and no outbound access beyond approved connectors.
EgressOutbound traffic is checked against a default-deny allowlist, on top of whatever your network policy already enforces.
AuditAppend-only activity log plus git-backed authoring history, both retained inside the deployment.
Connected systems

Adapters available today

Every adapter is a signed bundle with a declared capability set — read, write, discover, and the exact operators it can push down. The reference is machine-readable.

NetSuiteSuiteQL + REST · OAuth 1.0a
SQL Servernative pushdown · SQL / Entra auth
PostgreSQLnative pushdown · TLS
MySQLnative pushdown · TLS
QuickBooks OnlineREST · OAuth2
Monday.comGraphQL · API token
StripeREST CRUD · restricted key
Generic REST / HTTPdeclarative mapping · any auth
JDBCOracle, Snowflake, Salesforce and others
FilesCSV, Excel, JSON · in-tenant storage
Internal workspacePostgres tables Nexus manages for you
Your systemcustom adapters on request

Full adapter reference — auth, capabilities, pushdown operators and quirks

How you get it

Start free, then pick where it runs

The hosted plan is free for a month. After that the build is identical on every plan — what changes is whose subscription it runs in, and who operates it.

Private offer

Self-hosted

Private offer

The managed application deploys into your own Azure subscription. You own the infrastructure, the database and the Key Vault.

  • Runs in your tenant, your region, under your policy
  • Dedicated resources — no shared substrate
  • Azure consumption billed by Microsoft at your rates
  • Implementation and support scoped with you
Talk to sales
Private offer

GCC High

Private offer

For US government and regulated workloads, deployed through the Azure service catalog against government identity endpoints.

  • Deployed in Azure Government (GCC High)
  • Government Entra ID endpoints and tenancy
  • Same product, same controls
  • Scoped per engagement
Talk to sales
Customer-owned infrastructureNo vendor data planeMicrosoft Entra IDGranular RBACTenant-resident audit

Try it against your own systems

A free month, hosted, provisioned in minutes — or have us scope a deployment into your own tenant.