How to have a lightning address with your own domain that also runs a website

The objective: Allowing addresses at your domain to recieve lightning payments via BTCPayServer

LUD-16 is a specification for how to allow lightning addresses (like email addresses) to recieve bitcoin lightning payments.

In short: This specification allows to send a lightning payment to an easily remembarable lightning address like Usually those identifiers are only provided by custodial lightning wallets (like WalletOfSatoshi), but if you run a BTCPayServer instance, you can use your own domain and aliases.

If you don’t run a BTCPayServer yet, you can easily install it on a sufficiently sized VPS.

The problem: Your website runs at the domain you want to use for lightning addresses

Usually you run your BTCPayServer on a subdomain (or even a completely different domain), so the lightning addresses look something like This is still neat, but not ideal, since your email addresses are most likely associated to the apex domain (in my case:

You can have your BTCPayServer run at your apex domain, but usually you want your website to run there.

The solution: Configure nginx to be a proxy to BTCPayServer for the LUD-16 requests

If nginx serves your website, you’re in luck: LUD-16 uses requests to a special subdirectory (`/.well-known/lnurlp/) to request lightning invoices for aliases. Since this subdirectory is not needed by your website, you can easily achieve your goal by configuring nginx to be a reverse proxy to your BTCPayServer instance for requests with that path.

Simply add the following lines within the server block for the desired domain:

location /.well-known/lnurlp/ {

These three lines configure nginx to behave as a proxy to for all requests to URLs on your domain that start with /.well-known/lnurlp/ (so the answer nginx sends will originate from your BTCPayServer).

…make sure to replace with whatever your BTCPayServer domain is (otherwise the requests will end up at my server).