Appearance
Integrations
The Affiliate Platform connects to several external services to generate links, pull analytics data, send emails, and store files.
Affiliate Networks
Impact
Impact is a large affiliate marketing platform used for many financial product offers.
What it does for us:
- Generates unique affiliate links for creators (by selecting a campaign and ad unit in the offer settings)
- Provides click and conversion data via their reporting API, pulled daily
→ DB: Analytics data written to affiliate_analytics (affiliateLinkId, providerId, date, clicks, conversions, earnings)
How it's set up: Impact credentials (an account SID and API key) are stored securely in the platform's environment configuration. No manual steps are needed day-to-day.
PartnerStack
PartnerStack is an affiliate network focused on software companies — partners include QuickBooks, Deel, Gusto, and others.
What it does for us:
- Generates unique affiliate links for creators using a two-step process: first fetching the partner's default link settings, then creating a custom link with the creator's slug
- Provides click and analytics data via their reporting API, pulled daily
→ DB: Analytics data written to affiliate_analytics (affiliateLinkId, providerId, date, clicks, conversions, earnings)
Authentication note: PartnerStack sessions expire weekly. The platform has an automated cron job that re-authenticates every Monday at 9am UTC and stores the new credentials in the database. If PartnerStack links or analytics stop working, the first thing to check is whether this cron ran successfully. → DB: Credentials stored in AppSession (key = 'partnerstack_cookie', value = _dwrf JWT)
RedVentures / Money.com
A financial content network that manages several affiliate programs.
What it does for us:
- Links are generated by appending the creator's tracking ID to the network's base URL — no API call needed at link creation time
- Earnings and conversion data are pulled daily via their API
→ DB: Analytics data written to affiliate_analytics (affiliateLinkId, providerId, date, clicks, conversions, earnings)
Bankrate / QuinnStreet
Similar to RedVentures — URL-based link generation with daily analytics pulls.
→ DB: Analytics data written to affiliate_analytics (affiliateLinkId, providerId, date, clicks, conversions, earnings)
Communication
MailerSend
Used to send transactional emails from the platform. Current uses:
Sign-in (magic link) emails Sent when a creator requests a sign-in link. The email is personalized: if a creator has access to both the Affiliate Platform and the PS Workflow, the email includes buttons for both. If they only have one, only that button appears. The subject line also reflects which platform(s) they're signing into. → DB: Reads User.internalPlatforms to determine which buttons to include in the email
Platform invite emails Sent when an admin adds a new creator via the Users → "Add Creator" flow. Includes a magic link to complete sign-up.
Application approval/rejection emails Sent automatically when an admin approves or rejects a creator application from the Applications section. Both emails are sent from apple@creatorsagency.co as plain text.
Approval email (subject: "You're approved for Money Matchup!") — confirms approval, briefly explains how the platform works (sign in, browse offers, create links, track earnings), and links the creator directly to https://partners.moneymatchup.com/auth. This email is the platform invite; no separate email is sent.
Rejection email (subject: "Re: Your Money Matchup application") — politely declines, mentions the roster is updated regularly, and encourages them to reapply in the future.
Storage
Vercel Blob Storage
Profile photos uploaded by admins for creator accounts are stored in Vercel Blob — a cloud file storage service. Photos are served directly from there to the platform. → DB: URL written to User.profilePhotoUrl (col: image) and CreatorProfile.profilePhotoUrl
Internal Systems
Router Backend
A separate internal service (built and maintained by the dev team) handles the actual URL routing when someone clicks a creator's secure.moneymatchup.com link.
When a new affiliate link is created or a provider configuration changes in the platform, the platform automatically notifies the router backend so it updates its routing table. This happens in the background — admins don't need to do anything manually. → DB: Router backend reads AffiliateLink.slug, GeneratedLink.link, and OfferProvider config to build its routing table
Note: The router backend needs to be running and reachable for link routing to work. If creators report that their links aren't working, the router backend's status should be checked.
Airtable
Airtable serves two purposes for the platform:
1. Creator profile sync Creator profile information — specifically legal names and profile photos — is synced from the company's Airtable creator database. This keeps the platform's user records consistent with the master creator database without requiring duplicate data entry. → DB: Writes User.legalName (col: legal_name) and User.profilePhotoUrl (col: image)
2. Creator application queue When someone applies to join Money Matchup via the apply form on moneymatchup.com, their application is written to Airtable (base appmbrP38m4Ak1lb9, table Creator Submissions) with Status = "Pending Review". The admin panel's Applications section reads this table in real time and allows admins to approve or reject directly — updating the status in Airtable and triggering an email to the applicant. No manual Airtable access is required for the standard review workflow.
Spam filtering: The platform automatically filters out bot submissions before displaying applications. A submission is considered spam if both of the following are true: the name contains no spaces, is longer than 10 characters, and has a high frequency of random uppercase/lowercase alternation — AND the email address local part contains 4 or more dots (e.g. i.k.u.ru.fr.a@gmail.com). Requiring both signals prevents real creators with unusual single-word names from being mistakenly filtered.
VidIQ
When a sponsored video is submitted to the platform (via an external integration), VidIQ's API is called to fetch metadata about the YouTube video — specifically its duration. This is used to automatically classify the video as long-form YouTube or YouTube Shorts (videos under 60 seconds are classified as Shorts). → DB: Updates SponsoredVideo.duration; if duration ≤ 60, sets SponsoredVideo.platform = 'youtube_shorts'