A customer reports a bug. Support writes a ticket, then pastes a GitHub link into a note and hopes. Three weeks later the customer asks for an update, the rep pings an engineer on Slack, the engineer looks it up, and the answer - "shipped last Tuesday" - was sitting in GitHub the whole time.

The information flow between support and engineering is one of the oldest unsolved problems in SaaS operations, and the tooling hasn't helped much:

  • HubSpot's native Jira integration writes a small set of read-only Jira fields onto a ticket. You can't edit them, the sync can lag by hours, and because the issue never becomes a real object, there are no issue lists, no associations, and no issue-level reporting - and it's Jira, not GitHub.
  • Generic sync platforms map issues onto objects you already have - a task, a deal, a ticket. Capable tools, but there's no dedicated issue object, no engineering-shaped properties like repository or PR state, and no UI built for the support-to-engineering handoff.
  • Zapier and Make will happily copy fields one way per zap - and leave the two-way problem, including the infamous infinite update loop, entirely to you.

So we built what we actually wanted: Resonate Issues - GitHub Issues synced two-way into HubSpot as a first-class Issue object. It's live at github.resonatehq.com.

An Issue object, not fields on a ticket

On install, the app provisions a native Issue object in your portal. It appears next to Contacts, Deals, and Tickets with its own index page - and because it's a real object, everything HubSpot does with objects just works: filtered views, lists, workflows, reports, and associations.

Resonate IssuesAdd resonate issues
All records+
Search ( / )TitleRepository (synced path)Status Category
TitleRepository (synced path)Status CategoryURLObject create date/timeOwner
Checkout 500 for EU Visa cardsacme/webappIn progressgithub.com/acme/webapp/is…Today at 9:14 AMNo owner
SSO session expires after 15 minacme/webappOpengithub.com/acme/webapp/is…Yesterday at 4:51 PMNo owner
Feature: bulk export to S3acme/api-serverOpengithub.com/acme/api-serve…Aug 4, 2026 3:56 PMNo owner
Add retry to payment webhookacme/api-serverDonegithub.com/acme/api-serve…Aug 1, 2026 11:02 AMNo owner
Dark mode for customer portalacme/webappCanceledgithub.com/acme/webapp/is…Jul 28, 2026 2:19 PMNo owner
5 resonate issues‹ Prev1Next ›
The Issue object's index page in HubSpot — filter, search, and report like any native object

Each Issue carries the engineering context the CRM never had: repository, status (normalized to Open / In progress / Done / Canceled across trackers), labels, assignees, milestone, comment count, a direct link to the source - and the related pull request with its state, so support can see "PR merged" without asking anyone.

Issues associate with Tickets, Deals, Companies, Contacts, and Projects. That last part is what unlocks the reporting RevOps has been faking with spreadsheets: open bugs per customer, revenue waiting on engineering work, time from escalation to fix.

One click from ticket to GitHub

The Issues card sits on every Ticket record. Here it is - it's an interactive mock, so go ahead and click Create issue:

Issues
2 linked issues
IssueStatusRepositoryPRActions
Checkout 500 for EU Visa cards
acme/webapp#214
In progressacme/webappPR openPreviewUnlink
Add retry to payment webhook
acme/api-server#188
Doneacme/api-serverMergedPreviewUnlink
Powered by Resonate Issues|⚙ Settings
Interactive mock — click Create issue

The panel prefills the title, description, and priority from the ticket. Pick a repository and create: the Issue record appears instantly, associated to the ticket, and shows Syncing to GitHub… - a few seconds later it flips to a live GitHub issue with its number and link. That's the real behavior, not marketing latency: sync is webhook-driven in both directions, with no scheduled polling.

Prefer to attach work that already exists? Link existing searches your portal's Issues by title or key. And Unlink removes only the association - it never deletes the Issue or the GitHub issue.

Projects get a repository and a board

HubSpot Projects get their own card: link a repository to the project, and manage its issues - list or board - without leaving the record:

GitHub Issues
Repositoryacme/webapp
4 Project issues
This board is read-only. Columns follow the Issue status synchronized with the connected tracker.
Open2
SSO session expires after 15 min
acme/webapp#197
Dark mode for customer portal
acme/webapp#183
In progress1
Checkout 500 for EU Visa cards
acme/webapp#214
Done1
Fix flaky payment E2E test
acme/webapp#171
Canceled0
No issues
Powered by Resonate Issues|⚙ Settings
Interactive mock — click Create issue, or switch to the Board tab

The board is read-only by design: columns follow the issue status synchronized with the connected tracker, so what you see on the project is what engineering actually has in flight.

What syncs, exactly

