Product

Connecting other systems

Every number kept in two places will disagree eventually, and the disagreement is always discovered at the worst possible time.

One authority per fact

Read it where it lives instead of copying it here

The usual approach to integration is synchronisation: a copy of someone else's data is brought into your system and kept roughly current by a process that runs periodically. It is the obvious design and it has a failure mode that is guaranteed rather than likely.

Two copies of the same fact will disagree. The synchronisation fails quietly, or runs late, or hits a rate limit, or succeeds while the other system is mid update. Now one of the numbers is wrong and neither system knows which. The discovery is always the same: a customer, an auditor or a year end.

The alternative is to read the value at the moment someone looks at it. There is one authority for each fact, and the question of which copy is right cannot arise because there is only one. When the connection is broken the value is absent and the product says so, which is a considerably better failure than a stale number displayed confidently.

Which is also why some things are deliberately absent

This principle is the reason Consonas does not do accounting. Cost, headcount and the ledger belong to the system that owns them. Copying them here would create a second authority for numbers that must only have one, and building our own would create a second, worse general ledger.

The same reasoning applies to product usage in a technology business, to stock in a retail one and to valuations in an advice firm. In each case there is a system whose job that is, and the right relationship is to read from it.

Copy against read

Six moments where the two approaches diverge

The first column is what most integrations do, and it is fine until it is not.

The approach Copying the number in Reading it where it lives
The value changes at the sourceYour copy is now wrong, and nothing announces it.The next read gets the new value. There is nothing to go stale.
Someone spots a discrepancyTwo systems, two numbers, and an argument about which is authoritative.One authority. The question of which is right does not arise.
The connection breaksThe copy keeps being shown, confidently, and looks fine.The value is absent and the product says the connection has failed.
You stop using the other systemYou keep a copy of data you no longer maintain, indefinitely.The value stops appearing, which is honest about what you now know.
An auditor asks where a figure came fromFrom a synchronisation that ran at some point, probably.From the system of record for that figure, at the moment you looked.
The two systems disagreeDiscovered by a customer, or at year end.Cannot happen, because there is only one of them.

The directory

One list of what connects, and no pretence of one runtime

There is a single directory of connections, and every entry in it declares the same things: what it does, which way data moves, who built and supports it, what your plan has to carry, and whether it exists yet. That last field is the one that earns its keep. The product reads the same list this page does, so a connector that is planned looks planned in both places rather than appearing as a button that answers with a refusal.

What there is not, and what an earlier version of this paragraph claimed, is one runtime underneath with one set of rules about authentication, failure and retry. The mailbox and calendar connections share an authorisation module because they share two providers. Retry with backoff belongs to outbound webhooks and to nothing else. Companies House, the VAT check and the bank holiday dates are three small modules with three different answers to the other end being down, each defensible on its own and none of them a framework.

The cost of admitting that is the thing the tidier sentence was hiding: the eleventh connection is more work than the fourth, and a shared runtime is worth building when there are enough connections to know what it would have to do, rather than before.

What is shared is the posture, which survives having no framework. Each connection asks for the narrowest access that does the job, and asks separately: connecting a calendar requests calendar permissions and no mail permissions at all, because a screen that says calendar and quietly requests the inbox is asking for more than it said. Every integration is another party with access, and the honest way to limit that risk is to limit the access rather than to trust the other end to behave.

Failure

Saying so, to someone who can act

When a connection stops working, the product says so in the interface rather than in a log no one reads. The value that would have been shown is absent instead of being a stale copy, because a number quietly out of date is more dangerous than one visibly missing.

This is the difference between an integration you can rely on and one you have to check. Silent failure is the normal behaviour of synchronisation, and it is why so many organisations have a person whose job partly consists of noticing that something has not run.

Someone else's interface will change, their authentication will move and their rate limits will tighten. That is not a criticism of anyone, it is what happens over years, and the only defence is that failure is loud.

The API

