Campaigns & progress
getCampaignInfo and getReferrerProgress — the public offer and where the current user stands
Two read methods power referral UI: getCampaignInfo describes the offer (for banners, paywall slots, invite screens), and getReferrerProgress describes the current user's standing (for tier strips and status pages). Both return display-ready formatted strings alongside raw values, so custom UI needs zero math.
getCampaignInfo
The public offer for a campaign: reward values for both sides, tier ladder, qualification summary. Cached with a short TTL, so a home-screen banner does not hammer the network.
| Parameter | Type | Description |
|---|---|---|
campaignId | string | The campaign to describe. |
Returns a CampaignInfo with id, name, status (active / paused), referrerReward (formatted, e.g. "$10"), refereeOffer (formatted, e.g. "1 month free", nullable), tiers (threshold + reward), and qualificationSummary (e.g. "Friend starts a paid subscription within 14 days").
invitebase.getCampaignInfo(campaignId: string): Promise<CampaignInfo>const info = await invitebase.getCampaignInfo('7e1f8a3b-4c26-49d0-b591-0d8e2f6a3c15');
banner.textContent = `Earn ${info.referrerReward.formatted} per friend`;Invitebase.getCampaignInfo(campaignId: String) async throws -> CampaignInfolet info = try await Invitebase.getCampaignInfo(campaignId: "7e1f8a3b-4c26-49d0-b591-0d8e2f6a3c15")
bannerLabel.text = "Earn \(info.referrerReward.formatted) per friend"suspend fun Invitebase.getCampaignInfo(campaignId: String): CampaignInfoval info = Invitebase.getCampaignInfo("7e1f8a3b-4c26-49d0-b591-0d8e2f6a3c15")
bannerText.value = "Earn ${info.referrerReward.formatted} per friend"getCampaignInfo(campaignId: string): Promise<CampaignInfo>In components, prefer the useCampaignInfo hook:
const { info } = useCampaignInfo('7e1f8a3b-4c26-49d0-b591-0d8e2f6a3c15');
if (!info) return null;
return <Banner text={`Earn ${info.referrerReward.formatted} per friend`} />;static Future<CampaignInfo> Invitebase.getCampaignInfo(String campaignId)final info = await Invitebase.getCampaignInfo('7e1f8a3b-4c26-49d0-b591-0d8e2f6a3c15');
bannerText = 'Earn ${info.referrerReward.formatted} per friend';getReferrerProgress
Where the current user stands as a referrer: referral counts by state (pending / validated), earnings, current tier, and referrals to the next tier. Requires an identified or anonymous user with at least one referral link.
No parameters.
invitebase.getReferrerProgress(): Promise<ReferrerProgress>type ReferrerProgress = {
referrals: { pending: number; validated: number };
earnings: { formatted: string; amount: number; currency: string };
tier: {
current: string | null;
next: string | null;
referralsToNext: number | null;
};
};const progress = await invitebase.getReferrerProgress();
if (progress.tier.referralsToNext !== null) {
strip.textContent = `${progress.tier.referralsToNext} more referrals to unlock ${progress.tier.next}`;
}Invitebase.getReferrerProgress() async throws -> ReferrerProgresspublic struct ReferrerProgress {
public let pendingReferrals: Int
public let validatedReferrals: Int
public let earnings: RewardDisplay // formatted: "$30"
public let currentTier: String?
public let nextTier: String?
public let referralsToNextTier: Int?
}let progress = try await Invitebase.getReferrerProgress()
if let remaining = progress.referralsToNextTier, let next = progress.nextTier {
tierLabel.text = "\(remaining) more referrals to unlock \(next)"
}suspend fun Invitebase.getReferrerProgress(): ReferrerProgressdata class ReferrerProgress(
val pendingReferrals: Int,
val validatedReferrals: Int,
val earnings: RewardDisplay, // formatted: "$30"
val currentTier: String?,
val nextTier: String?,
val referralsToNextTier: Int?,
)val progress = Invitebase.getReferrerProgress()
progress.referralsToNextTier?.let { remaining ->
tierText.value = "$remaining more referrals to unlock ${progress.nextTier}"
}getReferrerProgress(): Promise<ReferrerProgress>In components, prefer the useTierProgress hook — it updates live as referees complete gates:
const { progress } = useTierProgress();
if (!progress?.tier.next) return null;
return (
<Text>
{progress.tier.referralsToNext} more referrals to unlock {progress.tier.next}
</Text>
);static Future<ReferrerProgress> Invitebase.getReferrerProgress()class ReferrerProgress {
final int pendingReferrals;
final int validatedReferrals;
final RewardDisplay earnings; // formatted: '$30'
final String? currentTier;
final String? nextTier;
final int? referralsToNextTier;
}final progress = await Invitebase.getReferrerProgress();
if (progress.referralsToNextTier case final remaining?) {
tierText = '$remaining more referrals to unlock ${progress.nextTier}';
}To react the moment progress changes instead of fetching on render, use the change observers.