Get copies of your code, data, and infrastructure access from an agency
This guide is for customers who need a complete handover from a software agency without guessing where anything lives. You will leave with a local copy of your source code, exported application data, and working owner/admin access to the services that run your system.
TL;DR — If you need a clean handover, collect three things in this order: source code, data exports, and direct owner/admin access to every service that runs the system. The most common blocker is that the agency added you as a user inside the app, but not as an owner in the code host, cloud account, domain registrar, DNS provider, database, and deployment platform. Reading time: ~5 min
Goal
When you are done, you will have: a downloadable copy of your source code on your computer, exported copies of your production data, and direct owner/admin access to each infrastructure service that runs your product, without depending on the agency's personal accounts.
Prerequisites
- Your agency's project contact and a list of services they used
- Your business email address that you control
- Access to your email inbox for invitation links and password resets
- A spreadsheet or document to track services, URLs, and access status
- Git installed if you want a local code copy via command line — version 2.30 or newer; check with:
git --version
- Optional: PostgreSQL client if your app uses Postgres (database engine); version 14 or newer; check with:
psql --version
pg_dump --version
- Optional: MySQL client if your app uses MySQL (database engine); version 8 or newer; check with:
mysql --version
mysqldump --version
- Enough disk space for code backups, database exports, and file storage downloads
- This information at hand, if the agency has it: repository URL, cloud provider name, deployment platform name, database type, domain registrar, DNS provider, object storage/bucket name, and production app URL
Steps
Step 1: Build the handover checklist
Create a simple table in a document or spreadsheet with these rows and fill it in as you go:
| Item | What to collect | Status |
|---|---|---|
| Source code | Repository URL and local copy | Not started |
| Database | Export file and login access | Not started |
| File storage | Download/export and admin access | Not started |
| Hosting/cloud | Owner/admin access | Not started |
| Deploy platform/CI | Owner/admin access and env vars list | Not started |
| Domain registrar | Owner/admin access | Not started |
| DNS provider | Owner/admin access | Not started |
| SSL/TLS certs | Where managed | Not started |
| Monitoring/logs | Admin access | Not started |
| Backups | Where stored and restore test | Not started |
What you should see when this succeeds: you have one place listing every service involved, with a status column you can update.
Step 2: Get owner/admin invitations for every service
Ask the agency to invite your business email as an owner or admin in each provider's dashboard. Use this exact request:
Please invite <your-email@company.com> as Owner or Admin to every service used for this project: code repository, cloud/hosting account, deployment platform, database service, domain registrar, DNS provider, object/file storage, email provider, monitoring/logging, and backup service. Please send the exact provider names and URLs if you have not already.
In each provider's dashboard, accept the invitation from the email link. The menu path varies by provider, but it is usually one of these:
- Settings → Members → Invite / Pending invitations
- Organization → Users / Members
- Account → Access / Team
What you should see when this succeeds: your email appears in each service's members list with "Owner" or "Admin" next to it.
Step 3: Download a copy of the source code
First use the provider dashboard if available: in your code hosting provider's dashboard (for example, a Git hosting service), open the repository and look for one of these paths:
- Repository → Code → Download ZIP
- Repository → Clone / Code → HTTPS URL
- Settings → General → Transfer ownership (only if the agency is moving the repo to your account)
If you have the repository URL, clone it locally:
git clone https://YOUR-CODE-HOST/YOUR-ORG/YOUR-REPO.git
cd YOUR-REPO
git branch -a
git tag
If the default branch is not obvious, list recent history:
git log --oneline -n 10
What you should see when this succeeds: a project folder exists on your computer and git branch -a prints branches instead of an authentication error.
⚠️ Do not rotate passwords, delete agency users, or change deployment settings yet. Doing that before exports are complete can break deployments or cut off the only working access path.
Step 4: Export the production database
Use the database provider dashboard first. Common menu paths are:
- Database service → Backups → Create backup / Download
- Project → Database → Export
- Instance → Backups / Snapshots
If there is no download button and you have database credentials, use the correct command for your database.
For PostgreSQL:
pg_dump "postgresql://DB_USER:DB_PASSWORD@DB_HOST:5432/DB_NAME" --format=custom --file=production.dump
For MySQL:
mysqldump -h DB_HOST -u DB_USER -p --single-transaction --routines --triggers DB_NAME > production.sql
What you should see when this succeeds: a backup file such as production.dump or production.sql exists and is larger than a few KB.
Step 5: Export uploaded files and object storage
If your app stores uploads in object storage (file storage service), use the provider dashboard first:
- Storage / Buckets → Select bucket → Download / Export
- Files → Bucket / Container → Download
If the provider only offers CLI access, ask the agency for a temporary read-only access key and the bucket/container name. Then use the provider's copy tool. Example with an S3-compatible bucket (common object storage API):
aws s3 sync s3://YOUR-BUCKET ./bucket-copy
What you should see when this succeeds: your local folder contains user-uploaded files such as images, documents, or exports from production.
Step 6: Record infrastructure access and secrets locations
In each provider dashboard, open the service and record the exact service URL, account name, and where secrets (passwords/API keys) are stored. Common menu paths are:
- Project → Settings → Environment variables
- Service → Configuration
- Account → Security → API keys
- Domain / DNS → Records
Create a table like this and fill it in:
| Service | Provider URL | Your role | Critical items to note |
|---|---|---|---|
| Code host | https://... | Owner/Admin | Repo URL, default branch |
| Cloud/hosting | https://... | Owner/Admin | Project names, regions |
| Database | https://... | Owner/Admin | Host, port, db name |
| Deploy platform | https://... | Owner/Admin | Env vars, build settings |
| DNS | https://... | Owner/Admin | Nameservers, records |
What you should see when this succeeds: you can open each service directly yourself, and you have written down the exact place where important settings live.
Step 7: Verify domain and DNS control
Open your domain registrar dashboard and your DNS provider dashboard. Common paths are:
- Registrar → Domain management → Nameservers
- DNS provider → DNS → Records
Check that you can view and edit records. Add a temporary TXT record (text record) to prove control:
- Type:
TXT - Name/Host:
_handover-check - Value:
ok - TTL:
300
What you should see when this succeeds: the record saves without an authorization error, and you can see _handover-check in the DNS records list.
Step 8: Save the evidence in one folder
Create a handover folder on your computer and place these items inside it:
handover/
code/
database/
storage/
screenshots/
service-inventory.xlsx
Add screenshots of each provider page showing your owner/admin role, plus the exported files and cloned repository.
What you should see when this succeeds: one folder contains the code copy, data exports, and proof that your access works.
Verify it works
Run these checks end to end.
For source code:
cd YOUR-REPO
git status
git remote -v
Expected result: git status shows a normal repository state, and git remote -v prints the repository URL.
For database export:
ls -lh production.dump production.sql
Expected result: the backup file exists and has a realistic size for your app data.
For DNS control, check the TXT record from any terminal or online DNS checker:
nslookup -type=TXT _handover-check.yourdomain.com
Expected result: the answer includes ok.
For infrastructure access, open each provider dashboard in a private/incognito window and sign in with your own account.
Expected result: you can reach the project/account without asking the agency to log in for you.
Common pitfalls
You were added as a user in the app, not as an owner in the provider
Mistake: the agency gave you a login to the website they built, but not to the code host, cloud account, or DNS provider.
Symptom: you can use the product, but you cannot download code, export data, or change infrastructure settings.
Fix: ask for owner/admin invitations to the underlying providers using the exact request in Step 2.
You only got a ZIP file, not the Git repository history
Mistake: downloading "Source code ZIP" and assuming it is the full repository.
Symptom: there is no .git folder, no branches, no tags, and no commit history.
Fix: get the repository URL and run git clone ... so you have the full history.
The database export is from staging, not production
Mistake: exporting from the wrong environment (staging/test instead of live production).
Symptom: the backup is much smaller than expected or missing recent customer data.
Fix: in the provider dashboard, open the production project first, then export again; verify file size and recent records.
DNS changes look broken because of caching
Mistake: adding the TXT record and checking immediately from a cached resolver (DNS lookup server).
Symptom: the record appears in the dashboard but not in your first lookup.
Fix: wait 5-10 minutes, then check again with nslookup -type=TXT _handover-check.yourdomain.com.
The agency's personal account still owns critical services
Mistake: your email is an admin, but the billing owner or sole owner is still an agency employee.
Symptom: you can view settings, but you cannot transfer ownership, change billing, or recover the account if they leave.
Fix: in each provider's members/billing page, transfer ownership or add your company-controlled account as the primary owner.
This article was written by an AI system and published pending human review. Verify anything you intend to act on.
Have a project in mind?
Get an instant AI price estimate for it, or talk directly to our team.
One email a month on what we learn building with AI