> For the complete documentation index, see [llms.txt](https://docs.coupler.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.coupler.io/sources/category/project-management/github.md).

# GitHub

Connect GitHub to Coupler.io to export issues, pull requests, commits, workflow runs, and more — setup, data reference, troubleshooting, FAQ.

GitHub hosts Git repositories and the tooling around them: issues, pull requests, code reviews, releases, project boards, and GitHub Actions workflows. Connecting GitHub to Coupler.io pulls that activity into your own spreadsheets, warehouse, or BI tool on a schedule, so you can report on delivery speed, review load, open work, and CI health without exporting from GitHub by hand.

**Why connect GitHub to Coupler.io?**

* Report on issues, pull requests, reviews, and commits across many repositories in one table
* Track engineering metrics such as pull request cycle time, review volume, release cadence, and workflow success rate
* Pull a whole organization at once with a wildcard, instead of adding repositories one by one
* Work with GitHub.com or a self-hosted GitHub Enterprise Server
* Export to AI tools, Google Sheets, Excel, BigQuery, Data Studio, or other supported destinations
* Keep reports current with scheduled refreshes

## Prerequisites

Before you start, make sure you have:

* A GitHub account with read access to the repositories you want to export
* Approval from an organization owner, if the repositories belong to an organization that restricts third-party OAuth apps

{% hint style="info" %}
Coupler.io only reads from GitHub. It requests these scopes: `repo`, `read:org`, `read:repo_hook`, `read:user`, `read:discussion`, and `workflow`. What you can export depends on what your GitHub account can see.
{% endhint %}

## Quick start

{% hint style="success" %}
Start with **Pull requests** or **Issues** for one repository. Both sync incrementally and answer the most common questions about throughput and backlog. Add more repositories, or a whole organization with `org/*`, once the first run looks right.
{% endhint %}

## How to connect

{% stepper %}
{% step %}
**Create a new data flow in Coupler.io.** Search for and select **GitHub** as your source, then click **Connect**.\
Sign in to GitHub and authorize Coupler.io.
{% endstep %}

{% step %}
**Choose a data entity.** Select what to export in **Data entity**, for example **Pull requests**. See [Data overview](#data-overview) for what each one returns.
{% endstep %}

{% step %}
**Enter repositories.** In **Repositories**, enter one repository per line in `org/repo` format. Use `org/*` for every repository in an organization, or a pattern such as `org/api-*`.
{% endstep %}

{% step %}
**Set advanced options.** Optionally set a **Start date**, the **Branches** to read commits from, an **API URL** for GitHub Enterprise Server, and the **Max waiting time** for rate limits.
{% endstep %}

{% step %}
**Choose a destination.** Select where the data should land — Google Sheets, Excel, BigQuery, Data Studio, or an AI destination like ChatGPT, Claude, or Gemini.
{% endstep %}

{% step %}
**Run the data flow.** Click **Run** for a manual sync, then set a schedule so the data refreshes on its own.
{% endstep %}
{% endstepper %}

## Configuration options

### Data entity

| Group                   | Data entities                                                                                                                |
| ----------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| Work tracking           | Issues, Issue comments (`Comments`), Issue events, Issue timeline events, Issue labels, Issue milestones, Assignees          |
| Code and review         | Pull requests, Pull request commits, Pull request stats, Reviews, Review comments, Commits, Commit comments, Branches, Tags  |
| Releases and CI         | Releases, Deployments, Workflows, Workflow runs, Workflow jobs                                                               |
| Reactions               | Issue reactions, Issue comment reactions, Commit comment reactions, Pull request comment reactions                           |
| Repositories and people | Repositories, Organizations, Users, Collaborators, Teams, Team members, Team memberships, Stargazers, Contributor activities |
| Activity                | Events                                                                                                                       |
| Project boards          | Projects v2s, Projects (classic), Project columns, Project cards                                                             |

See [Data overview](#data-overview) to check which fields each data entity returns.

### Repositories

Enter one entry per line:

| Entry       | Meaning                                                        |
| ----------- | -------------------------------------------------------------- |
| `org/repo`  | One repository                                                 |
| `org/*`     | Every repository in the organization that your account can see |
| `org/api-*` | Repositories whose names match the pattern                     |

Each entry must name an existing repository or organization. A single typo can fail the connection check, so verify the names in GitHub.

### Start date

Set **Start date** to export only data on or after that date. If you leave it empty, everything is exported. The field applies to these entities. The date is compared with the field in parentheses:

* Issues, Issue comments, Review comments (`updated_at`)
* Pull requests, Reviews, Projects (classic), Workflows, Workflow runs, Deployments, Commit comments, Issue milestones (`updated_at`)
* Workflow jobs (`completed_at`)
* Commits, Events, Issue events, Releases, and the reaction entities (`created_at`)
* Stargazers (`starred_at`)

The date picker is hidden for entities that always export in full: Assignees, Branches, Collaborators, Issue labels, Organizations, Pull request commits, Pull request stats, Repositories, Tags, Teams, and Users. It also appears for Issue timeline events, Contributor activities, Team members, and Team memberships, but has no effect on them.

Use the date picker first. For a rolling window, you can use date macros such as `{{30daysago}}`. See [Macros in data flows](https://docs.coupler.io/functionality/macros-in-data-flows).

### Branches

By default, **Commits** reads only each repository's default branch. To read other branches, enter them in **Branches**, one per line, in `org/repo/branch` format. Each commit row has a `branch` column.

### API URL

Leave `https://api.github.com/` for GitHub.com. For a self-hosted GitHub Enterprise Server, enter the base URL of your instance. It must start with `https` and be reachable from Coupler.io.

### Max waiting time

GitHub limits API usage, so large exports can pause. **Max waiting time** (1–60 minutes, default 10) sets how long Coupler.io waits for the limit to reset before continuing. See [Rate limits](#rate-limits).

## Data overview

GitHub in Coupler.io is organized as 38 data entities. You pick one per source, list the repositories, and optionally set a start date. Every row carries a `repository` column (or `organization` for organization-level entities), so you can tell repositories apart when you export several.

### Sync behavior

| Behavior                                                                                 | Entities                                                                                                                                                                                                                           |
| ---------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Incremental by update or creation time, so later runs fetch only new and changed records | Issues, Issue comments, Review comments, Commits, Pull requests, Reviews, Releases, Events, Issue events, Workflows, Workflow runs, Workflow jobs, Deployments, Stargazers, Commit comments, Issue milestones, Projects, reactions |
| Re-read in full on every run                                                             | Assignees, Branches, Collaborators, Issue labels, Organizations, Repositories, Tags, Teams, Users, Team members, Team memberships, Contributor activities, Issue timeline events, Pull request commits                             |

Workflow runs can change for up to 32 days after they start, for example when someone re-runs a job. Coupler.io looks back over that window, so recent run statuses are updated.

### Key entities

#### Issues

One row per issue. GitHub returns pull requests in the same list, so rows where `pull_request` is filled are pull requests. Filter them out if you want issues only, or use **Pull requests**.

`repository`, `id`, `number`, `state`, `state_reason`, `title`, `body`, `user`, `labels`, `assignee`, `assignees`, `milestone`, `comments` (count), `created_at`, `updated_at`, `closed_at`, `author_association`, `reactions`, `pull_request`

#### Pull requests

One row per pull request, open and closed.

`repository`, `id`, `number`, `state`, `draft`, `title`, `body`, `user`, `labels`, `assignees`, `requested_reviewers`, `requested_teams`, `head`, `base`, `created_at`, `updated_at`, `closed_at`, `merged_at`, `merge_commit_sha`, `author_association`, `auto_merge`

#### Pull request stats

Size and discussion counts per pull request, so you can measure review effort. This entity re-reads in full on every run.

`repository`, `id`, `number`, `merged`, `merged_by`, `mergeable`, `merge_state_status`, `additions`, `deletions`, `changed_files`, `commits`, `comments`, `review_comments`, `updated_at`

Join it to **Pull requests** on `repository` and `number` for cycle time and size in one table.

#### Reviews and review comments

**Reviews** returns one row per submitted review, with `state` (approved, changes requested, commented), `user`, and `submitted_at`. **Review comments** returns line-level comments on pull request diffs.

#### Commits

One row per commit per branch.

`repository`, `branch`, `sha`, `commit` (message, author, and dates), `author`, `committer`, `parents`, `created_at`

#### Workflow runs and jobs

**Workflows** lists GitHub Actions workflows. **Workflow runs** returns one row per run, and **Workflow jobs** one row per job in a run.

* Runs: `repository`, `id`, `name`, `workflow_id`, `event`, `status`, `conclusion`, `head_branch`, `head_sha`, `run_number`, `run_attempt`, `actor`, `created_at`, `updated_at`, `run_started_at`
* Jobs: `repository`, `id`, `run_id`, `workflow_name`, `name`, `status`, `conclusion`, `steps`, `runner_name`, `created_at`, `started_at`, `completed_at`

#### Releases, tags, and deployments

* **Releases**: `tag_name`, `name`, `draft`, `prerelease`, `created_at`, `published_at`, `author`, `assets`, `body`
* **Tags**: tag name and commit for each repository
* **Deployments**: `environment`, `ref`, `sha`, `creator`, `production_environment`, `created_at`, `updated_at`

#### Repositories and people

* **Repositories**: `full_name`, `private`, `visibility`, `archived`, `default_branch`, `language`, `topics`, `license`, `stargazers_count`, `forks_count`, `open_issues_count`, `size`, `pushed_at`, `created_at`
* **Contributor activities**: commit totals per contributor, with a weekly breakdown of additions, deletions, and commits in `weeks`
* **Stargazers**: who starred a repository and when (`starred_at`)
* **Teams**, **Team members**, **Team memberships**, **Users**, **Collaborators**, **Organizations**: organization structure and access. Teams, Users, and Organizations return data for the organizations that own the repositories you list in **Repositories**

#### Project boards

* **Projects v2s** are the current GitHub Projects (`title`, `number`, `closed`, `public`, `creator`, `created_at`, `updated_at`)
* **Projects (classic)**, **Project columns**, and **Project cards** cover classic boards. GitHub has retired Projects (classic), so expect these to be empty for most repositories. Use **Projects v2s** instead

### Common field combinations

| Goal                              | Data entity        | Fields to use                                                |
| --------------------------------- | ------------------ | ------------------------------------------------------------ |
| Open issue backlog by repository  | Issues             | `repository`, `state`, `created_at`, `labels`                |
| Pull request cycle time           | Pull requests      | `created_at`, `merged_at`, `repository`                      |
| Pull request size and review load | Pull request stats | `additions`, `deletions`, `changed_files`, `review_comments` |
| Who reviews the most              | Reviews            | `user`, `state`, `submitted_at`                              |
| CI success rate                   | Workflow runs      | `name`, `conclusion`, `created_at`                           |
| Release cadence                   | Releases           | `repository`, `tag_name`, `published_at`                     |
| Commit activity by author         | Commits            | `commit` author, `repository`, `created_at`                  |

### Rate limits

GitHub allows an authenticated user 5,000 REST API requests per hour, shared across everything that runs under that account. It also applies secondary limits for bursts. When GitHub reports a limit, Coupler.io waits for the reset time, up to your **Max waiting time**, then continues. Large organizations with many repositories can take a while on the first run. See [GitHub's rate limit docs](https://docs.github.com/en/rest/using-the-rest-api/rate-limits-for-the-rest-api).

## Use cases by role

{% tabs %}
{% tab title="Engineering managers" %}

* Combine Pull requests and Pull request stats to track cycle time and pull request size per team
* Use Reviews to see review load and spot reviewers who are overloaded
* Track the open issue backlog across all repositories of an organization in one sheet
  {% endtab %}

{% tab title="DevOps and platform teams" %}

* Load Workflow runs and Workflow jobs to BigQuery to chart failure rates and job durations
* Use Deployments to count production deploys per week
* Use Releases to track release cadence per service
  {% endtab %}

{% tab title="Product and project managers" %}

* Pull Issues with labels and milestones into Google Sheets for a live status view
* Use Issue milestones to track progress toward a release
* Send issues and pull requests to ChatGPT or Claude for a written weekly summary
  {% endtab %}

{% tab title="Open source maintainers" %}

* Use Stargazers to chart star growth over time
* Use Contributor activities and Commits to see who contributes
* Use Repositories to compare stars, forks, and open issues across projects
  {% endtab %}
  {% endtabs %}

## Common Issues

### Connection issues

<details>

<summary>Repository or organization "is unknown" or "couldn't be found"</summary>

Check the following:

* **The name has a typo.** Use the exact `org/repo` format and check capitalization against GitHub.
* **Your account can't see the repository.** Private repositories need access for the account you connected.
* **The organization blocks third-party OAuth apps.** Ask an organization owner to approve Coupler.io under the organization's OAuth app policy, then reconnect.
* **The organization name is wrong in `org/*`.** An unknown organization fails the whole connection check.

</details>

<details>

<summary>"No streams available" error</summary>

None of the repositories or organizations you entered could be read. Check the names and your permissions. Coupler.io needs the `repo`, `read:org`, `read:repo_hook`, `read:user`, `read:discussion`, and `workflow` scopes. Reconnect and approve all of them.

</details>

<details>

<summary>I can't connect to GitHub Enterprise Server</summary>

Enter the base URL of your instance in **API URL**. It must start with `https`, since plain `http` isn't allowed. Make sure the instance is reachable from outside your network.

</details>

### Missing data

<details>

<summary>A repository or organization's data is missing</summary>

* Confirm it appears in **Repositories**. A repository outside your list is never exported.
* With `org/*`, only repositories your account can see are included.
* Empty repositories return no commits or branches. This is expected.

</details>

<details>

<summary>Issues include pull requests, or Pull requests are missing from Issues</summary>

GitHub returns pull requests in its issue list. Rows with `pull_request` filled are pull requests. Filter on that column, or use the **Pull requests** entity.

</details>

<details>

<summary>Commits from other branches are missing</summary>

By default only the default branch is read. Add `org/repo/branch` entries in **Branches** to read others.

</details>

<details>

<summary>Contributor activities is empty for a repository</summary>

GitHub computes contributor statistics in the background and may answer "not ready yet". Coupler.io retries several times, then skips that repository for the run. Run the data flow again a few minutes later. Very large repositories may still return no statistics.

</details>

## FAQ

<details>

<summary>How do I connect GitHub to Coupler.io?</summary>

Select GitHub as a source, click **Connect**, and authorize Coupler.io in GitHub. You don't need to create or paste a personal access token.

</details>

<details>

<summary>Can I pull more than one GitHub repository in a single source?</summary>

Yes. Enter several `org/repo` lines in **Repositories**, or use `org/*` for an entire organization. Each row has a `repository` column.

</details>

<details>

<summary>Can I get more than one GitHub data entity in a single table?</summary>

Not from one source, since each source returns one entity. Add each entity as a separate source in the same data flow and load each to its own table or sheet. To combine entities, for example Pull requests and Pull request stats, join them in the data sets step on `repository` and `number`. There is no need for separate data flows.

</details>

<details>

<summary>Does GitHub data refresh incrementally?</summary>

Most activity entities, such as Issues, Pull requests, and Commits, sync incrementally, so later runs fetch only new and changed records. Reference entities, such as Repositories, Branches, and Teams, are re-read in full. See [Sync behavior](#sync-behavior).

</details>

<details>

<summary>Can I connect GitHub Enterprise Server?</summary>

Yes. Enter your instance's base URL in **API URL**. It must use `https`.

</details>

<details>

<summary>Can I export GitHub Discussions, code, or file contents?</summary>

Not currently. The source covers the entities listed in [Data entities](#data-entity). To request more, post on [feedback.coupler.io](https://feedback.coupler.io).

</details>

<details>

<summary>How do I calculate pull request cycle time from GitHub data?</summary>

Use the **Pull requests** entity. Cycle time is `merged_at` minus `created_at`. Add it as a formula column in the data sets step, and average it by `repository` or by month. Filter out rows where `merged_at` is empty, since those pull requests weren't merged.

</details>

<details>

<summary>Does Coupler.io change anything in my GitHub repositories?</summary>

No. The connection is read-only. Coupler.io exports GitHub data and doesn't create, edit, or delete issues, pull requests, or code.

</details>

<details>

<summary>Can I send GitHub data to an AI tool?</summary>

Yes. Coupler.io supports AI destinations including ChatGPT, Claude, Gemini, Cursor, Perplexity, and OpenClaw, so you can route issues, pull requests, or workflow runs into one for summaries or analysis.

</details>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.coupler.io/sources/category/project-management/github.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