Tokens you issue, scoped to one job

A documented interface on the paid plans, with tokens you create and revoke yourself. Tokens are scoped: one issued for reading a report cannot write records, and one issued for a single job cannot do every job.

Scoping matters more for an API than for almost anything else, because a token is a credential that ends up in someone's script, in a configuration file, occasionally in a repository. Limiting what it can do is the only control that survives that.

Call allowances by plan are on the pricing page, and the figure against the ceiling is on the integrations screen, so nobody has to guess where they are in the month. Calls are counted across all of an organisation's keys rather than per key, because the allowance belongs to the organisation, and passing it warns rather than cutting anyone off mid month: every answer carries the count, the ceiling and, once it is passed, a warning header.

How security works

Connection by connection

Reading from where the number already lives

What connects today, what is named and not built, and the properties each connection has.

Mailboxes
Gmail and Microsoft Outlook mail, so correspondence with people you already hold a record for lands on those records without anyone working in a second inbox. Reading and sending, so a reply leaves from your own address, and metadata rather than message bodies.
Web forms
An enquiry on your own site becomes a lead here, with the exact consent wording the visitor was shown recorded as a consent record rather than as a tick.
Outbound events
An address of yours, told when one of a closed list of things happens, with a signature you can check and a retry ladder that gives up loudly rather than quietly.
Public records
Companies House and the published bank holiday dates, read on a schedule and cached, never fetched while somebody waits for a page. The VAT registration check runs when somebody asks for it, and the answer is kept on the record with the date it was checked.
Accounting
Named and not built. Cost and the ledger belong to the system that owns them, so when it arrives it will read rather than copy. Consonas does not intend to become a second general ledger.
Calendars
Google and Microsoft, both ways. An appointment booked here appears in the calendar your colleagues already watch, and time already blocked there stops a visitor booking over it, so nobody reconciles two diaries by hand.
The connector directory
One list of every connection, each declaring what it is, which way data moves, who built it, what your plan must carry, and whether it exists yet. The product reads the same list this page does, so a planned connector looks planned in both places. It is a directory rather than a shared runtime, and the difference is described below.
API and tokens
A documented interface with tokens you issue and revoke yourself, scoped so a token for one job cannot do every job. Call allowances by plan are on the pricing page.
Failure is visible
A connection that stops working says so, in the product, to someone who can act on it, instead of failing quietly until a number looks wrong three weeks later.
Read rather than copy
The preference throughout is to read a value from where it already lives. Every number kept in two places will disagree eventually, and the disagreement is always discovered at the worst time.
Scoped access
A connection can only reach what it needs. An accounting connection does not get your relationship records, and a token issued for a report cannot write anything.

Two copies of the same fact will disagree. Not might, will, and the discovery is always a customer, an auditor or a year end.

Which is why the preference throughout is to read rather than to copy, and why accounting is someone else's job.

A short list

The list is short, and here is why

What connects today

Mailboxes, calendars, web forms, outbound events, and the public sources. That is the list. It is shorter than the marketplace of any established competitor by a very large margin, and the most asked for connection we have not built, the accounting platforms, is named and still an export.

Why we are not racing to lengthen it

Because a connector is an ongoing commitment instead of a piece of work that finishes. The other system's interface changes. Their authentication moves. Their rate limits tighten. A connector nobody maintains becomes a connector that fails, usually quietly, and a failed integration is worse than an absent one because someone is relying on it.

Ten connections that are maintained are worth more than sixty that mostly work, and a company of our size can maintain ten. Claiming sixty would be a marketing decision rather than an engineering one.

If yours is missing

Tell us, and describe what needs to move between the two systems rather than just naming the product. Whether it is a fortnight or a quarter depends entirely on that, and the requests that describe the actual problem are the ones that get built first, because they are the ones we can size.

What is not built

