Overview
The RAF Admin Console is a staff-facing Django app (InviteFriendConsole) bundled with the Banno integration. FI staff sign in with a Django user account (is_staff=True) and manage campaigns, review individual referrals, and pay or record reward payouts.
The console is mounted at /console/ on the same service that hosts the member plugin. Authentication is Django’s standard session login — there is no Banno OIDC on the admin side.
1. Overview Dashboard

Campaigns table:
Lists every campaign for the tenant — active and historical. Each row includes the campaign type (
NewRelationshipCampaign / NewProductCampaign), optional restriction User ID, priority, start/end dates, and both reward amounts.
- Edit — opens the edit modal for that campaign.
- Status toggle — fires
POST /console/campaigns/<id>/toggle/. A green toggle indicates the campaign is active and currently within its date window. Toggling off effectively ends the campaign immediately. - Add New Campaign — opens the new-campaign form described below.
priority is the one surfaced first in the inviter tile. During submission itself, a referral row is created for every matching active campaign regardless of priority.
2. Referrals List

Columns:
Bulk actions:
A helper note at the bottom clarifies the host account ID column: “Inviter Reward Host Account ID: Inviter Checking Share Host Account ID” — the account resolution picks the inviter’s primary checking account unless the campaign’s
inviter_rda_codes narrows it to a different product code.
3. New Campaign Form

Campaign.
Top-level fields
Payment Mode semantics
Criteria Config builder
The Logic field builds the composition expression (e.g.,
account AND balance AND (payroll OR debit)) stored on criteria_config.logic. Each checkbox enables that criterion; unchecked criteria are ignored by the engine regardless of logic.
Submit
On Submit the form posts toPOST /console/campaigns/. The server validates:
start_date <= end_date.- At least one criterion is enabled if the type is
NewProductCampaign. promo_codeis unique across active campaigns for this tenant.do_not_pay_codesis valid JSON.
