Share Links
Create named, trackable links for distributing forms to different audiences.Share links let you create multiple URLs for the same form, each with its own source tracking. This helps you understand where your responses are coming from—schools, partner organizations, email campaigns, etc.
Why Use Share Links?
| Use Case | Example |
|---|---|
| Partner distribution | Create a link for each school or community partner |
| Campaign tracking | Track responses from email vs. social media |
| Time-limited access | Links that auto-expire after a deadline |
| A/B testing | Different links for different outreach messages |
Link URL Structure
Share links use asrc query parameter to identify the source:
| Component | Description |
|---|---|
/f/rental-assistance | Form’s public URL (by slug) |
?src=Ab3kL9Zq | Share link’s unique slug (8-10 chars) |
Creating Share Links
From the form settings page, navigate to Share Links and click New Link.Required Fields
| Field | Description |
|---|---|
| Name | Human-readable identifier (e.g., “South Kitsap High School”) |
Optional Fields
| Field | Description | Default |
|---|---|---|
| UTM Source | Analytics tracking parameter | Auto-generated from name |
| Expiration Date | Auto-close after this date | Never expires |
| Response Limit | Max submissions this link can receive | Unlimited |
Server Action
UTM Source Tracking
Each share link has autm_source value for analytics integration. This is stored with every submission made through that link.
Auto-Generation
If not specified, the UTM source is generated from the link name:How It’s Stored
share_link_id foreign key connects submissions to their source link, enabling response counts and attribution reporting.
Link Expiration
Share links can be set to automatically stop accepting submissions after a specific date.How It Works
- Set an expiration date when creating the link
- After the date passes, the link shows as “Expired”
- Applicants visiting an expired link see the form-closed message
- No cron job required—expiration is checked at access time
Expiration Check
Expiration doesn’t modify the database record—the link is evaluated as “closed” dynamically. You can remove the expiration date to reopen an expired link.
Open/Close Toggle
Each share link can be manually toggled open or closed, independent of the main form status.| Link Status | Form Status | Result |
|---|---|---|
| Open | Published | ✅ Accepts submissions |
| Closed | Published | ❌ Shows closed message |
| Open | Closed | ❌ Shows closed message |
| Expired | Published | ❌ Shows closed message |
| At Limit | Published | ❌ Shows closed message |
Toggle Action
Response Limits
Cap the number of submissions a link can receive—useful for limited capacity events or first-come-first-served scenarios.How It Works
- Set a response limit when creating the link (e.g., 50)
- The UI shows progress: “23/50” in the Responses column
- When the limit is reached, the link shows “At Limit” badge
- Applicants visiting a full link see the form-closed message
Limit Check
Response Tracking
Each share link tracks the number of submissions it has received.Counting Responses
Data Model
form_share_links Table
Database Schema
Server Actions
All share link operations are available as server actions:| Action | Description |
|---|---|
listShareLinks(formId) | Get all links for a form with response counts |
createShareLink(input) | Create a new share link |
updateShareLink(input) | Update link properties |
toggleShareLink(id, isOpen) | Quick open/close toggle |
renameShareLink(id, name) | Rename a link (UTM stays locked) |
duplicateShareLink(id, newName) | Copy link with new name and UTM |
deleteShareLink(id) | Remove a share link |
getShareLinkBySlug(slug) | Get link by slug (public route) |
Authorization
All actions (exceptgetShareLinkBySlug) require form admin access via checkFormAccess().
UI Components
The share links management UI is located at:Features
| Feature | Description |
|---|---|
| Link table | Shows name, UTM source, created date, expiration, response count |
| URL tooltip | Hover over link name to see full URL |
| Status badges | Visual indicators for Closed, Expired, and At Limit links |
| Quick actions | Rename, duplicate, toggle, copy URL, delete |
| Create dialog | Form for new links with UTM, expiration, and response limit |
| Rename dialog | Update link name while keeping UTM locked |
| Duplicate dialog | Copy link with new name and auto-generated UTM |
Copying Links
The copy button generates the full URL:Best Practices
Use descriptive names
Use descriptive names
Name links after the distribution channel or partner: “Lincoln High School”, “January Email Blast”, “Community Center Flyers”
Set expiration for time-sensitive campaigns
Set expiration for time-sensitive campaigns
If you’re doing targeted outreach with a deadline, set the expiration to match. This prevents late submissions without manual intervention.
Use response limits for capacity
Use response limits for capacity
When distributing to multiple partners with limited slots each, set response limits. For example, give each school a link with a 50-response limit for a first-come-first-served program.
Duplicate for similar partners
Duplicate for similar partners
Use the duplicate feature when creating links for similar partners. It copies expiration and response limit settings while generating a fresh UTM source.
Keep UTM sources consistent
Keep UTM sources consistent
Use a consistent naming convention for UTM sources across your forms. This makes cross-form analytics easier.
Don't delete links with responses
Don't delete links with responses
While you can delete share links, existing submissions keep their
share_link_id. Deleting removes the link name from reports, making attribution harder.