Graine AI

Going live

From a working integration to a release: the release build's settings, the dashboard's production checklist, the store submissions, the test script on real phones, and what to watch once customers use it.

What changes between the build you tested and the one your customers install, and the checks that prove it works before they do.

What it needs in the dashboard

WhereCheck
Agent → Embed & Widgets → InstallThe production key in the release build; app:// and every website host — staging included — in Allowed domains
Embed & Widgets → AppearanceThe design saved on the Garage's three surfaces; Setup saved
Embed & Widgets → Actions, On screen, FrictionActions declared and saved; components ticked; friction tuned
Agent → Memory → SettingsMemory on; the same Who is the user? field on every agent your users meet
Agent → Calls & schedulingCall name, quiet hours, who may book, the limits; the agent's Calling Window
Workspace settings → In-app callingiOS and Android Checked and working.; iOS environment Automatic (TestFlight and the App Store use production pushes)
The promptHandles who_called (customer, agent, scheduled) and call_reason, and reads well when a variable is empty

What to do, in order

  1. Release build settings: debug logging off; your app's version on every call record; the production publishable key.
  2. Store submissions: Google Play's foreground-service and full-screen-intent declarations; App Store review notes for calls (and leave calls off in the China storefront: Apple does not allow CallKit there) — Permissions → Store review.
  3. Run the test script on an iPhone, two Android phones from different makers, and your website, signed in as a test user — Testing end to end and the guide's QA script.
  4. Log checkActions() once in a debug build: every action the agent may call is registered.
  5. After launch, watch Call History (who each conversation was with, its outcome), the scheduled calls' outcomes, and your webhooks.

The code, platform by platform

#if DEBUG
let debugLogging = true
#else
let debugLogging = false
#endif
 
GraineInApp.configure(GraineConfig(
    baseUrl: "https://www.graine.ai",
    publishableKey: "pk_live_…",                                                  // the production agent's key
    appVersion: Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String,
    debug: debugLogging
))

Check: Push Notifications, Background Modes Audio and Voice over IP, NSMicrophoneUsageDescription, and enableVoIPPushes() at every launch.

Troubleshooting

What you see after releaseWhyFix
Works in debug, refused in the store buildThe release build carries another key, or an agent without app://The production key; app:// in its Allowed domains
iPhones in TestFlight never ringThe APNs environment does not matchEnvironment Automatic in In-app calling
Play rejects the buildMissing foreground-service or full-screen-intent declarationsPermissions → Store review

The fuller list, with what each failure means: Going live.

On this page