Two-way sync earns trust by being precise about directions, so here is the honest map:

  • Both directions - title, description, status (including the reopened / not-planned reason), labels, and assignees. Edit on either side; the other follows in seconds.
  • GitHub → HubSpot - related PR and its state, comment count, author, milestone, repository and issue number, and source timestamps. Engineering facts stay engineering-owned.
  • Comments - new GitHub comments become notes on the Issue record automatically. The reverse - posting HubSpot notes to GitHub - is an account-level toggle that ships off, because notes often hold private customer context. Comment mirroring is create-only: edits and deletes never propagate.

And the part that makes two-way sync safe to turn on: every write is fingerprinted and origin-tagged. When your own change echoes back through a webhook, the engine recognizes the fingerprint and drops it at the boundary. Changes converge in one hop, in either direction - the infinite loop that haunts DIY two-way sync is structurally impossible.

Automate on issue status

Because Issues are records, they enroll in workflows like anything else. The one every support team builds first - close the loop when the fix ships:

Trigger enrollment for issues
When this happens
Group 1
Status Category is any of Done any number of times anytime
+
1. Edit record

Set Ticket status to Fix shipped on associated tickets

+
2. Send internal email notification

Notify the ticket owner - time to tell the customer

+
End

An engineer closes an issue in GitHub. Seconds later the record flips to Done, the associated ticket moves, and the owner gets a nudge to deliver good news. Nobody checked a dashboard; nobody asked in Slack.

Works without GitHub, too

The Issue object is usable standalone: connect HubSpot, skip GitHub, and you have native issue tracking inside your CRM - with the same cards, associations, and workflows. Connect a tracker later and sync picks up from there. The object is provider-neutral by design, which is also how Jira and Linear will arrive: behind the same Issue object, no migration.

Set it up in four steps

  1. Connect GitHub at github.resonatehq.com - a per-repository GitHub App, so you grant exactly the repos you want and nothing else. (Optional - skip for standalone mode.)
  2. Choose repositories to sync, and a default repo for issues created from HubSpot.
  3. Connect HubSpot with one OAuth click - the Issue object and its properties are provisioned automatically.
  4. Import history: recent issues (last 30 days), everything, or start clean. Sync is two-way from that moment on.

One admin step inside HubSpot: cards aren't added to record views automatically. Open a Ticket record → Customize record → middle column → Add cards → add Issues. Once per portal.

The honest limits

GitHub is the only tracker today - Jira and Linear are the roadmap, not the present. Comment mirroring is create-only in both directions. Fields like PR state, milestone, and comment count are deliberately one-way from GitHub, because engineering facts should have one source of truth. And organization-owned repos need a one-time approval from a GitHub org owner. If any of this changes, this post will be updated.

Put engineering work inside your CRM - connect your first repo at github.resonatehq.com, or read more on the Resonate Issues app page.

Related reading

Frequently asked questions

What is the best way to integrate GitHub with HubSpot?+
Resonate Issues syncs GitHub Issues into HubSpot as a first-class Issue CRM object with two-way, webhook-driven sync. Unlike field-level integrations that write read-only values onto tickets, a real object gets lists, workflows, reports, and associations to Tickets, Deals, Companies, Contacts, and Projects.
Does HubSpot have a native GitHub integration?+
Not for issue tracking. HubSpot's built-in tracker integration covers Jira with a small set of read-only fields on tickets. Resonate Issues is built GitHub-first: a dedicated Issue object, two-way sync, and cards on Ticket and Project records.
Is the sync really two-way?+
Yes, for the fields both sides own: title, description, status and status reason, labels, and assignees. Engineering-owned facts - PR state, comment count, author, milestone, timestamps - flow one way from GitHub so they always reflect the source of truth.
How fast is the sync?+
Both directions are webhook-driven, so changes typically land in seconds. There is no scheduled polling and no overnight batch.
How do you prevent infinite sync loops?+
Every write carries a content fingerprint and an origin tag. When a change echoes back through a webhook, the fingerprint matches and the echo is dropped at the boundary - so any change converges in at most one hop in each direction.
Can support create a GitHub issue without leaving HubSpot?+
Yes. The Issues card on a Ticket record has a Create issue button that prefills title, description, and priority from the ticket, associates the new Issue to the ticket, and pushes it to the selected repository within seconds. Link existing and Unlink flows are included.
Do engineers need HubSpot seats?+
No. Engineering keeps triaging, labeling, and closing in GitHub, and HubSpot mirrors it automatically. Only people working inside HubSpot need seats.
Which repositories can the app access?+
Only the ones you grant. Access uses a per-repository GitHub App - you select repos explicitly during install and can change or revoke the grant in GitHub at any time. Organization repos require a one-time approval by an org owner.
Does it work without GitHub?+
Yes. Standalone mode gives you the Issue object, cards, associations, and workflows with no tracker connected - useful on its own, and sync can be added later without migration.
What about Jira and Linear?+
They're planned next, behind the same provider-neutral Issue object - source, external key, and normalized status fields are already shared. GitHub is the supported tracker today.