How can we help?
Search our knowledge base or browse categories below.
Getting Started
Set up your account and get going
Profile & Account
Manage your profile and settings
Links
Add, manage, and style your links
Appearance
Themes, colors, and backgrounds
Store & Products
Sell digital products
Payments
Checkout, orders, and payouts
Analytics
Track views, clicks, and shares
Plans & Billing
Free vs Pro plans
Webhooks
Developer integrations
FAQ
Common questions answered
Table of Contents
Getting Started
Creating Your Account
You can sign up for AstroLink in two ways:
- Email & Password -- Enter your email, choose a username (3+ characters, letters, numbers, underscores, and hyphens), and set a password.
- Google Sign-In -- Click "Sign in with Google" to create your account instantly. A username will be generated from your Google profile.
After signing up, you'll receive a welcome email and be taken to your dashboard.
Your Profile URL
Every AstroLink user gets a public profile at:
https://app.astrolink.io/u/your-username
This is the link you share everywhere -- your social media bios, email signatures, business cards, and more. Anyone who visits this URL will see your profile, links, and store (if enabled).
Getting Started Checklist
When you first sign up, here's what we recommend:
- Set your display name and bio -- Tell visitors who you are
- Upload a profile photo -- Add a face to your page
- Add your social links -- Connect your Instagram, Twitter, YouTube, etc.
- Add your first links -- Share your most important URLs
- Pick a theme -- Customise your page's look and feel
- Share your profile URL -- Add it to your social media bios
Your Profile
Display Name & Bio
Your display name and bio are the first things visitors see on your profile.
- Display Name -- Your name as shown on your profile (doesn't need to match your username)
- Bio -- A short description about yourself (up to 600 characters)
Edit both from Dashboard > Profile > Details.
Profile Photo
Upload a profile photo to personalise your page.
- Supported formats: JPEG, PNG, WebP
- Images are automatically compressed and resized to 400x400px for optimal loading
- Your photo appears on your public profile and in the dashboard
To upload or change your photo, go to Dashboard > Profile > Details and click on your avatar.
Username
Your username determines your profile URL (app.astrolink.io/u/your-username).
Username rules:
- Minimum 3 characters
- Letters, numbers, underscores, and hyphens only
- Must be unique (the app checks availability in real-time)
- Can be changed at any time from Dashboard > Settings > Account
Changing your username immediately updates your profile URL. Your old URL will stop working, so update it wherever you've shared it.
Profile Visibility Options
Control what shows on your public profile:
| Option | Description |
|---|---|
| Show Profile Image | Toggle your avatar on/off |
| Show Bio | Toggle your bio on/off |
| Show Social Links | Toggle the social links section on/off |
These are managed from your profile appearance settings.
Links
Links are the core of your AstroLink profile. Each link is a clickable button that takes visitors to a URL you choose.
Adding Links
- Go to Dashboard > Links
- Click Add Link
- Enter:
- Title -- The button text visitors see (e.g., "My Portfolio")
- URL -- Where the link goes (e.g., "https://mysite.com")
- Description -- Optional extra text shown in some layouts
- Save
Your link is now live on your profile.
Managing Links
- Reorder links -- Drag and drop to rearrange the order links appear on your profile
- Activate / Deactivate -- Toggle a link on or off without deleting it. Inactive links are hidden from your public profile.
- Edit -- Update the title, URL, or description at any time
- Delete -- Permanently remove a link
- Filter -- View All, Active only, or Inactive only links in your dashboard
- Click tracking -- Each link tracks how many times it's been clicked
Link Limits
| Plan | Active Link Limit |
|---|---|
| Free | 5 active links |
| Pro | Unlimited |
You can create as many links as you want, but on the Free plan only 5 can be active at once. If you downgrade from Pro to Free, links beyond the 5-link limit are automatically deactivated (not deleted) -- you can reactivate them if you upgrade again.
Link Layouts
Choose how your links are displayed on your profile. Link layouts change the visual arrangement:
| Layout | Description |
|---|---|
| Classic | Full-width stacked buttons (default) |
| Cards | 2-column card grid with thumbnails |
| Spotlight | One featured link prominently displayed, with the rest in a compact list |
| Bento | Mixed-size grid layout |
| Minimal | Ultra-clean text-only links |
Layout options:
- Show Thumbnails -- Display link thumbnails in card/bento layouts
- Show Descriptions -- Show link descriptions below titles
- Featured Link -- Choose which link is featured in Spotlight layout
Appearance & Themes
Customise how your profile looks to visitors. All appearance settings are in Dashboard > Profile > Appearance.
Theme Modes
Choose your base theme:
| Mode | Description |
|---|---|
| Default | Light background with clean styling |
| Dark | Dark background with light text |
| Gradient | Background with a color gradient between two colors you choose |
Colors & Gradients
- Background Color -- Set a solid background color (hex color picker)
- Text Color -- Choose your text color (with contrast checking to ensure readability)
- Gradient From / To -- When using gradient mode, pick the start and end colors for your background gradient
Button Styles
Choose the shape of your link buttons:
| Style | Description |
|---|---|
| Rounded | Softly rounded corners |
| Square | Sharp, straight corners |
| Pill | Fully rounded, capsule-shaped buttons |
Background Images
Upload a custom background image for your profile (Pro feature).
- Supported formats: JPEG, PNG, WebP
- Images are automatically compressed and resized (max 1920x1080px, quality 85%)
- You can also select from previously uploaded images in your media library
Video Embeds
Add a video to the top of your profile (Pro feature).
- Supports YouTube and Vimeo URLs
- Thumbnails are auto-generated from the video platform
- Toggle video visibility on/off with the Show Video setting
Hide Branding
Pro users can hide the "Powered by AstroLink" branding from their public profile for a completely white-labelled experience.
Theme Marketplace
Browse and apply pre-designed themes created for the AstroLink community. The theme marketplace is available to Pro users.
Browsing Themes
- Go to Dashboard > Themes
- Browse available themes -- each shows a preview of colors and style
- Filter by tags: Neon, Gradient, Dark, Minimal, Luxury, Tech, Launch-ready, and more
- Click a theme to see full details (name, tagline, description, preview colors)
- Click Add to Library to save it, or Apply to use it immediately
Example themes:
- Nova Pulse -- Neon purples to orange, pill buttons, gradient mode
- Carbon Luxe -- Matte black with champagne accents, dark mode
- Solar Flare -- Sunset gradients (amber to orange to red), pill buttons
- Aqua Fusion -- Teal spectrum (cyan to teal), rounded buttons
- Midnight Sonar -- Deep navy with indigo accents, square buttons
- Obsidian Circuit -- Black with purple neon, pill buttons
- Velvet Eclipse -- Purple to gold, rounded buttons
- Pacific Orbit -- Sky blues, pill buttons
Theme Bundles
Theme bundles are curated collections of multiple themes grouped by style. Add an entire bundle to your library at once instead of adding themes one by one.
Your Theme Library
Themes you add are saved to your personal library. Switch between saved themes at any time without losing your collection. Your currently active theme is tracked separately, so you can experiment freely.
Visitor Messages
Let visitors leave messages directly on your profile -- like a built-in contact form. This feature is available on Pro plans.
Enabling Messages
- Go to Dashboard > Profile > Messages
- Toggle Enable Messages on
- Customise your form (see below)
- Save
When enabled, a message form appears at the bottom of your public profile.
Customising the Message Form
| Setting | Description |
|---|---|
| Headline | The heading above the form (default: "Leave a message") |
| Description | Optional text below the headline explaining what the form is for |
| Message Placeholder | Placeholder text inside the message box (default: "Write your message here...") |
| Consent Text | Optional text for a consent checkbox (e.g., "I agree to be contacted"). If set, visitors must check the box before sending. |
Message Fields
Configure which fields appear on your message form. Each field can be toggled on/off and set as required or optional.
| Field | Type | Default |
|---|---|---|
| Name | Text | Enabled, optional |
| Enabled, required | ||
| Social handle / website | URL | Disabled, optional |
| Custom field | Custom | Disabled, optional |
Each field has a configurable label and placeholder. You can also add additional custom fields with your own labels.
Limits:
- Message body: 600 characters max
- Field values: 200 characters max
Managing Your Inbox
Go to Dashboard > Messages to see all visitor messages.
- Messages arrive with the visitor's name, email, and any other fields you configured
- Mark as read -- Track which messages you've reviewed
- Archive -- Move messages out of your main inbox
- Messages include metadata like submission time
Rate Limiting
To prevent spam, visitor messages are rate-limited to 5 messages per IP address per 15 minutes. If a visitor exceeds this limit, they'll see a friendly message asking them to try again later.
Analytics
Track how your profile and links are performing. Analytics are visible from your dashboard.
Profile Views
Every time someone visits your public profile page, it's counted as a view. You can see:
- Total views -- All-time profile view count
- Last viewed -- When your profile was most recently viewed
Link Clicks
Every time a visitor clicks one of your links, it's tracked:
- Per-link clicks -- See how many clicks each individual link has received
- Total clicks -- All-time click count across all links
- Last clicked -- When a link was most recently clicked
Plans & Billing
Free Plan
Price: £0/month
Includes:
- Public profile page
- Up to 5 active links
- Social links
- Theme colors and gradients
- Profile photo and bio
- Basic link analytics
Pro Plan
Price: £5/month or £49/year (save with annual billing)
Everything in Free, plus:
- Unlimited links
- Video embeds
- Background images
- Hide AstroLink branding
- Visitor message inbox
- Pro theme marketplace
- Store access (upon approval)
- Priority support
Managing Your Subscription
- Upgrade -- Go to Dashboard > Settings > Subscription and click Upgrade to Pro
- Billing portal -- Click Manage Billing to open the Stripe customer portal where you can update payment methods, view invoices, or cancel
- Plan status -- See your current plan, billing period, and next renewal date from the subscription settings page
Subscription statuses:
| Status | Description |
|---|---|
| Active | Your subscription is current and active |
| Cancelled | You've cancelled but can still use Pro features until the end of your billing period |
| Past Due | A payment failed -- update your payment method to keep your Pro features |
| Expired | Your subscription has ended |
What Happens When You Downgrade
If you cancel your Pro plan or it expires:
- Your profile remains live and accessible
- Links beyond the 5-link limit are automatically deactivated (not deleted)
- Pro-only features (video embeds, background images, visitor messages, theme marketplace, branding removal) become unavailable
- Store access is paused
- If you re-subscribe, everything is restored -- your deactivated links come back, and your store picks up where you left off
Your Store
Sell digital products directly from your AstroLink profile. The store is available to Pro plan users with approved store access.
Requesting Store Access
- Go to Dashboard > Settings > Store
- Click Request Store Access
- Our team will review and approve your request (usually within 24 hours)
- Once approved, you'll see the full store dashboard
Connecting Stripe
AstroLink uses Stripe Connect to process payments securely. Your buyers pay through Stripe, and funds are deposited directly into your bank account.
To connect your Stripe account:
- Go to Dashboard > Settings > Store
- Click Connect Stripe Account
- You'll be redirected to Stripe to complete identity verification and banking setup
- Once verification is complete, your account status will show as Active
You can check your Stripe account status at any time. You'll see indicators for:
- Charges enabled -- You can accept payments
- Payouts enabled -- Stripe can send money to your bank
- Onboarding complete -- All verification steps are done
If any of these are not enabled, click the link to complete your Stripe setup.
Creating Products
- Go to Dashboard > Store > Products
- Click New Product
- Fill in the product details:
- Title -- The name of your product
- Description -- What buyers will see
- Price -- Set in your chosen currency (USD, EUR, or GBP)
- Accent Color -- Customise the product card appearance with a color or gradient
- Category -- Optional tags to organise your products
- Click Save to create the product as a draft
Product management features:
- Search products by name
- Filter by status (All / Live / Draft)
- Sort by creation date, name, or price
- View sales metrics (total sales, net revenue) per product
Digital Products & File Uploads
Sell digital files (PDFs, ZIPs, images, videos, etc.) directly through AstroLink. When a buyer completes their purchase, they get instant access to download the file.
To attach a digital file to a product:
- Edit your product
- In the Digital File section, click Upload File or select from your file library
- Choose your file (max 100 MB per file)
- Save the product
Managing your file library:
- Go to Dashboard > Store > Files to see all your uploaded digital files
- Upload new files, view file details (name, size, type), or remove files
- Files can be reused across multiple products
Supported file types: Any file type is supported -- PDF, ZIP, MP4, PNG, PSD, and more.
Product Status (Draft vs Live)
Products have two statuses:
- Draft -- Only visible to you in the dashboard. Not shown on your public storefront.
- Live -- Visible to everyone on your storefront and available for purchase.
Toggle between draft and live at any time from the product list. This is useful for preparing products before launch or temporarily hiding a product without deleting it.
Product Images
Each product can have a cover image displayed on your storefront.
- Upload an image from the product editor
- Add alt text for accessibility
- Images are displayed on your storefront product cards and product detail views
Categories
Organise your products with categories:
- Add one or more category tags to each product
- Buyers can filter your storefront by category
- Categories are free-form text -- use whatever makes sense for your store
Checkout & Payments
How Checkout Works
When a buyer clicks Buy on your storefront:
- They're taken to a secure Stripe Checkout page
- They enter their payment details (card, Apple Pay, Google Pay, etc.)
- If you've set up custom checkout fields, they fill those in too
- Payment is processed through your connected Stripe account
- They're redirected to a thank-you page with order details
- If the product is digital, they get immediate download access
- Both you and the buyer receive email confirmations
- If you have webhooks configured, a webhook is sent to your endpoint
The entire payment flow is handled by Stripe -- AstroLink never sees or stores card details.
Custom Checkout Fields
Collect additional information from buyers at checkout (e.g., licence name, Discord username, preferred format, special instructions).
To set up custom checkout fields:
- Go to Dashboard > Settings > Store
- Under Checkout Fields, add your custom fields
- For each field, configure:
- Label -- The field name buyers see (e.g., "License Name")
- Placeholder -- Helper text (e.g., "Enter the name for your licence")
- Required -- Whether the field must be filled in
Custom field responses are included in:
- Your order details in the dashboard
- Your seller notification email
- Webhook payloads (in the
checkoutFieldsarray)
Custom Thank-You Message
Personalise the post-purchase experience:
- Go to Dashboard > Settings > Store
- Under Thank-You Message, enter your custom message
- This message is displayed on the thank-you page after a successful purchase
Use this to thank buyers, provide instructions, share community links, or set expectations for delivery.
Currencies
AstroLink supports three currencies:
- USD (US Dollar)
- EUR (Euro)
- GBP (British Pound)
Set your default currency in store settings. All products in a single checkout must use the same currency.
Fees & Pricing
AstroLink charges a 5% platform fee on each sale. This fee is automatically deducted from the payment before funds reach your Stripe account.
Example:
- You sell a product for £20.00
- Platform fee (5%): £1.00
- Stripe processing fee: ~£0.88 (varies by payment method and region)
- You receive: ~£18.12
The platform fee is non-refundable even if you issue a refund to the buyer.
Orders
Viewing Orders
Go to Dashboard > Store > Orders to see all your orders. Each order shows:
- Order ID
- Product purchased
- Buyer email
- Amount (gross, fees, and net)
- Status
- Date
Order Statuses
| Status | Description |
|---|---|
| Pending | Checkout session created, awaiting payment |
| Succeeded | Payment completed successfully |
| Failed | Payment was declined or failed |
| Expired | Checkout session expired before payment |
| Refunded | You issued a refund for this order |
| Disputed | Buyer filed a chargeback with their bank |
Refunding an Order
You can refund any order with a succeeded status:
- Go to Dashboard > Store > Orders
- Find the order and click Refund
- Confirm the refund
Important notes about refunds:
- The buyer receives a full refund of the purchase amount
- The 5% platform fee is not refunded to you
- Stripe's processing fees may or may not be returned depending on your Stripe settings
- Refund details are recorded in the order history
Digital Downloads
How Downloads Work for Buyers
After a successful purchase of a digital product:
- The buyer is redirected to the thank-you page
- A Download button appears for each digital file in their order
- Clicking the button generates a secure, time-limited download link
- The file downloads directly to their device
Buyers can return to the thank-you page using the link in their receipt email to download again (within limits).
Download Limits
To prevent abuse, digital downloads have these limits:
| Limit | Value |
|---|---|
| Max downloads per file | 5 |
| Download link expiry | 7 days after purchase |
Once a buyer has reached 5 downloads or 7 days have passed, they will no longer be able to download the file. If a buyer needs additional access, they will need to contact you directly.
Payouts
Viewing Your Balance
Go to Dashboard > Store to see your current Stripe balance, including:
- Available balance -- Funds ready to be paid out
- Pending balance -- Funds from recent sales (typically takes 2-7 business days to become available)
Balances are shown per currency if you've sold in multiple currencies.
How Payouts Work
Payouts are handled entirely by Stripe:
- Stripe automatically transfers your available balance to your connected bank account
- Payout frequency depends on your Stripe settings (daily, weekly, or monthly)
- You can manage payout settings directly in your Stripe Dashboard
- Payout statuses (paid, failed, cancelled) are synced back to your AstroLink dashboard
Webhooks
What Are Webhooks?
Webhooks let you receive real-time notifications when events happen in your store. When an order is placed, refunded, or disputed, AstroLink sends an HTTP POST request to your specified URL with details about the event.
This is useful for:
- Custom fulfilment -- Trigger your own delivery system when an order succeeds
- CRM integration -- Add buyers to your email list or CRM
- Inventory management -- Update stock counts in external systems
- Analytics -- Track sales in your own dashboards
- Automation -- Trigger Zapier, Make, n8n, or custom workflows
Setting Up Webhooks
- Go to Dashboard > Settings > Store
- Under Webhooks, enter your Webhook URL (must be HTTPS)
- Set a Webhook Secret -- a random string used to verify that webhooks are genuinely from AstroLink
- Select which events you want to receive
- Save your settings
Generating a webhook secret:
Use any random string generator, or run this in your terminal:
openssl rand -hex 32
Keep your webhook secret safe -- treat it like a password.
Webhook Events
| Event | Trigger |
|---|---|
store.order.succeeded |
A buyer completed payment successfully |
store.order.failed |
A payment attempt failed |
store.order.expired |
A checkout session expired without payment |
store.order.disputed |
A buyer filed a chargeback |
store.order.refunded |
You refunded an order |
store.webhook.test |
You clicked "Send Test Webhook" in settings |
Select only the events you need. Most integrations only need store.order.succeeded.
Webhook Payload
Every webhook sends a JSON POST request with this structure:
{
"id": "store.order.ord_abc123",
"type": "store.order.succeeded",
"createdAt": "2025-01-15T10:30:00.000Z",
"data": {
"order": {
"id": "ord_abc123",
"userId": "user_xyz",
"productId": "prod_456",
"buyerEmail": "buyer@example.com",
"quantity": 1,
"grossCents": 2000,
"applicationFeeCents": 100,
"stripeFeeCents": 88,
"netCreatorCents": 1812,
"currency": "usd",
"status": "succeeded",
"checkoutSessionId": "cs_xxx",
"chargeId": "ch_xxx",
"paymentIntentId": "pi_xxx",
"createdAt": "2025-01-15T10:30:00.000Z"
},
"product": {
"id": "prod_456",
"title": "My Awesome E-Book",
"description": "A comprehensive guide to...",
"priceCents": 2000,
"currency": "usd",
"isDigital": true,
"category": ["ebooks", "guides"]
},
"store": {
"userId": "user_xyz",
"username": "yourstore"
},
"checkoutFields": [
{
"label": "License Name",
"value": "John Doe"
}
],
"lineItems": [
{
"productId": "prod_456",
"title": "My Awesome E-Book",
"quantity": 1,
"unitPriceCents": 2000
}
]
}
}
Key fields explained:
| Field | Description |
|---|---|
id |
Unique webhook delivery ID |
type |
The event type (e.g., store.order.succeeded) |
createdAt |
ISO 8601 timestamp of the event |
data.order |
Full order details including amounts and status |
data.product |
The product that was purchased |
data.store |
Your store/profile information |
data.checkoutFields |
Buyer responses to your custom checkout fields |
data.lineItems |
Itemised list of products in the order |
Amount fields are in the smallest currency unit (e.g., 2000 = £20.00). Divide by 100 to get the full amount.
Verifying Webhook Signatures
Every webhook request includes signature headers so you can verify it genuinely came from AstroLink (and not a malicious third party).
Headers included with every webhook:
| Header | Description |
|---|---|
X-Astrolink-Webhook-Event |
The event type (e.g., store.order.succeeded) |
X-Astrolink-Webhook-Timestamp |
Unix timestamp (milliseconds) when the webhook was sent |
X-Astrolink-Webhook-Signature |
The HMAC-SHA256 signature |
Signature format:
t=1705312200000,v1=5a4b3c2d1e...
How to verify:
- Extract the timestamp (
t) and signature (v1) from theX-Astrolink-Webhook-Signatureheader - Construct the signed payload:
{timestamp}.{raw_json_body} - Compute HMAC-SHA256 using your webhook secret as the key
- Compare your computed signature with
v1from the header - Always check that the timestamp is recent (within 5 minutes) to prevent replay attacks
Testing Webhooks
Before going live, test your webhook integration:
- Go to Dashboard > Settings > Store
- Make sure your webhook URL and secret are configured
- Click Send Test Webhook
- AstroLink sends a
store.webhook.testevent to your URL - Check your endpoint received and processed the webhook correctly
Tips for testing:
- Use a service like webhook.site or RequestBin to inspect webhook payloads during development
- Use ngrok to expose your local development server to receive webhooks
- Check your server logs for any errors processing the webhook
Webhook Best Practices
- Always verify signatures -- Never trust a webhook without verifying the HMAC signature
- Respond quickly -- Return a
200status code within 5 seconds. Do heavy processing asynchronously. - Handle duplicates -- Use the webhook
idfield to deduplicate. The same event may be sent more than once. - Use HTTPS -- Your webhook URL must use HTTPS for security
- Store the raw body -- Parse the JSON body only after signature verification to avoid tampering
- Monitor failures -- Webhook delivery status is tracked in your order metadata so you can see if deliveries failed
Example: Node.js Webhook Handler
const express = require("express");
const crypto = require("crypto");
const app = express();
// IMPORTANT: Use raw body for signature verification
app.post(
"/webhooks/astrolink",
express.raw({ type: "application/json" }),
(req, res) => {
const secret = process.env.ASTROLINK_WEBHOOK_SECRET;
// 1. Extract signature components
const signature = req.headers["x-astrolink-webhook-signature"];
const timestamp = req.headers["x-astrolink-webhook-timestamp"];
const event = req.headers["x-astrolink-webhook-event"];
if (!signature || !timestamp) {
return res.status(400).send("Missing signature headers");
}
// 2. Parse the signature header
const parts = {};
signature.split(",").forEach((part) => {
const [key, value] = part.split("=");
parts[key] = value;
});
// 3. Verify timestamp is recent (within 5 minutes)
const now = Date.now();
if (Math.abs(now - parseInt(parts.t)) > 5 * 60 * 1000) {
return res.status(400).send("Webhook timestamp too old");
}
// 4. Compute expected signature
const body = req.body.toString();
const signedPayload = `${parts.t}.${body}`;
const expectedSignature = crypto
.createHmac("sha256", secret)
.update(signedPayload)
.digest("hex");
// 5. Compare signatures
if (
!crypto.timingSafeEqual(
Buffer.from(parts.v1),
Buffer.from(expectedSignature)
)
) {
return res.status(400).send("Invalid signature");
}
// 6. Signature verified! Process the webhook
const payload = JSON.parse(body);
console.log(`Received event: ${payload.type}`);
switch (payload.type) {
case "store.order.succeeded":
const { order, product, checkoutFields } = payload.data;
console.log(
`New order: ${order.id} for ${product.title} from ${order.buyerEmail}`
);
console.log(`Amount: $${(order.grossCents / 100).toFixed(2)}`);
// Your fulfilment logic here:
// - Send to your CRM
// - Trigger email sequence
// - Update inventory
// - Grant access to a course
break;
case "store.order.refunded":
console.log(`Order refunded: ${payload.data.order.id}`);
// Revoke access, update records, etc.
break;
case "store.order.disputed":
console.log(`Dispute on order: ${payload.data.order.id}`);
// Alert your team, gather evidence, etc.
break;
case "store.webhook.test":
console.log("Test webhook received successfully!");
break;
}
// 7. Always respond with 200
res.status(200).json({ received: true });
}
);
app.listen(3000, () => {
console.log("Webhook server running on port 3000");
});
Example: Python Webhook Handler
import os
import hmac
import hashlib
import json
import time
from flask import Flask, request, jsonify
app = Flask(__name__)
# Never hardcode your secret -- always use environment variables
WEBHOOK_SECRET = os.environ["ASTROLINK_WEBHOOK_SECRET"]
def verify_signature(payload_body, signature_header, timestamp_header):
"""Verify the webhook signature from AstroLink."""
if not signature_header or not timestamp_header:
return False
# Parse signature header: t=123,v1=abc...
parts = {}
for part in signature_header.split(","):
key, value = part.split("=", 1)
parts[key] = value
# Check timestamp is within 5 minutes
ts = int(parts.get("t", 0))
if abs(time.time() * 1000 - ts) > 5 * 60 * 1000:
return False
# Compute expected signature
signed_payload = f"{parts['t']}.{payload_body}"
expected = hmac.new(
WEBHOOK_SECRET.encode(),
signed_payload.encode(),
hashlib.sha256,
).hexdigest()
# Constant-time comparison
return hmac.compare_digest(parts.get("v1", ""), expected)
@app.route("/webhooks/astrolink", methods=["POST"])
def handle_webhook():
body = request.get_data(as_text=True)
# Verify signature
if not verify_signature(
body,
request.headers.get("X-Astrolink-Webhook-Signature"),
request.headers.get("X-Astrolink-Webhook-Timestamp"),
):
return jsonify({"error": "Invalid signature"}), 400
# Parse and process
payload = json.loads(body)
event_type = payload["type"]
if event_type == "store.order.succeeded":
order = payload["data"]["order"]
product = payload["data"]["product"]
checkout_fields = payload["data"].get("checkoutFields", [])
print(f"New order: {order['id']}")
print(f"Product: {product['title']}")
print(f"Buyer: {order['buyerEmail']}")
print(f"Amount: ${order['grossCents'] / 100:.2f}")
# Your fulfilment logic here
for field in checkout_fields:
print(f" {field['label']}: {field['value']}")
elif event_type == "store.order.refunded":
print(f"Refund: {payload['data']['order']['id']}")
elif event_type == "store.order.disputed":
print(f"Dispute: {payload['data']['order']['id']}")
elif event_type == "store.webhook.test":
print("Test webhook received!")
return jsonify({"received": True}), 200
if __name__ == "__main__":
app.run(port=3000)
Email Notifications
AstroLink sends automatic email notifications for key events:
For all users:
- Welcome email -- Sent when you create your account, with a link to your dashboard
For buyers:
- Purchase receipt -- Sent immediately after successful payment, includes order details, line items, total amount, and a link to download digital files (if applicable)
For sellers:
- Order notification -- Sent when a buyer completes a purchase, includes order details, buyer email, amounts (gross/net after fees), and custom checkout field responses
Email notifications are enabled by default for all accounts.
Account Settings
All account settings are in Dashboard > Settings.
Changing Your Username
- Go to Dashboard > Settings > Account
- Edit the Username field
- The app checks availability in real-time
- Save to apply the change
Remember: changing your username changes your profile URL. Update it wherever you've shared it.
Email Verification
Verifying your email helps secure your account.
- Check status -- Your verification status is shown in account settings
- Send verification email -- Click the button to receive a verification link
- Check verification -- After clicking the link in the email, click "Check verification" to update your status
Password Reset
If you've forgotten your password:
- Go to the login page
- Click Forgot password?
- Enter your email address
- Check your email for a reset link
- Click the link and set a new password
Deleting Your Account
To permanently delete your account:
- Go to Dashboard > Settings > Danger Zone
- Click Delete Account
- Confirm the deletion
This action is irreversible. All your data -- profile, links, store products, orders, messages, and analytics -- will be permanently deleted.
FAQ
General
What is AstroLink?
AstroLink is a link-in-bio platform with a built-in creator store. Create a single page with all your important links, social profiles, and digital products -- then share one link everywhere.
Is AstroLink free?
Yes. The Free plan includes a profile page, up to 5 links, social links, theme customisation, and basic analytics. The Pro plan (£5/mo) unlocks unlimited links, video embeds, background images, visitor messages, the theme marketplace, and store access.
What does my public profile URL look like?
Your profile is at https://app.astrolink.io/u/your-username. Share this link in your social media bios and anywhere else.
Links
How many links can I add?
Free plan: up to 5 active links. Pro plan: unlimited. You can always create more links than the limit -- they'll just be deactivated until you upgrade or deactivate other links.
Can I reorder my links?
Yes. Drag and drop links in the dashboard to change the order they appear on your profile.
What happens to my links if I downgrade from Pro?
Links beyond the 5-link limit are automatically deactivated (not deleted). If you upgrade again, you can reactivate them.
Profile & Appearance
Can I use a custom background image?
Yes, on the Pro plan. Upload any image (JPEG, PNG, or WebP) and it will be automatically optimised for your profile.
Can I add a video to my profile?
Yes, on the Pro plan. Add a YouTube or Vimeo URL and it will be embedded at the top of your profile.
Visitor Messages
How do visitor messages work?
When enabled (Pro plan), a contact form appears on your public profile. Visitors can leave their name, email, and a message. You'll find all messages in your Dashboard > Messages inbox.
Is there spam protection?
Yes. Messages are rate-limited to 5 per IP address per 15 minutes to prevent abuse.
Store
Do I need a Pro plan to use the store?
Yes. The store is available exclusively to Pro plan users. After upgrading, you'll need to request store access which is approved by our team.
What payment methods can my buyers use?
Buyers can pay with any method supported by Stripe, including:
- Credit and debit cards (Visa, Mastercard, Amex, etc.)
- Apple Pay
- Google Pay
- Other local payment methods (depending on your Stripe settings and region)
What happens if a buyer disputes a charge?
When a buyer files a chargeback:
- The order status changes to Disputed
- If you have webhooks configured, a
store.order.disputedevent is sent - You can respond to the dispute through your Stripe Dashboard
- Stripe handles the dispute resolution process
Can I sell physical products?
AstroLink is optimised for digital products and services. While you can list physical products, there's no built-in shipping or inventory management. You can use webhooks to integrate with external fulfilment services.
What file types can I sell?
Any file type is supported for digital products -- PDFs, ZIPs, images, videos, audio files, design files, and more. The maximum file size is 100 MB per file.
Can buyers download files more than once?
Yes. Buyers get up to 5 downloads per file, and their download access expires 7 days after purchase. Each download link is valid for 1 hour.
How long until I receive my money?
After a successful sale:
- Funds are held by Stripe for a short settlement period (typically 2-7 business days for new accounts, shorter for established accounts)
- Once available, Stripe automatically pays out to your connected bank account
- Payout frequency depends on your Stripe settings (daily, weekly, or monthly)
Can I offer free products?
Product prices must be greater than zero. If you want to distribute free content, consider sharing download links directly through your AstroLink profile links.
What currencies are supported?
Currently USD, EUR, and GBP. All products in a single checkout session must use the same currency.
Webhooks
How do I integrate webhooks with Zapier / Make / n8n?
- Create a webhook trigger in your automation tool
- Copy the webhook URL it gives you
- Paste it into your AstroLink store webhook settings
- Set a webhook secret and configure it in your automation tool for verification
- Select the events you want to trigger automations
- Test with the Send Test Webhook button
My webhook isn't receiving events. What should I check?
- Verify your webhook URL is correct and uses HTTPS
- Make sure your server is publicly accessible (not behind a firewall or localhost)
- Check that you've selected the correct events in your webhook settings
- Use the Send Test Webhook button to diagnose issues
- Check your server logs for any errors
- Verify your endpoint returns a
200status code within 5 seconds
Account
Can I change my username?
Yes, at any time from Dashboard > Settings > Account. Your profile URL will update immediately. Be sure to update it wherever you've shared the old URL.
How do I delete my account?
Go to Dashboard > Settings > Danger Zone and click Delete Account. This is irreversible -- all data will be permanently deleted.
How do I test my store before going live?
- Create a product and keep it in Draft status while you set everything up
- Configure and test your webhooks using the test button
- When ready, set the product to Live
- Make a real purchase to test the full flow end-to-end (you can refund yourself afterward)
Contact & Support
If you need help or have questions, get in touch:
- General enquiries: hello@astrolink.io
- Support: contact@astrolink.io
We aim to respond to all enquiries within 24 hours.
Social Links
Social links appear as icon buttons on your profile, making it easy for visitors to find you on other platforms.
Supported Platforms
Managing Social Links
Features:
Social links appear as a row of icons near the top of your public profile (when "Show Social Links" is enabled).