Provider Handover Checklist#
This checklist covers every external service and credential that must be transferred or re-provisioned when handing Cobalt over to a new support provider. Work through each section in order — AWS must be done first because most other services depend on it.
Warning
Do not revoke old credentials until the new provider has verified that the replacement credentials are working in all environments (production, UAT, and test). Revoking too early will cause outages.
1. AWS Account#
Cobalt runs entirely on AWS: the application server (Elastic Beanstalk), database (RDS), email (SES), notifications (SNS), file storage (EFS/S3), DNS (Route 53), and load balancer.
Steps#
Create an IAM user (or transfer ownership of the root account) for the new provider in the ABF AWS account.
Attach the existing IAM policies used for Cobalt deployments (check the existing IAM user to see which policies are attached).
Generate a new Access Key ID and Secret Access Key for the new IAM user.
Update the following Elastic Beanstalk environment properties in every environment (Production, UAT, Test) via the AWS Console → Elastic Beanstalk → Configuration → Software:
AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_REGION_NAME
Update the AWS CLI and EB CLI credentials on the new provider’s local machines.
Verify access by running
eb statusfrom thecobaltdirectory.Revoke the old IAM user’s access key once verified.
Key resources#
Elastic Beanstalk application:
cobalt(region:ap-southeast-2)RDS instance: check AWS Console → RDS
Route 53 hosted zone:
myabf.com.auSES configuration sets:
cobalt-prod,cobalt-uat,cobalt-test
2. AWS RDS (Database)#
The PostgreSQL database runs on AWS RDS. The new provider needs the connection credentials to manage the database directly (migrations, backups, support queries).
Steps#
In the AWS Console → RDS → Databases, select the Cobalt instance.
Modify the master user password to a new value (requires a maintenance window or an immediate apply).
Update the following Elastic Beanstalk environment properties in every environment:
RDS_DB_NAMERDS_USERNAMERDS_PASSWORDRDS_HOSTNAMERDS_PORT
Restart the Elastic Beanstalk environment to pick up the new credentials.
Verify the application connects successfully by checking the Cobalt home page and the Django admin.
3. AWS SES (Email)#
All transactional email is sent through AWS Simple Email Service. The
verified sending domain (myabf.com.au) and configuration sets must
remain active.
Steps#
Confirm the new AWS IAM user (from step 1) has
ses:SendEmailandses:SendRawEmailpermissions.Verify the
myabf.com.audomain is still verified in SES (AWS Console → SES → Verified identities). If domain ownership is transferring, the new provider will need to add the SES DKIM DNS records to Route 53.Check each environment’s configuration set (AWS Console → SES → Configuration sets) and confirm the SNS topic subscription for event webhooks is active and pointing to the correct Cobalt URL:
https://<env>.myabf.com.au/notifications/ses/event-webhook/Update
AWS_SES_CONFIGURATION_SET,AWS_SES_REGION_NAME, andAWS_SES_REGION_ENDPOINTin the Elastic Beanstalk environment properties if they have changed.Send a test email from the application and confirm the SES webhook callback is received (visible in the Django admin under Notifications).
4. Stripe (Payments)#
Stripe processes all Bridge Credits top-ups and event entry payments.
Steps#
The ABF Stripe account owner must add the new provider as an Administrator in the Stripe Dashboard → Settings → Team.
If new API keys are needed, go to Stripe Dashboard → Developers → API keys → Create restricted key (or roll the existing secret key).
Update the following Elastic Beanstalk environment properties in every environment:
STRIPE_SECRET_KEYSTRIPE_PUBLISHABLE_KEY
For each environment’s webhook endpoint (Stripe Dashboard → Developers → Webhooks), verify the endpoint URL is correct:
https://<env>.myabf.com.au/payments/stripe-webhookThe endpoint must handlepayment_method.attachedandcharge.succeededevents.Reveal the Signing secret for each webhook endpoint and update
STRIPE_WEBHOOK_SECRETin the corresponding environment.Test a payment in the UAT environment using a Stripe test card.
5. Xero (Accounting)#
The Xero integration raises invoices and records payments for club settlements. See Setting Up the Xero Integration for the full setup guide.
Steps#
The ABF Xero account admin must invite the new provider to the Xero organisation (Xero → Settings → Users → Invite a User).
In the Xero Developer Portal, transfer ownership of the Cobalt Custom Connection app to the new provider’s Xero account, or create a new app and update credentials.
Update the following Elastic Beanstalk environment properties in production (and create equivalent apps for UAT/test):
XERO_CLIENT_IDXERO_CLIENT_SECRET
Navigate to
/xero/in Cobalt as an ABF staff user and click Connect to verify the new credentials work.Update the Xero webhook signing key: Xero Developer Portal → app → Webhooks → copy the webhook key → set
XERO_WEBHOOK_KEYin the environment properties.Confirm the webhook URL is registered:
https://www.myabf.com.au/xero/webhook
6. Google Firebase Cloud Messaging (FCM)#
FCM delivers push notifications to the Cobalt mobile app (Android and iOS).
Steps#
In the Firebase Console, go to Project Settings → Users and Permissions and add the new provider as an Owner.
Generate a new service account key: Project Settings → Service Accounts → Generate new private key. This downloads a JSON credentials file.
Upload the JSON file to a secure location on the Elastic Beanstalk EC2 instance (or store it in AWS Secrets Manager and update the retrieval method).
Update the
GOOGLE_APPLICATION_CREDENTIALSenvironment variable in every Elastic Beanstalk environment to point to the new file path.Restart the application and send a test push notification from the Django admin to verify FCM is working.
Remove the old provider’s Firebase access once verified.
7. Google reCAPTCHA#
reCAPTCHA v2 protects the logged-out contact form from spam submissions.
Steps#
Go to the Google reCAPTCHA Admin Console and transfer ownership of the Cobalt site to the new provider’s Google account, or create a new reCAPTCHA v2 site for
myabf.com.au.Copy the new Site key and Secret key.
Update the following Elastic Beanstalk environment properties in every environment:
RECAPTCHA_SITE_KEYRECAPTCHA_SECRET_KEY
Visit the public contact form and submit a test message to confirm reCAPTCHA loads and validates correctly.
8. Google Maps#
An embedded Google Maps iframe shows venue locations on congress pages. The Maps API key is currently hardcoded in the event templates.
Steps#
In the Google Cloud Console, locate the project that owns the Maps Embed API key (search for the existing key value in APIs & Services → Credentials).
Add the new provider as an Owner of the Google Cloud project, or create a new Maps Embed API key restricted to
*.myabf.com.au.If issuing a new key, update all three template files that embed the Maps iframe:
events/templates/events/players/congress.htmlevents/templates/events/players/congress_logged_out.htmlevents/templates/events/congress_builder/congress_wizard_3.html
Replace the
key=parameter in the Maps embed URL in each file.Deploy the updated templates and verify that a congress venue map displays correctly.
Note
Ideally the Maps API key should be moved to an environment variable to avoid needing a code change when rotating it.
9. New Relic (Monitoring)#
New Relic provides application performance monitoring and alerting.
Steps#
Log in to New Relic and go to Administration → User Management. Add the new provider as an Admin and remove the old provider once verified.
Confirm the
NEW_RELIC_APP_IDvalues for each environment are set correctly in the Elastic Beanstalk environment properties.Verify that the New Relic agent is reporting data for each environment (New Relic → APM → cobalt-* applications should all show green).
Review and transfer ownership of any alert policies and notification channels to the new provider’s contact details.
10. Domain and DNS (Route 53)#
The myabf.com.au domain and its DNS records are managed in AWS Route 53.
If the domain is registered elsewhere (e.g. a registrar separate from AWS),
that registrar account must also be transferred.
Steps#
Confirm who holds the domain registrar account for
myabf.com.auand transfer access (or the registration itself) to the new provider.In AWS Route 53 → Hosted zones →
myabf.com.au, verify the new provider’s IAM user (from step 1) has access to manage DNS records.Document all existing DNS records before making any changes.
If the domain registrar is separate from AWS, ensure the nameservers in the registrar still point to the Route 53 hosted zone.
11. Mobile Application (Google Play & Apple App Store)#
The Cobalt mobile app is published on both stores under the ABF’s accounts.
Steps#
Google Play: Go to the Google Play Console → Users and permissions and add the new provider with Admin access. Remove the old provider.
Apple App Store: In App Store Connect → Users and Access, invite the new provider as an Admin. Remove the old provider once accepted.
Transfer any signing certificates and provisioning profiles stored outside of the stores (e.g. on a developer machine). The iOS distribution certificate and Android keystore must not be lost.
Confirm the new provider can successfully build and submit a test build to both stores using the transferred credentials.
Post-Handover Verification Checklist#
After completing all sections above, verify end-to-end functionality in the UAT environment before declaring the handover complete:
Test |
Service verified |
|---|---|
Log in to Cobalt and view the dashboard |
AWS EB, RDS |
Submit the logged-out contact form (with reCAPTCHA) |
Google reCAPTCHA, AWS SES |
Top up Bridge Credits with a Stripe test card |
Stripe, AWS SES |
Create a congress with a venue address and confirm map displays |
Google Maps |
Send a push notification to a test device via Django admin |
Firebase FCM |
Check New Relic shows live APM data for the UAT environment |
New Relic |
Confirm a Xero invoice can be created from |
Xero |
Confirm email delivery and SES webhook callback appears in admin |
AWS SES, SNS |