portaly-email
Portaly Vibe Invitation Email Integration
Use this skill to help a human user wire up the registration link from Portaly Vibe invitation emails to the right landing page.
Concept
When a follower clicks the CTA in a Portaly invitation email, the request always hits https://portaly.ai/r/{referralCode} first — that endpoint is the central click tracker (rate limit, click-event log, attribution). Portaly then 302-redirects to a landing page; three modes pick where:
| Mode | Landing URL | creatorSubscriptionConfig |
|---|---|---|
| A. Hosted waitlist (default) | https://portaly.ai/waitlist/{creatorSlug} |
appBaseUrl empty |
| B. Self-hosted waitlist | https://{appBaseUrl}/waitlist/{creatorSlug} |
appBaseUrl set, inviteRedirectPath empty |
| C. Direct register | https://{appBaseUrl}{inviteRedirectPath} |
both set (e.g. inviteRedirectPath: "/signup") |
?ref / utm_source=invitation / utm_campaign / utm_content are appended in all three modes — attribution survives. Toggling propagates within ~60 seconds (Portaly's per-process cache TTL) and applies to every email already in flight.
Mode C trade-off: recipients bypass the Portaly waitlist. To get the new follower into the creator's user list and stamp the signedUp funnel stage, the register flow must call syncToPortaly (see portaly-user) with signupRefCode set. Without that call, the creator never sees the user and the campaign analytics' signedUp and converted both stay at 0 — converted only stamps for recipients whose signedUp has already been recorded.