No accounting connector, which is the most asked for one we have not built. No replay of an outbound delivery that has run out of attempts. No published integration with the automation platforms that connect everything to everything, though the API is usable from any of them. No marketplace, no partner built connectors and no way for anyone outside to submit one, which is a real advantage the incumbents have and one we are not going to pretend away.

Before you connect

Connecting something without creating two versions of the truth

The purpose of every connection here is that a number is read from wherever it already lives rather than kept twice. Everything else follows from that.

Decide which system owns each fact

Before connecting anything. Who owns the customer's address, the invoice total, the appointment? One system owns each, and the other reads it. Two systems that both believe they own a fact will diverge, and they will diverge silently.

In most small organisations the answer is straightforward once it is asked out loud: the accounting system owns money, the calendar owns time, and this owns the relationship.

Connect one thing and leave it a week

Connections are the part of any system most likely to surprise you, because they involve someone else's product changing without warning. One at a time, with a week between, makes the cause of any surprise obvious.

Understand what a revocation does and does not do

Revoking a connection stops anything further. It does not remove what has already been brought across, and it should not: the history is part of your record now.

Expect the list to be short

It is shorter than the established competitors and that is a genuine disadvantage rather than a philosophy. If the system you need is missing, saying so is the fastest way to move it up, because at our size the order is genuinely decided by what people say is stopping them.

On the screen

Four cards here, one on the Inbox screen, and what every row says

Nearly everything that connects lives on a single screen, because it is one kind of decision: something outside is being given a way in, or a way to hear. That screen carries keys, the addresses told when something happens, calendars, and the directory of what Consonas talks to. Your mailbox is the one exception and is connected on the Inbox screen, where the correspondence it brings in arrives. The integrations screen says so, in a line, rather than leaving anyone hunting.

Mailboxes, and only your own, on the Inbox screen

A connected mailbox shows five things: the address, which provider it came through, how many messages have been taken onto records, how many were looked at and left alone, and whether it is connected or has stopped with an error. Two actions sit beside it. Look now, which asks the provider for anything since the last cursor, and disconnect.

The list is scoped to the person asking, always. Colleagues cannot see which of your mailboxes are connected and cannot disconnect one, because a connected mailbox is somebody's own account rather than organisation information. The asymmetry is deliberate and it is worth stating in full: the correspondence that comes out of a mailbox belongs to the organisation, and the account it came through does not.

The two counts are the honest part of that row. A mailbox that has taken forty messages and left eleven hundred alone is behaving exactly as intended, because most of what is in anyone's mailbox is not correspondence with a customer. A screen that showed only what had been taken would be hiding the more interesting number.

Where whoever runs the deployment has not registered an application with Google or Microsoft, the screen says so in those words and offers no button. A button that fails teaches someone that the product is broken. A sentence explaining that this is a step for whoever runs Consonas rather than for them teaches them who to ask.

Keys for other systems

A key row carries what it is for, the role it was issued with, who issued it and when, and the date it was last used or the word never. Never, on a key issued four months ago, is the most useful thing on this screen. It is either a job that quietly stopped running or a credential nobody needs, and both of those are worth knowing.

Issuing one asks two questions. What is it for, which is required, because an unlabelled key is one that nobody dares revoke in two years' time. And which role, where the offered answers are read only and standard, with read only the default. A key carries a role instead of a person, so it can do exactly what somebody with that role could do and nothing beyond it.

The key itself is shown once, on the screen that created it, with a line saying to copy it now. Only a hash of it is kept, so there is no version of this product in which anyone can show it to you again, including us. It begins with a short prefix so that someone who finds one in a log file or a repository can recognise what they are looking at and tell you.

Addresses to tell

The next card is addresses of yours that we post to when something happens. Each row shows the address, which events it asked for, and its state: listening, or the reason it was switched off written out as a sentence rather than as a code. Adding one produces a signing secret, shown once, for the same reason a key is.

Behind each subscription is the delivery log: the recent attempts, with the event, how many attempts have been made, when the next one is due, what status came back and what the error said. That log exists so that the question of why an endpoint is not hearing anything has an answer inside the product instead of being a conversation with support.

