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.
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?
| Situation | Better home | Why |
|---|---|---|
| Reproducible bug in the app, SDK or CLI | GitHub Issues | Public, shared, tied to code |
| Feature request | GitHub Issues (or Discussions) | Others can upvote and add context |
| "How do I…?" usage question | GitHub Discussions or docs | Answer helps future users |
| Login, billing, refunds, account changes | Contains private data | |
| Data deletion or privacy request | Personal data, possible legal obligations | |
| Security vulnerability | Private vulnerability reporting or a security email | Must not be disclosed publicly |
| Enterprise or contract questions | Confidential 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-emailon 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
- GitHub Docs: About issues
- GitHub Docs: Configuring issue templates for your repository
- GitHub Docs: Adding support resources to your project
- GitHub Docs: About discussions
- GitHub Docs: Privately reporting a security vulnerability
- GitHub Docs: About repositories (visibility)
- GitHub Docs: About saved replies
Tags
Related posts
Indie Dev Workflow
When to Pause Feature Work for a Support Spike
A practical guide for indie developers and small SaaS teams on when a surge in support tickets means you should stop building features, and when to keep shipping.
9 min read
Indie Dev Workflow
How to Measure How Much Build Time Support Costs You
A practical method for solo developers and small SaaS teams to measure how much time customer support really takes, including interruptions and lost focus, and turn it into usable numbers.
8 min read
Indie Dev Workflow
A Support Workflow for Notifying Customers When Fixes Ship
A practical workflow for small teams to track who reported a bug, confirm the fix is live, and notify every affected customer by email or app store review reply.
9 min read