Docs
Overview
Git Paywall has a GitHub App (https://github.com/apps/git-paywall) that requests access to 2 things: the names and high level details of repos you own*, and the ability to manage invitations to those repos. no request is made to access your code.
these permissions must be granted on a per-organization basis, thus when you first install you will only see personal repos. inside the Paywall form is a link to connect more GitHub organizations. your GitHub repos may be private or public.
in addition to the GitHub app, we have a Stripe Connect integration. this allows us to collect (optional) payments on your behalf. simply log into an existing Stripe account during setup and you'll have a full revenue dashboard. our fee for this revenue collection is 10%.
*since we can't 'invite' someone to a repo you don't own, non-owned repos are excluded from our import.
Webhooks
after earning an email address or payment for your work, it's likely you'll want to know about it.
visit the Customers tab, then click "Configure Webhooks" to add as many webhooks as you'd like, on a per-Paywall basis.
the payload includes the customer's email, git handle, payment amount (if applicable), created timestamp, paywall ID, and paywall "type."
you may test this webhook with sample data from the Configure Webhooks form.
Customer Webhooks
to programmatically generate repository invitations, first grab your "webhook_token" from the Paywalls tab of your Git Paywall dashboard.
POST a body containing "git_handle" (required) and "email" attribute (optional) to this URL:
https://gitpaywall.com/api/:webhook_token/customers
the response will contain a customer's details as verification of successful creation:
{"customer"=> {"created_at"=>2025-07-01T05:23:39+00:00, "email"=>"[email protected]", "paywall_id"=>55, "git_handle"=>"dev-hacker", "charge_amount_in_cents"=>nil, "type"=>"email"}}
if the Paywall isn't found for your provided token, the response will look like this:
{"status"=>"400", "message"=>"Paywall with this token not found"}
Permissions
an unfortunate limitation of GitHub's API is that only organization-owned repositories can specify a permission (source) via collaborator invitation API requests.
there are a few ways to mitigate this issue besides sharing "push" access to strangers on the internet ;).
- use our Webhooks feature to be notified when someone is shared on your personal repository, then manually change their Role to "Read" from Github's "/settings/access" tab.
- move your repository to a new (free) GitHub organization, for example "jimbob" (personal) => "JimBobProjects" and hook it up from there
- enable Branch Protection inside GitHub to prevent any pushes to master by new collaborators
Share
Git Paywall provides simple infrastructure to help you start earning email addresses or revenue from useful source code. the only missing ingredient is web traffic.
here are a few things you can do to get attention for your projects:
- re-push an existing public repository to "/{repo_name}_private", then remove Git history from the existing repo and update the README to point to your Paywall lander.
- write a blog post about each of your projects, demo-ing the functionality, then make a "get this code" button with a link to your lander
- announce that you are opening a project up to "push" collaborators, then charge a fee for this permission (keeping the code OSS)
we'll continue updating this list as more success stories are reported.
Miscellaneous Tips
after creating a Paywall, you'll notice that we generate a GitHub-lookalike landing page (email capture, payment capture).
since our GitHub App permissions are intentionally limited for your privavcy, some fields such as recent collaborators and the latest commit message are unavailable to us when the repository is Private.
if you'd like to populate your Paywall's landing page with more attributes + an open graph image (example) to entice visitors, we suggest making the repository public for just a few seconds before clickign "Create Paywall." this kicks off our enrichment job, which will fetch all those details within seconds. then you can re-privatize your repository.