What freelance iOS contractors specifically struggle with
The hardest part of contracting isn't the code — it's the seams between engagements. App Store Connect was designed for a single team at a time; it doesn't know you're doing five.
- Team switching in the browser is painful. App Store Connect's "team switcher" requires signing out and back in if you're on different Apple IDs. Even within one Apple ID, switching teams triggers a full reload, and you lose whatever panel you were on.
- Credential sprawl. Each client gives you a different level of access — sometimes a seat on their team, sometimes a dedicated Team Key, sometimes credentials shared via a password manager you dislike. Tracking which client gave you what, for how long, and what it can do is its own job.
- Onboarding a new client often starts with Apple paperwork. They don't have an Apple Developer Program membership. They don't have a D-U-N-S number. Their legal entity is under review. Your first two weeks are waiting.
- Handoff documentation is vague. When the engagement ends, what exactly did you ship? What's still live? What metadata goes with what version? Most contractors hand over a README that quickly goes stale.
- Per-project workflows are hard to keep consistent. Client A wants English + German. Client B wants 12 locales. Client C wants phased release always on. Keeping those rules separate in your head and not bleeding configuration across projects is an actual risk.
How AppConsul helps contractors
Multiple client teams, one sidebar
On Pro, AppConsul accepts multiple App Store Connect API keys. Add Client A's Team Key, Client B's Team Key, and so on — each key stays in macOS Keychain scoped to its team. The Apps view shows every app across every connected team, with a team badge so you never mix them up. Switching between Client A's fitness app and Client B's fintech app is one click, no reauth, no browser reload.
Clear per-app state at a glance
The Apps dashboard shows live version, pending changes, last-sync time, and connected GitHub repo for every client app. You can see, for every engagement, whether there's a version waiting for you, whether review changed state, or whether the client accidentally edited something in the browser.
Per-locale metadata editor scales to any client
Whether a client wants one locale or 20, the metadata editor is the same — one column per locale with live UTF-16 counts (see the character counter). Client configs don't leak across apps.
Guided Flows train the client's team without you
When you hand off to a client's internal PM or marketing person, the Guided Flows (Publish First App Listing, Refresh Screenshots, Update Metadata, Generate Store Assets, Set Up TestFlight Beta) are built to be followable by someone who hasn't done an App Store release before. You write a short handoff doc pointing at the relevant flow; they run it when they need to.
Clean credential revocation
At contract end, the client revokes the Team Key in App Store Connect. Within AppConsul, the stored credential starts returning auth errors. You delete the connection — and all the state for that client goes with it. Nothing is left on your disk that the client would care about.
Recommended contractor workflow
A repeatable per-engagement loop that keeps boundaries clean:
- Client enrollment. Verify they have or are getting an Apple Developer Program membership. Wait for Apple's entity review if applicable.
- Access setup. Client invites you as Admin or Developer on their ASC team. They generate a Team Key scoped to your role (or you generate it, depending on who the Account Holder is). See the API key setup guide.
- Connect in AppConsul. Add the Team Key (issuer ID, key ID, .p8). AppConsul stores it in Keychain scoped to that team and loads their apps.
- Normal release work. Versions, metadata, screenshots, app details, submission — all the same surface, but always against that client's team.
- Project docs. Export each version's metadata as JSON (AppConsul's export) as you ship. Keep alongside your git tags. Self-documenting release log.
- Handoff. Walk the client through the Guided Flows they'll need after you leave. Share the submission checklist for their PM.
- Close-out. Client revokes the Team Key and removes your user account. You delete the connection in AppConsul.
Tools you'll use most
- API key validator — when a new client sends you credentials, paste them and confirm Apple accepts them before you waste time setting up the connection.
- Submission checklist — standardised handoff document; the checkbox format is obvious even to non-developers.
- Metadata character counter — drafting copy for multiple clients in parallel without accidentally overrunning a limit on one.
Frequently asked questions
Can AppConsul connect to multiple client teams?
Yes, on Pro. Multiple API keys, one per team, each in Keychain. Switch between teams without re-auth.
Does my client need an Apple Developer Program account before I can start?
Yes. Apple requires the client (or their legal entity) to hold membership for apps in their name. They invite you to the team; you generate a Team Key there.
How do I hand off cleanly at the end of a contract?
Client revokes the Team Key and removes your user account from their team. You delete the connection in AppConsul. Nothing of theirs stays on your machine.
What if the client has no App Store Connect account yet?
They enroll in the Apple Developer Program first. Entity enrollment can take days while Apple verifies them. Budget for it.
Can I keep a record of what I shipped?
Yes — the Versions timeline shows every version, build, and review outcome. Export per-version metadata as JSON for an auditable record.
What if the client wants to take over releases mid-engagement?
Same handoff pattern, just earlier. Walk them through Guided Flows for the operations they'll need; leave them with the submission checklist and the submit-without-rejections guide. When you're out, you revoke your own access.
Manage all your client App Store Connect teams in one window.
Install AppConsul, add each client's Team Key, and stop signing out and back in.
See AppConsul →