For the complete documentation index, see llms.txt. This page is also available as Markdown.

Go to Production

A checklist for the day you switch from test recipients to real ones. Each line links to the page that covers it.

~10 min Β· After your integration works on staging.

Switch from staging to production

Staging and production are separate networks β€” nothing carries over automatically (see What Carries Over). Do these in order:

Staging β†’ Production mapping

What
Staging
Production

Network API

https://staging.network.learncard.com/trpc

https://network.learncard.com/trpc

Profile

Profile created on staging

New profile β€” same seed, same did:key

API tokens

Staging AuthGrant + token

New AuthGrant + token, same scopes

Signing authority

Registered on staging

Must be re-registered on production

Credential templates

lc:network:staging.network.learncard.com/…

New URIs β€” lc:network:network.learncard.com/…

ConsentFlow contracts

Contract created on staging

New contract created on production

Webhook URL(s)

Points at your staging/test listener

Must point at your production listener

Issued credentials

Only exist and are claimable on staging

Independent β€” nothing from staging carries over

When a send fails ambiguously

A network error or timeout from send() doesn't tell you whether the credential was actually issued before the connection dropped. Before retrying:

  1. Check the response first. If you got a response back with activityId, it succeeded β€” don't retry. learncard status <activityId> (or getActivityChain) shows where it got to.

  2. If the call threw or timed out, look for an existing issuance before retrying:

    • Profile/DID recipients β€” getPaginatedBoostRecipients(templateUri) and check whether your recipient is already in the list.

    • Email/phone recipients β€” learnCard.invoke.getMySentInboxCredentials({ query: { boostUri: templateUri, currentStatus: 'PENDING' } }) and check whether an issuance already addresses that contact method.

  3. Only retry if neither check finds an existing record.

Store inbox.issuanceId (and activityId) keyed by your own record ID at send time, and key your webhook processing on issuanceId β€” it stays stable even if you end up sending twice.

TOO_MANY_REQUESTS (429) is always safe to retry with backoff β€” the request was rejected before anything was issued. A 5xx or timeout is not automatically safe: the request may have already been fully processed on the server before the response was lost. See Errors & Limits.

Security

Reliability

Trust

Support

When every box is checked, follow Switch from Staging to Production above, then send to real recipients.

Last updated

Was this helpful?