What is deliberately not on this screen

A subscription's signing secret is not among the columns the list asks the database for. It is not hidden by the interface, which is a weaker thing: the query that draws this screen cannot return it at all.

Mailbox credentials are held in their own table, and that table is excluded from export by name. An export is a file a customer downloads, and a file containing a live mailbox credential is a breach waiting to be forwarded to someone.

Telling another system

What an address of yours hears from us, and what it never hears

Ten things can be announced. The vocabulary is closed on purpose, and the closing is the part that makes it dependable.

The ten

A contact created. A lead captured, and a lead converted. An appointment booked. A conversation received. A matter raised. A quotation sent, accepted or declined. A page published. That is the whole list today, and it is shorter than the list of things that happen in the product, which is a real limitation rather than an oversight.

Subscribing to an event that is not on the list is refused at the moment you subscribe. The alternative, accepting it and never firing it, produces a subscription that looks like it is working right up until someone notices that it never has, which can be months. A refusal in the second you made the mistake is worth a great deal more than a polite acceptance.

The list is assembled from the modules themselves. Each module declares what it publishes, and this is the union of those declarations, so a module that gains an event gains it here in the same line of code. There is no second list for anyone to forget to update, which is exactly how a vocabulary and an implementation come to disagree.

Queued inside the change, sent afterwards

The delivery is written in the same transaction as the change that caused it. Two properties follow from that, both of which matter more than they sound. Nothing is ever announced that did not end up happening, because a transaction that rolls back takes the announcement with it. And an outbound request can never fail the change: the sending happens later, on a timer, so an endpoint of yours being slow or down cannot stop someone here saving a record.

The internal automation hears about the same events through the same call. That is not an efficiency, it is a guarantee: a workflow running inside the product and your own system outside it cannot come to disagree about what happened, because there is one place where happening is decided.

What actually arrives

A POST with a JSON body carrying the event name, when it occurred and the data. Three headers travel with it: which event this is, an identifier for this particular delivery, and a signature.

The signature covers the timestamp as well as the body. That means an old delivery cannot be captured and replayed at you later, because the timestamp it was signed with will be stale. The timestamp travels outside the body so that your end can reject a stale delivery without parsing anything at all, which is the cheapest possible check and the one most likely to be implemented.

Your end has ten seconds to answer. Anything in the two hundreds is taken as received. Anything else is read as asking us to come back, including the statuses that technically mean something else, because a receiver that is unhappy for any reason is a receiver that should be tried again.

The retry ladder, and where it stops

The delay doubles, starting at a minute and capped at about an hour, for eight attempts. Immediate retries help nobody: the commonest reason a delivery fails is that the other end is restarting, and hammering it while it does so is the least useful thing available.

After eight deliveries in a row are refused, the subscription is switched off and the reason is written on the row. An address that has refused everything for hours is gone rather than busy, and continuing to try costs the organisation attempts nobody is receiving.

Here is the uncomfortable half. That ladder is hours, not days. An endpoint of yours that is down over a long weekend will miss deliveries, and there is no replay: nothing in the product will send them again once they have run out of attempts. The recovery is to read what you missed through the API. Delivery is at least once rather than exactly once, and there is no ordering guarantee, so a receiver that cannot tolerate seeing the same delivery identifier twice will eventually be wrong.

Addresses we refuse to post to

A webhook address is supplied by you and then fetched by us, which makes it a request we make on someone else's instruction. That is the shape of every server side request forgery there has ever been, so the check is a single function rather than a habit spread across call sites.

Encrypted addresses only, because plain traffic would carry your organisation's data and a signature someone could replay across the open network. No credentials in the address, because those end up in logs, ours and yours. Nothing pointing at loopback, the private address ranges, link local or carrier ranges, and no hostname without a dot, because that is a local name and your endpoint is not one. The numeric ranges are checked as numbers rather than by pattern, so the unusual ways of spelling an address do not walk past a regular expression. The platform would refuse most of these anyway, and relying on somewhere else to refuse is how a check disappears the day the somewhere else changes.

