IntegrationsCRM / PSA

HaloPSA

Cotillion's HaloPSA integration syncs Opportunities, the lines of their current quotation, Customers, Sites, Users (contacts) and the Actions on each opportunity (its notes) from your HaloPSA instance into a single, standardised deal record. Once synced, the deals appear in your Cotillion workspace where you can register them against vendor portals (AWS Partner Central, Microsoft Partner Center, …) with a single action. For your Trust Profile it also reads your projects and the SLA results of your tickets.

Your business data is read-only to us. Cotillion never creates, edits or deletes an opportunity, customer, site, user, quotation or action. There is exactly one thing it writes, and it writes it about itself: a Webhook registration, which is how HaloPSA notifies Cotillion when a record changes instead of Cotillion re-reading everything on a timer. Cotillion creates those webhooks pointing at its own endpoint, and deletes them again when you disconnect the integration. See Step 3.

Before you begin: you'll create a dedicated API agent in HaloPSA and an API application that signs in as that agent. The whole setup takes about 10 minutes.

At a glance

ItemValue
AuthenticationOAuth 2.0 client credentials – your Halo tenant name + Client ID + Client Secret
API surfaceHaloPSA REST API (https://<your-tenant>.halopsa.com/api)
DirectionRead-only on your data; creates and removes its own Webhooks
CredentialsAWS KMS-encrypted at rest, never logged
HostingHaloPSA cloud (*.halopsa.com); the address is built from your tenant name for you

Setup

Step 1: Create a read-only role

The application in Step 3 signs in as an agent, and HaloPSA only ever shows the application what that agent's role allows. A dedicated role keeps the integration scoped to exactly the data it reads. Anything not listed below stays Not set.

In HaloPSA, open Configuration → Teams & Agents → Roles and click New.

  1. Details tab – Role Name: Cotillion Read-only.
  2. Departments & Teams tab – Membership level to all Departments: View all (Can view all Tickets in all Departments). Opportunities are tickets in HaloPSA, so this is what lets the integration see every deal, without the right to change one.
  3. Permissions tab:
    • General Permissions – Is a HaloPSA Administrator: No.
    • Feature Access – Read Only on each area Cotillion reads:
      • Tickets Access Level – the opportunities and their actions (the notes on each deal), and your projects and service tickets for the Trust Profile: in HaloPSA a project is a ticket too.
      • Sales Access Level – the opportunity pipeline and its stages.
      • Customers Access Level – customers and their sites.
      • Users Access Level – the contacts at each customer and on each deal.
      • Quotations Access Level – the quotations on each opportunity and their lines.
      • Products Access Level – the items your quotation lines sell.
    • Tickets Permissions – Can view Unassigned Tickets: Yes; Can view Tickets that are assigned to other Agents: Yes.
    • Type Restrictions – Allow use of all Ticket Types: Yes.
    • Client Restrictions – Allow use of all Customers: Yes. A customer the role cannot see is a customer whose deals Cotillion cannot sync.
    • Billing Permissions – Can View Item Costs, Can View Item Prices and Can View Product SKU: Read Only. These are the cost, price and vendor SKU of each line, which a vendor registration carries.
  4. Save.

Step 2: Create an API agent

  1. Open Configuration → Teams & Agents → Agents and click New.
  2. Set Username to Cotillion API and tick Is an API-only Agent. An API-only agent takes up no licence and cannot sign in to the web or mobile app, so leave Email Address empty.
  3. Roles: Cotillion Read-only (Step 1), and no other role – an agent takes the highest permission of all its roles.
  4. Default Team: None. The field is required, but what the agent sees comes from the role, not from a team.
  5. Save.

Step 3: Create the API application

  1. Open Configuration → Integrations → HaloPSA API → View Applications and click New.
  2. Fill in the Details tab:
    • Application Name: Cotillion
    • Active: ticked
    • Authentication Method: Client ID and Secret (Services)
    • Login Type: Agent
    • Agent to log in as: Cotillion API (the agent from Step 2)
  3. On the Permissions tab, tick exactly these, and nothing else (leave all, all:standard and all:teams unticked – they grant more than the integration reads):
    • read:sales – the opportunities: stage, status, value, probability, dates, owner and custom fields; and their actions, the notes on each deal.
    • read:customers – customers, their sites, and the contacts at each customer and on each deal.
    • read:quotes – the quotations on each opportunity and their lines.
    • read:tickets – your projects and service tickets, which the Trust Profile reports as delivered projects and SLA results.
  4. Webhooks: the one grant that is not read. Also tick admin:webhooks. This is how HaloPSA tells Cotillion that an opportunity was created, changed status or closed: Cotillion registers a signed webhook pointing at its own endpoint, limited to your opportunity ticket types, and removes it again when you disconnect. It registers nothing that points anywhere other than Cotillion. With this permission withheld the integration still works (every change is then found by the normal 5-minute sync instead of being announced).
  5. Leave the Security tab as it is: Cotillion calls HaloPSA from its servers, not from a browser.
  6. Save, then copy the Client ID and the Client Secret.

Keep these values handy: HaloPSA shows the Client Secret only once. If you lose it, generate a new secret on the application and reconnect.

Why read-only on your data. Our integration never creates, edits or deletes an opportunity, customer, user, quotation or action. Granting edit access goes beyond what is required. The Webhooks grant in item 4 is the single exception, and it only lets the application manage notification registrations addressed to Cotillion.

Step 4: Find your tenant name

Your tenant name is the first part of the address you use to open HaloPSA: for https://acme.halopsa.com it is acme. That is the only part of the address Cotillion asks for; it builds the API and sign-in addresses from it.

Self-hosted HaloPSA is not supported. The integration connects to HaloPSA cloud (*.halopsa.com); a HaloPSA instance on your own server or your own domain cannot be connected.

Step 5: Connect in Cotillion

  1. Sign in to your Cotillion workspace at cotillion.indyrct.com.
  2. Open CRM / PSA in the sidebar → Connect → HaloPSA.
  3. Enter your tenant name, Client ID and Client Secret from the steps above.
  4. Click Test & Connect.

What happens automatically:

  • ✅ Cotillion builds your HaloPSA address and its sign-in address from your tenant name.
  • ✅ Verifies the credentials against the HaloPSA REST API.
  • ✅ Encrypts them with an AWS KMS envelope before storing.
  • ✅ Starts a one-time backfill sync, then schedules recurring updates.

Step 6 (optional): Exclude individual opportunities from the sync

Some opportunities should never appear in Cotillion: internal-only forecasts, experiments, or deals you don't want surfaced for vendor registration. You can opt them out with a custom field on the opportunity.

In HaloPSA:

  1. Open Configuration → Custom Objects → Custom Fields and click New.
  2. Fill in the field:
    • Field Name – CotillionExcludeFromSync (HaloPSA adds CF in front).
    • Field Label – Cotillion Exclude From Sync (must match exactly: Cotillion looks for this label).
    • Type of Field – Checkbox.
  3. Save.
  4. Open Configuration → Sales → Ticket Types. Every type listed there is a kind of opportunity (a new instance has Lead, Opportunity and Quick Quote). Open each one and go to its Field List tab. Click Add under the list, keep Add Fields selected, pick Cotillion Exclude From Sync in Fields to add, click Add, then Save. Save the type as well, so the field shows on every opportunity.
  5. Tick it on any opportunity you want hidden.

On the next sync (within ~5 minutes), Cotillion skips that opportunity entirely.

Do not rename this label later. Cotillion matches the field by its exact label, so a rename stops the exclusion, and the opportunity would start syncing again on the next pass.

Reversible. Un-tick the field to re-include the opportunity on the next sync. Cotillion does not delete previously-synced deal data when you flip the flag on: it stops refreshing it, and flipping it off brings the data back up to date.

How the sync works

CadenceWhat
Opportunity eventsAnnounced by webhook, when the Webhooks grant is in place: a new opportunity, a status change or a close is announced and Cotillion syncs straight away, without waiting for the scheduled sync. Other edits arrive with the scheduled sync.
Reference data refreshPeriodically: Cotillion refreshes your agents, used to resolve opportunity owners and note authors to their names.
Opportunity syncEvery 5 minutes per organisation: opportunities + the lines of their current quotation + customers + users + actions.

The integration stays within HaloPSA's API fair-use limit: each sync is rate-limited per HaloPSA instance, with backoff on throttling, and outbound traffic is logged in our operational dashboards for audit.

Which opportunities Cotillion keeps

Cotillion keeps the opportunities you could register with a vendor, and the ones it is already tracking. In practice:

  • Open opportunities are synced and appear in Deals.
  • An opportunity that closes while Cotillion is tracking it stays. That is exactly when the outcome has to reach the vendor, when the vendor's verdict comes back, and when a won deal becomes eligible for an incentive. It moves out of the "requires action" view and stays under the registered deals.
  • Opportunities that were already closed before Cotillion saw them are not kept. Editing an old closed opportunity in HaloPSA does not pull it in either. Your closed deal history stays in HaloPSA.

What gets synced and how it stays stable

Each sync turns every opportunity into the deal you see under Deals in Cotillion: its customer, contacts, quotation lines and notes, with stages and owners resolved to the names you use in HaloPSA.

  • Line items are the lines of the opportunity's current quotation – the one saved last, whose total HaloPSA shows as the opportunity's value. An older quotation's lines are not added on top.
  • Notes are the actions on the opportunity. Notes kept on a customer record (CRM notes) are not read: HaloPSA opens them only to an application granted every permission, which Cotillion does not ask for.

Two guarantees Cotillion holds across syncs:

  • Customer and contact identity are stable. When you rename a customer in HaloPSA, Cotillion picks up the new name on the next sync, but the same customer keeps the same internal identity: every opportunity that pointed to it before still points to it after. The same applies to contacts.
  • Disconnect-then-reconnect is non-destructive. If you remove the HaloPSA integration in Cotillion and add it back within 30 days, your existing opportunities re-attach to the new connection without losing their vendor-registration history or per-line-item state.

Audit trail

Cotillion keeps an immutable record of every payload submitted to a vendor. The record captures exactly what was sent at submission time, independent of subsequent edits in HaloPSA or Cotillion.

Reference

HaloPSA's official help if your UI differs from the steps above:

Troubleshooting

Authentication fails on Test & Connect

First, check the tenant name: it is only the first part of your HaloPSA address (acme, not acme.halopsa.com or the full URL). If it is right, the Client ID or Client Secret was mistyped, or the application's Authentication Method is not Client ID and Secret (Services). Generate a new secret on the application (the old one cannot be shown again) and reconnect.

Some opportunities or customers are missing

HaloPSA shows the application only what the agent from Step 2 can see. Check that the Cotillion API agent's role can view every customer and every opportunity, then wait for the next sync (within ~5 minutes).

Deals have no line items

The read:quotes permission is missing from the application, or the opportunity has no quotation yet. The deal still comes through, but without the lines a vendor registration needs.

A new, re-statused or closed opportunity takes up to 5 minutes to appear

Those three are announced by webhook and appear straight away; when one waits for the scheduled sync instead, the webhook registration did not succeed. Check that the application has the Webhooks permission (Step 3, item 4). Other edits always arrive with the scheduled sync, within ~5 minutes. Nothing is lost either way; the sync picks up every change on its next pass.

Rate limit reached

HaloPSA returned a 429 (rate-limited) response. Cotillion automatically backs off and retries; no action required.

An opportunity is missing from Cotillion

Check the opportunity's Cotillion Exclude From Sync custom field: if it's ticked, the opportunity is intentionally hidden (see Step 6). Un-tick it to bring it back on the next sync (within ~5 minutes).


For Cotillion-side issues, email support@indyrct.com.

On this page