Universal Redirect is a lightweight and efficient server designed to redirect incoming requests to platform-specific URLs. Perfect for directing users to the App Store or Play Store based on their device platform. Additionally, you can append custom metadata to the link and retrieve it in your app.
- Deploy the server on your hosting platform.
- Create a link using the following format:
https://your-host.com?meta=your-meta. - Redirect users to this link.
- Retrieve the metadata in your app using a GET request to
https://your-host.com/meta.
- The user clicks the link.
- The server reads the user agent to determine the user's platform and caches the client's IP.
- The server redirects the user to the appropriate platform-specific URL.
- Metadata is saved to the Redis cache.
- The app retrieves the metadata from the Redis cache.
- Redis server
- Default redirect URL
git clone https://github.com/ftp27/go-universal-redirect.git
cd go-universal-redirectdocker build -t universal-redirect .docker compose up -ddokku apps:create universal-redirectdokku redis:create universal-redirect
dokku redis:link universal-redirect universal-redirectRequired:
dokku config:set universal-redirect LINK_DEFAULT=https://example.comOptional (InfluxDB):
dokku config:set universal-redirect INFLUX_TOKEN=... INFLUX_HOST=... INFLUX_DATABASE=...Optional (Platform-Specific Links):
dokku config:set universal-redirect LINK_APPSTORE=https://apps.apple.com LINK_GOOGLEPLAY=https://play.google.comdokku ports:add universal-redirect http:80:8080 https:443:8080dokku domains:set universal-redirect example.comdokku letsencrypt:enable universal-redirecttar cvf certs.tar server.crt server.key
dokku certs:add universal-redirect < certs.targit remote add dokku ... # Add the Dokku remote
git push dokku mainCustomize the server by setting the following environment variables:
REDIS_URL- URL of the Redis server (required)LINK_DEFAULT- Default redirect URL (required)LINK_APPSTORE- App Store redirect URL (optional)LINK_GOOGLEPLAY- Play Store redirect URL (optional)PORT- Server port (default: 8080)
For InfluxDB analytics, configure the following variables:
INFLUX_TOKEN- InfluxDB token (optional)INFLUX_HOST- InfluxDB host (optional)INFLUX_DATABASE- InfluxDB database (optional)
Universal Redirect supports InfluxDB for analytics. It sends each click and install event to the link measurement, along with platform and type information (click or install). Here are some example queries:
- Total Clicks By Day:
SELECT
DATE_BIN(INTERVAL '1 day', time, '1970-01-01T00:00:00Z'::TIMESTAMP) AS day,
SUM(value) as value
FROM "link"
WHERE time >= now() - INTERVAL '30 day' AND type = 'click'
GROUP BY dayfrom(bucket: "<bucket_name>")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|> filter(fn: (r) => r["_measurement"] == "link")
|> filter(fn: (r) => r["type"] == "click")
|> group(columns: [])
|> aggregateWindow(every: 1d, fn: sum, createEmpty: false)
|> yield(name: "sum")
- Total Clicks by Platform:
SELECT
SUM("value") AS "total_value",
platform
FROM "link"
WHERE time >= now() - INTERVAL '30 day' AND type = 'click'
GROUP BY platformfrom(bucket: "<bucket_name>")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|> filter(fn: (r) => r["_measurement"] == "link")
|> filter(fn: (r) => r["_field"] == "value")
|> group(columns: ["platform"])
|> aggregateWindow(every: 1d, fn: sum, createEmpty: false)
|> yield(name: "sum")