When a connection misbehaves

A key in the wrong hands, an endpoint that lies, and a mailbox whose owner has left

Connections spend most of their life in the ordinary case. These are the rest of it.

The person whose mailbox it was has left

Disconnecting removes the mailbox and its stored credentials. The messages already taken stay exactly where they are, on the customer records they concern, because they are the organisation's correspondence and not the mailbox's property. This is the one place where a connection is deliberately not symmetrical: removing the pipe does not remove what came through it, and it should not.

A reply sent from here lands in the sender's own sent folder

It does, every time, and without care it would appear on the record twice. Two identifiers are compared instead of one. The provider's own identifier catches the same message seen twice by the same sync, and the message identifier catches the same message arriving by two different routes. The second of those is the case that actually happens all day.

Something in the mailbox involves no one you hold a record for

It is left alone and counted. A message has to involve someone the organisation already has a record for before any of it comes across, and messages entirely between machine addresses, the noreply and postmaster sort, are left alone as well. Anything older than the window set when the mailbox was connected, thirty days unless somebody chose otherwise, is left alone too. Connecting a mailbox should not drag ten years of correspondence into a record nobody asked to have filled.

Your endpoint answers politely and does nothing

We cannot tell, and neither can anybody else. A status in the two hundreds is the only signal a receiver gives, and a receiver that acknowledges a delivery and then drops it is indistinguishable from one that processed it. The delivery log will show a clean run of successes. This is a genuine limit of the mechanism rather than of this implementation, and the only defence at your end is to record what you received.

A delivery arrives about a record that has since been deleted

The payload is a description of what happened at the moment it happened, not a promise that the record still exists in that state when you read it. Anything that matters should be read back through the API rather than trusted from the body of a delivery that may have been waiting an hour to be accepted.

You are already at your allowance of connected systems

Mailboxes and active subscriptions both count against the same allowance, and the count is made when you add one. Existing connections are not touched when a plan changes; the next one you try to add is refused, and the refusal names the plan that would allow it rather than saying that permission was denied. Those two answers send an administrator to completely different places, and only one of them exists.

A key ends up somewhere it should not

Revoking is immediate and is scoped by organisation as well as by identifier, so nobody can revoke another organisation's key by guessing at one. The prefix on every key exists for this moment: someone scanning a repository or a log can tell what they have found and say so.

The uncomfortable part is the one nobody asks about. A key carries a role, not a person, so it does not stop working when the person who issued it leaves. Removing someone from the organisation is therefore not the whole of removing their access until somebody has also read down the list of keys, which is why the list shows who issued each one and when it was last used.

A company number that was fine last year

Company details are read from Companies House on a schedule and cached, never fetched while somebody waits for a page, because the published rate limit works out at about two requests a second for a whole deployment. So a company that changed status this morning may show yesterday's status this afternoon. A rate limited answer is recorded as its own outcome rather than being treated as a company that does not exist, because those two look identical to careless code and mean opposite things.

Why it works this way

The decisions behind all of this, including the ones we turned down

A key carries a role, not a list of scopes

The obvious design is a scope list on each credential: this one may read contacts, that one may write invoices. It was rejected. A scope list is a second permission model, and a second permission model drifts from the first one, and the drift always ends the same way, with a credential able to do something no person in the organisation could do.

A key issued with a role can do exactly what somebody with that role could do. When the role changes, every key with it changes at the same moment, and there is no second place to remember. The cost is real and worth naming: you cannot issue a key that reads only one kind of record. The smallest thing you can issue is read only across what a read only person sees.

Two roles offered instead of six

The screen offers read only and standard, and read only is what it starts on. Most integrations only read, and almost no one asks for the narrower option when the wider one is preselected. Defaults are the strongest security control a product has, because they apply to everyone who was not thinking about it at the time.

