INTEGRATIONS & ADD-ONS

Contractor software integrations

Eighteen connectors to the calendars, books, payments, and field tools you already run — no extra glue app to babysit, and a health rail that says which ones actually answered rather than which ones have a key sitting in a box.

How do you know which integrations are actually connected?

The Integrations screen in Command Center, subtitled 'Live from /api/integrations/status' — connector cards for Airtable, Anthropic, Browserbase, DocuSign, ElevenLabs and Facebook Page, each showing its own status: configured, not_connected, or connected. The unconnected cards explain themselves, saying the connector authenticates with a key held on the server rather than OAuth and that credentials must be added to the server environment before the screen re-probes

A connector you can see doing the work.

The Send for Signature screen inside Command Center, subtitled 'Live — POST /api/esign/envelope' — a New E-Signature Envelope form with empty fields for the PDF path on the server, signer name, signer email and subject line, above the Talk to Annabelle bar for the same screen

Which business tools does Stinger integrate with?

Google Calendar

OAuth-connected scheduling — availability checks, upcoming events, and event creation on the calendar you pick.

Google Drive

List and search files, grab a share link, or pull one into the asset library.

Dropbox

Offline-access OAuth with token refresh — browse, search, read, write, and append files without leaving the console.

Stripe

Payment links, invoices, subscriptions, a revenue dashboard, and signature-verified webhooks.

Lightspeed Retail

Customers, invoices and payments on Retail X API v3, with automatic token refresh on a 401.

QuickBooks Online

Invoice creation, expense tracking, P&L and balance sheet reports, open invoices and aged receivables.

HubSpot

Contacts on CRM v3, notes and calls logged as real engagement objects, associations on v4.

Buildertrend

Jobs, milestones and client messages, a milestone/document webhook, and CSV import from the emailed export.

Linear

Create issues, list open issues, and read the teams the API key can actually see.

Asana

Create tasks, list by project, and mark complete.

Notion

Search pages and databases shared with the integration, and flatten a page into readable text.

ServiceTitan

One-way migration: OAuth token fetch, paginated Export API pulls, field mapping — dry run by default.

DocuSign

Send an envelope, check its status, list completed ones, download the signed PDF.

Twilio

SMS send and receive, inbound voice handling, and API-key auth rather than the account token in production.

ElevenLabs

Voice synthesis for calls and voicemail greetings.

Gmail

Draft-and-send email over SMTP, scoped per brand so each business unit sends as itself.

Zapier

Publish out to a catch hook, which fans out to the platforms Zapier already holds logins for.

Facebook / Meta

Direct page posting on Graph API v21.0 — feed posts and photo posts with a Page token.

Three different questions, and the screen tells you which one it asked.

Reached

For the providers that support it, the check is a real request to the vendor with a four-and-a-half-second budget — Stripe's balance, HubSpot's contacts, ElevenLabs' voices. That is the only check that proves a connection works.

Token present

For an OAuth provider, the rail reads what's stored locally. It does not need to call the vendor to tell you whether a token exists, and it doesn't claim more than that.

Key saved

For the rest, the check is only that a credential exists. A saved key is not a working connection, and the rail labels it that way instead of colouring it green and hoping.

"Unknown" is a real answer

If a stored credential can't be read or parsed, the status is unknown with a sentence explaining why — not "connected," and not "disconnected." A screen that claims connected when it isn't is worse than one that admits it doesn't know.

Half-connected reads as half-connected.

Google is two connections behind one card

Calendar and Drive are connected separately. Connect one and the rail says "partial" and names the one that's missing, rather than rounding up to connected or down to not.

Whoever holds the secret answers for it

Each connector's status is asked of the module that actually stores the credential, instead of a second copy of the key names kept in the health screen. That copy is how a provider you had genuinely connected once read back as not connected.

Loading the page doesn't call eighteen vendors

The aggregate view is local by default. Fanning out on page load would let one slow provider hold the whole screen open, so network verification is a deliberate action you take, not something a dashboard does behind you.

Rate-limited says rate-limited

A 429 from a vendor is its own status. It isn't folded into "error," because a provider throttling you is a different problem from a provider rejecting you.

Nothing goes out on the strength of an HTTP 200.

Draft, then confirm

Social posts save as a draft first. Publishing is a separate, explicit step — an agent can write the post and cannot push it. Numeric claims in a draft get surfaced for you to check, because that's the sentence a model is most likely to invent.

A web page answering isn't a webhook

If a Zapier URL replies with HTML instead of a hook response, the post is recorded as not published and says so. A 200 that wasn't a real publish once got stamped Published anyway; every publisher now judges the reply through the same check.

No post id, no "posted"

Facebook can answer 200 with an error body. Without a real post id back from Graph, the post is not marked published — and an expired Page token comes back as a plain instruction to regenerate it, not a generic failure.

Credentials aren't logged

The ServiceTitan migration takes credentials in the request body, uses them in memory for that request, and never writes them to a log or a database. Its default is a dry run that maps and validates without writing anything.

One provider in the rail is wired to nothing, and it stays listed anyway.

SendGrid: listed, and honestly not connected

Nothing in the app imports SendGrid or calls its API. Email campaigns go out over Gmail SMTP. The entry stays in the rail as a permanent, truthful "not connected" rather than being quietly deleted — but don't read its status as a signal about whether campaigns work, because it isn't one.

ServiceTitan is an import, not a live sync

It pulls records in and maps them onto Stinger's schemas. It is a migration path with a status endpoint, not a two-way connection that keeps both systems agreeing afterwards.

Availability varies by plan

Not every connector is switched on for every account, and several need credentials only you can issue — a Page token, a Buildertrend account ID, a ServiceTitan app. Ask which ones are included on yours rather than assuming all eighteen.

One console, not eighteen browser tabs.

These aren't glue-app chains you have to maintain — they're wired directly into the console so Annabelle and your team can act on them in the same conversation. Talk to Vincent about what's connected on yours.

Where these integrations show up.

These connectors run underneath every trade platform, including Pool Construction and Pool Service. See how they fit into the whole system on the full platform overview.