Indie Dev Workflow

GitHub Issues or Email? Choosing Where Support Lives

GitHub Issues work well for public, reproducible bugs. Email works well for private, account-specific help. Here's how to split support between the two without losing track of anything.

SupportMe••8 min read

The short answer: Most small teams use both. GitHub Issues work best for public, reproducible problems with the product itself, like bugs, feature requests and documentation gaps. Email works best for anything private or about a specific person: billing, account access, personal data, contracts and security reports. The hard part isn't choosing one. It's making the routing obvious so customers pick the right channel the first time.

Below is a practical way to make that split, using GitHub's own features to point people to the right place.

What each channel is actually built for

GitHub Issues: shared, trackable work

GitHub describes Issues as a way to "plan, discuss, and track work." It notes they can track "bug reports, new features and ideas, and anything else you need to write down or discuss with your team" (GitHub Docs: About issues). Issues come with labels, issue types, milestones, sub-issues and dependencies. A pull request that uses a keyword like fixes can close the linked issue automatically.

That makes Issues a good fit when:

  • The problem affects more than one user
  • Other users can benefit from seeing the answer, or from adding "me too, here's my setup"
  • The fix will end up in code, so you want the conversation tied to the commit

One fact sets the boundary: in a public repository, issues are visible to anyone on the internet (GitHub Docs: Repository visibility). Whatever a user pastes there, whether logs, emails, API keys or invoice numbers, is public unless you edit or remove it.

Email: private, one-to-one conversations

Email has no public audience, no required account and no learning curve. Many B2B customers, especially non-technical buyers and admins, don't have a GitHub account. Even when they do, they won't use it to ask why their card was charged twice.

Email is the better fit when:

  • The question involves an account, payment or personal data
  • The customer isn't a developer
  • The conversation needs a careful, individual tone (for example, an upset customer or a cancellation)
  • You may need to move to a call later (see when to escalate from email to a call)

The tradeoff is that email is invisible to everyone else. Ten customers can report the same bug, and you'll answer it ten times.

A simple routing rule

This is a recommendation, not a standard. One question settles most cases: would this be safe and useful to publish?

SituationBetter homeWhy
Reproducible bug in the app, SDK or CLIGitHub IssuesPublic, shared, tied to code
Feature requestGitHub Issues (or Discussions)Others can upvote and add context
"How do I…?" usage questionGitHub Discussions or docsAnswer helps future users
Login, billing, refunds, account changesEmailContains private data
Data deletion or privacy requestEmailPersonal data, possible legal obligations
Security vulnerabilityPrivate vulnerability reporting or a security emailMust not be disclosed publicly
Enterprise or contract questionsEmailConfidential terms

Account issues are a good example of why email matters. A login problem almost always needs an email address or account ID, which shouldn't appear in a public thread.

Use GitHub's features to route people automatically

GitHub has built-in tools that send people to the right channel before they open an issue.

1. Add contact links to your issue template chooser

Put a config.yml file in .github/ISSUE_TEMPLATE. Set blank_issues_enabled: false to steer people toward your templates, and use contact_links to "direct people to external sites" (GitHub Docs: Configuring issue templates). Each link has a name, url and about.

A minimal example:


blank_issues_enabled: false
contact_links:
  - name: Billing or account help
    url: mailto:support@example.com
    about: Questions about payments, logins, or your account. Please don't post these publicly.
  - name: Questions and ideas
    url: https://github.com/your-org/your-repo/discussions
    about: Ask how to do something or suggest a feature.

According to the same docs, when blank issues are disabled, contributors with Read or Triage roles see only your configured templates. Maintainers still get a blank option.

2. Use issue forms to collect what you need

Issue forms let you require fields like version, OS and steps to reproduce. You can use text fields, dropdowns, checkboxes and file uploads. GitHub notes that issue forms are "currently in public preview and subject to change," so check the docs before relying on specific behavior.

You can also add a checkbox such as "I have removed API keys and personal data from this report." It won't stop every leak, but it reminds people at the right moment.

3. Add a SUPPORT.md file

A SUPPORT.md file in your repo's root, docs or .github folder tells people how to get help. GitHub links to it when someone creates an issue (GitHub Docs: Adding support resources). Keep it short: what goes in Issues, what goes to email and roughly how fast you reply.

4. Send usage questions to Discussions

GitHub positions Discussions as a place to "ask and answer questions, share information, make announcements" (GitHub Docs: About discussions). You can mark answers, and you can convert open-ended issues into discussions. That keeps your issue tracker focused on actionable work.

5. Keep security reports private

For public repositories, you can turn on private vulnerability reporting. GitHub describes it as a way for "anyone [to] report security vulnerabilities directly and privately to the maintainers" (GitHub Docs: Privately reporting a security vulnerability). It has to be enabled per repository. If you don't enable it, publish a security contact in a SECURITY.md file so nobody posts exploit details in a public issue.

Handling items that land in the wrong place

Misrouted messages will still happen. A few habits help:

  • Private data in a public issue: Edit or remove the sensitive content quickly. Then ask the user to email you the details. Remember that GitHub keeps edit history on comments, so for real secrets like API keys, tell the user to rotate them.
  • A bug report by email: Reply to the customer, then open an issue yourself without their personal details. Send them the link if they're comfortable following it publicly.
  • The same email question again and again: That usually means you need a doc page, an FAQ entry or a pinned Discussion.

A hypothetical example

This scenario is illustrative, not a real case. A customer opens a GitHub issue titled "Charged twice this month" and pastes the last four digits of their card and their account email. The maintainer edits the issue to remove the personal details and replies: "Thanks for flagging this. Billing needs your account details, so I've removed them here to keep them private. Could you email support@ so I can look into it right away?" Then the maintainer closes the issue with a link to the billing contact. The customer gets help, and the public thread no longer exposes their data.

Tone counts in that handoff. A redirect can read as a brush-off. For tips on staying warm while setting a boundary, see how to de-escalate support emails in your own voice.

Keeping two channels from doubling your workload

Running both channels is only worth it if neither one gets neglected. Some practical guardrails:

  • Set one response-time expectation per channel and state it in SUPPORT.md. A slower, honest promise beats a fast one you can't keep.
  • Use saved replies for common GitHub responses, like "please share your version and steps to reproduce." GitHub supports saved replies on issues and pull requests.
  • Link the two sides. When an email traces back to a known bug, note the issue number in your reply and add a label like reported-via-email on the issue. That shows you how many customers a bug affects.
  • Review both weekly. Look for recurring email questions that should become docs, and stale issues that need a reply or a close.

Email is usually the channel that takes the most writing time, because each reply is one-to-one. Tools can help there. SupportMe, for example, connects to an email inbox, drafts replies in your writing style and never sends anything without your approval. It works with email and app store reviews, not GitHub Issues, so your issue tracker stays a separate workflow. Whatever you use, the basics still apply. These common support reply mistakes show up in both channels.

Conclusion

GitHub Issues and email do different jobs. Issues are for public, reproducible work that others can see and benefit from. Email is for anything private, personal or financial. Make the split visible with issue template contact links, a SUPPORT.md file, Discussions for questions and private vulnerability reporting for security. When something lands in the wrong place, move it politely and protect the customer's data first.

References

Tags

GitHub Issues vs email supportdeveloper support channelsindie developer customer supportGitHub issue templatesSUPPORT.mdprivate vulnerability reportingSaaS support workflow

Related posts