A key shown once, then only a hash

A key is shown at the moment it is created and never again, because only a hash of it is kept. Keeping something in a form we can show you again is the same as keeping something in a form someone else can be shown, and a support process that can retrieve a credential is a support process that can be talked into retrieving one.

A subscription's signing secret is shown once for the same reason, and it is not the same arrangement. Signing every delivery to your address needs the secret itself, so the secret is kept rather than hashed, and saying otherwise would be claiming a protection that is not there. What holds instead is narrower: the query that draws the subscriptions list never asks for that column, and nothing in the product will show it to you a second time. If you lose it, replace the subscription.

The call meter warns and keeps working

Calls are counted, and going past the allowance does not stop anything. An integration cut off in the middle of a month is somebody's business stopping, which is not a proportionate response to a number on a plan comparison. Storage behaves the same way. Contacts do not, and it would be easy to imply they did: that ceiling refuses, as the pricing page says, and the one thing that walks through it is an import, so that bringing your records in never leaves half of them in the old system. The counts of connected systems, pipelines, saved views and custom record types all refuse as well, because each of those is a refusal you receive while you are looking at the screen you made it on.

The count is kept on the same row that records when a key was last used, which is being written anyway, so metering costs nothing extra on the busiest path an integration has. A meter with a table of its own would have doubled the writes for nothing, and writes are the charge that surprises people on this platform.

Announcements queued inside the transaction, sent outside it

The alternative is to send at the moment of the change, which is simpler to write and wrong in both directions: a change that then rolls back has already been announced, and an endpoint that hangs has taken a database transaction with it. One timer serves every pending delivery rather than one each, for the same reason as above.

Bank holiday dates are fetched rather than written down

Hard coding them is the obvious alternative and the wrong one. They are read from the published bank holiday list, because they move, they are announced with months of notice rather than years, and they are not the same in every nation. A service target that counts a bank holiday as a working day is wrong on exactly the days when someone is most likely to be looking.

Tax filing was turned down, and a VAT check built instead

Becoming a recognised filing product was considered and rejected. The accounting platforms are already recognised, already hold the approvals, already handle the fraud prevention requirements and already carry the liability, and the honest answer is to route tax through them. What was built instead is the small piece that is genuinely useful when creating a business customer: confirming that a VAT registration exists and returning the name and address it is registered to.

No marketplace, and what was kept from the idea

A marketplace was described in full before it was declined: a directory, a review process, a security assessment, and clear indication of who built and supports each connector. Building the submission and review machinery before there is anything to submit is effort with no return, and a marketplace with four connectors is a page rather than a marketplace.

One requirement from that description was kept, because it means something at any size: saying who built and supports each connector, and showing the ones that are planned as planned rather than leaving them out. Everything that connects is built and supported by us. There is no way for anyone outside to submit one, and there is no partner to do it.

Permission and plan

Who may connect what, and what each plan actually allows

Three different permissions govern this screen, which surprises people who expect one.

The three permissions

Connecting a mailbox is a permission held by managers, standard users and restricted users, scoped to their own, which is why the list only ever shows your own mailboxes. The read only role does not hold it at all: someone who can see everything and change nothing has no business attaching an account to the organisation.

Managing the addresses we tell is a separate permission, held by owners and administrators. Issuing and revoking keys sits under administering the organisation, held by the same two. The separation is deliberate. Attaching your own mailbox is a personal act, and the worst it can do is limited to one account. Issuing a credential that acts with a role across the whole organisation is not, and the two should not be reachable by the same people simply because they appear on one screen.

What each plan allows

Systems connected: one on the free plan, two on Starter, ten on Standard, and no ceiling above that. Mailboxes and active outbound subscriptions both count against it, because both are a live connection between this and something else, and a ceiling that counted only one of them would be a ceiling somebody could walk around.

The public API begins at Starter. A free organisation cannot issue a key at all, and the refusal names the plan that would allow it. Call allowances are ten thousand a month on Starter, a hundred thousand on Standard, a million on Professional, and negotiated above that, summed across every key the organisation holds.

Connecting a mailbox needs Standard, because it belongs to the shared inbox and email integration. Web forms feeding leads need Standard as well. Companies House details, the VAT check and the bank holiday dates are read by the product itself rather than connected by an organisation, so there is nothing to connect and nothing to buy.

What no plan changes

Every act on this screen is written to the audit trail on every plan, including the free one: a mailbox connected and by whom, a subscription created or removed, a key issued or revoked, and a form submitted by a visitor with the name and address they typed. The audit trail, consent records, subject access tooling, two factor sign in and complete export are on every plan permanently and are never sold as an upgrade.

Consent captured through a web form is recorded with the exact wording the visitor was shown, not as a tick. What was agreed, when, and in what words is the thing that has to be produced if anybody ever asks, and a box with a tick in it cannot produce it.

The part that reads badly and is true

The free plan allows one connected system, counted across mailboxes, calendars and outbound subscriptions together rather than one of each. On Free that one connection can now be a calendar, which is the thing most people wanted it to be. Mailboxes still need Standard, outbound events need the API allowance that starts at Starter, and accounting is still an export rather than a connection. That is an honest description of where the product is rather than a plan design anyone would defend.

The trades that ask about this first

Which system owns which fact is a different question in every trade. Technology asks about product usage, retail services asks about stock, financial services asks which system holds the valuations, because this one does not, and professional services asks about the accounting package the practice already runs. Those pages say what is read and what is kept here.

Asked about connections

Asked about connections

Which systems can I connect to today?

Mailboxes through Gmail and Microsoft Outlook mail, Google and Microsoft calendars both ways, web forms on your own site feeding leads, outbound events posted to an address of yours, and the public sources: Companies House and the published bank holiday dates on a schedule, the VAT registration check when you ask for it. The accounting platforms are named as planned and are not built. The connector directory inside the product shows both states, because finding out that something is missing by looking for a button that does not exist is worse than being told.

Why not more?

Because each connection is an ongoing commitment instead of a one off piece of work. Somebody else's interface changes, their authentication moves, their rate limits tighten, and a connector that is not maintained becomes a connector that fails silently. Ten well maintained connections are worth considerably more than sixty that mostly work.

The one I need is missing. What now?

Tell us, and say what you need to move between the two systems rather than just naming the product. The specific answer determines whether it is a fortnight of work or a quarter, and the requests that describe the actual problem are the ones that get built first.

Is there an API?

Yes, on the paid plans, with tokens you issue and revoke yourself. Tokens are scoped, so one issued for reading a report cannot write records. Call allowances by plan are on the pricing page.

Do you have webhooks?

Yes. You give an address of yours, choose from a closed list of events, and we post to it with a signature you can check. A failed delivery is tried again on a doubling delay from a minute to about an hour, eight times. An address that has refused eight deliveries in a row is switched off, with the reason written on the row rather than left for somebody to work out. There is no replay of a delivery that ran out of attempts, so catching up after a long outage means reading through the API.

Do you support the automation platforms that connect everything to everything?

Not with a published integration today. The API is documented and usable from any of them, which is a partial answer instead of a complete one.

What happens if a connection stops working?

The product says so, in the interface, to someone who can act on it. The value it would have shown is absent instead of showing a stale copy, because a number that is quietly out of date is more dangerous than a number that is visibly missing.

Can a connection see all of our data?

No. Connections are scoped to what they need. An accounting connection does not get your relationship records. This matters because every integration is another party with access, and the honest way to limit that risk is to limit the access rather than to trust the other end.

Tell us which one you need

Describe what needs to move between the two systems rather than just naming the product, and it becomes something we can size.

Three people, a thousand relationships, no card and no time limit.