ZelSafe Enterprise MDMRocheston · Configuration Guide
🚀 Deploy
Rocheston · ZelSafe · Enterprise

Enterprise MDM Configuration Guide

Apple MDM · Managed App Configuration · Offline-First App

Push the profile. Keep the privacy.

This guide shows employers how to deliver identity, organization, language, and visual-style settings to ZelSafe using Apple Managed App Configuration. ZelSafe still runs offline-first: learning progress, quiz results, audio completion, audit logs, and certificates remain local to the device unless the learner exports them.

Apple MDMJamf, Intune, Kandji, Mosyle & more
Managed ConfigStandard managed app configuration keys
Tenant StylesCompany branding via visual-style packs
Offline-FirstProgress stays on the device
/ 01

What employers can configure

👤 Employee identity

Pre-fill the employee name, email, and organization so greetings, certificates, and local audit exports use the right company context.

🌐 Language access

Set a default language and limit which installed or downloadable language packs employees are allowed to see.

🎨 Visual style access

Set a tenant-specific default visual style and restrict the Visual Style screen to approved styles.

🛟 Support metadata

Store support phone, email, URL, HR destination email, tenant ID, and campaign code values for local enterprise context and exports.

🏢Employer MDM ConsoleJamf, Intune, Kandji, Mosyle… pushes the managed app configuration keys
APPLE MDM
📱ZelSafe on managed iPhoneReads identity, language, visual style & support keys locally at launch
IF PACK NEEDED
☁️ZelSafe CDNDownloads allowed language / visual-style packs — MDM never installs content
NO SYNC
🛰️Tracking ServerProgress, quizzes, audio & scores never leave the device automatically
📌

Important: MDM does not install content packs. If a language or visual style is allowed but not bundled in the app, the matching pack must already be available through the ZelSafe CDN for the user to download. Customer logo, display text, and action links come from the selected visual-style pack, not directly from MDM.

/ 02

Recommended MDM payload

Add these keys to the MDM provider's managed app configuration for the ZelSafe iOS app. Most MDM systems provide either a key/value form or an XML property-list editor.

managed-app-configuration.json
{
  "EmployeeName": "Haja Mo",
  "EmployeeEmail": "[email protected]",
  "organization_name": "Citibank",
  "tenant_id": "citibank-us",
  "default_language": "en",
  "allowed_languages": ["en", "fr", "de"],
  "default_visual_style": "vs-citibank",
  "allowed_visual_styles": ["vs-citibank"],
  "support_phone": "+18005550100",
  "support_email": "[email protected]",
  "support_url": "https://security.citibank.example",
  "HREmail": "[email protected]",
  "zelsafe_private_dashboard": "https://rocheston.com/zpd",
  "zelsafe_private_dashboard_pin": "1234",
  "CampaignCode": "rccs-2026-q3"
}
/ 03

Copy/paste samples

Use these samples as starting points. Replace the company, tenant, support, and campaign values before deployment.

Sample A

Locked tenant deployment. Best for a company that wants employees to see only its branded visual style and approved languages.

locked-tenant.json
{
  "EmployeeName": "First Last",
  "EmployeeEmail": "[email protected]",
  "organization_name": "Citibank",
  "tenant_id": "citibank-us",
  "default_language": "en",
  "allowed_languages": ["en", "fr", "de"],
  "default_visual_style": "vs-citibank",
  "allowed_visual_styles": ["vs-citibank"],
  "support_phone": "+18005550100",
  "support_email": "[email protected]",
  "support_url": "https://security.citibank.example",
  "HREmail": "[email protected]",
  "zelsafe_private_dashboard": "https://rocheston.com/zpd",
  "zelsafe_private_dashboard_pin": "1234",
  "CampaignCode": "citibank-rccs-2026-q3"
}
Sample B

Language restriction only. Best when the employer does not need a custom visual style but wants to control which languages appear.

language-only.json
{
  "organization_name": "Acme Corporation",
  "tenant_id": "acme-global",
  "default_language": "en",
  "allowed_languages": ["en", "fr", "de"],
  "CampaignCode": "acme-awareness-2026"
}
Sample C

Custom visual style only. Best when the app should remain English but use a company-specific visual style and branding pack.

style-only.json
{
  "organization_name": "Citibank",
  "tenant_id": "citibank-us",
  "default_language": "en",
  "allowed_languages": ["en"],
  "default_visual_style": "vs-citibank",
  "allowed_visual_styles": ["vs-citibank"]
}
Sample D

Pilot group. Best for a small pilot where the employer wants employee identity and campaign tracking but no restrictions.

pilot.json
{
  "EmployeeName": "First Last",
  "EmployeeEmail": "[email protected]",
  "organization_name": "Pilot Company",
  "tenant_id": "pilot-company",
  "zelsafe_private_dashboard": "https://rocheston.com/zpd",
  "zelsafe_private_dashboard_pin": "1234",
  "CampaignCode": "pilot-2026"
}
/ 04

Supported keys

KeyTypeRequiredWhat ZelSafe Does
EmployeeNameStringRecommendedPre-fills the employee name. Used in app personalization, certificates, and local audit exports.
EmployeeEmailStringOptionalPre-fills the employee email. Also accepts LearnerEmail or Email.
organization_nameStringRecommendedPre-fills the organization/company field. Also accepts OrgName, OrganizationName, Organization, CompanyName, or Company.
tenant_idStringRecommendedStores a stable tenant identifier such as citibank-us. Also accepts TenantID or TenantId.
default_languageStringOptionalSelects the default language at launch and writes it to the selected language setting. Also accepts DefaultLanguage.
allowed_languagesArray of strings, or comma-separated stringOptionalOnly listed languages appear in the Language screen. Also accepts AllowedLanguages.
default_visual_styleStringRecommended for branded deploymentsSelects the tenant style and writes it to the selected visual style setting. Also accepts DefaultVisualStyle and normalizes citibank to vs-citibank.
allowed_visual_stylesArray of strings, or comma-separated stringRecommended for branded deploymentsOnly listed visual styles appear in the Visual Style screen. Also accepts AllowedVisualStyles and normalizes values to vs-....
support_phoneStringOptionalStores enterprise support phone metadata. Also accepts SupportPhone.
support_emailStringOptionalStores enterprise support email metadata. Also accepts SupportEmail.
support_urlStringOptionalStores enterprise support website metadata. Also accepts SupportURL or SupportUrl.
HREmailStringOptionalPre-fills a destination email used when the learner exports or shares employer-facing training records.
zelsafe_private_dashboardHTTPS URL stringOptionalEnables a learner-controlled upload button on the RCCS certificate sharing screen. Also accepts ZelSafePrivateDashboard, PrivateDashboardURL, or PrivateDashboardUrl. The URL must use https://.
zelsafe_private_dashboard_pin4-digit stringOptionalProvides the organization PIN for the private dashboard upload endpoint. Also accepts ZelSafePrivateDashboardPIN, PrivateDashboardPIN, or PrivateDashboardPin. The app sends this value as multipart field zpd_pin beside the audit JSON file.
CampaignCodeStringOptionalStores the employer campaign or rollout code for local export context. Also accepts CampaignID or CampaignId.
/ 05

Apple managed configuration plist example

Some MDM tools ask for XML plist instead of JSON. The values below are equivalent to the recommended payload.

managed-configuration.plist
<dict>
  <key>EmployeeName</key>               <string>Haja Mo</string>
  <key>EmployeeEmail</key>              <string>[email protected]</string>
  <key>organization_name</key>          <string>Citibank</string>
  <key>tenant_id</key>                  <string>citibank-us</string>
  <key>default_language</key>           <string>en</string>
  <key>allowed_languages</key>
  <array>
    <string>en</string>
    <string>fr</string>
    <string>de</string>
  </array>
  <key>default_visual_style</key>       <string>vs-citibank</string>
  <key>allowed_visual_styles</key>
  <array>
    <string>vs-citibank</string>
  </array>
  <key>support_phone</key>              <string>+18005550100</string>
  <key>support_email</key>              <string>[email protected]</string>
  <key>support_url</key>                <string>https://security.citibank.example</string>
  <key>HREmail</key>                    <string>[email protected]</string>
  <key>zelsafe_private_dashboard</key>  <string>https://rocheston.com/zpd</string>
  <key>zelsafe_private_dashboard_pin</key> <string>1234</string>
  <key>CampaignCode</key>               <string>rccs-2026-q3</string>
</dict>
/ 06

Visual style branding pack

The MDM profile points the employee to a visual style, such as vs-citibank. The actual logo, branding text, and clickable support links live inside that visual-style pack. ZelSafe reads the pack from the selected visual-style language-pack folder. If a visual-style card image is missing, the app falls back to the regular bundled English card image.

🔑MDM Profiledefault_visual_style: vs-citibank
SELECTS
📦Visual Style Packlanguage_packs/vs-citibank/ from the ZelSafe CDN
RENDERS
🎨Branded Card ViewLogo, top/bottom text & support links from the pack — not from MDM
Pack folder structure
language_packs/vs-citibank/
  zelcards/
    01-scams-and-phishing/
      content/
        Matching English Card Filename.jpg
      today/
        Optional Today overrides
  branding/
    logo.png
    branding.json
branding.json
{
  "logo": "logo.png",
  "top_text": "Citibank Security Awareness",
  "bottom_text": "If you suspect fraud, call Security Hotline: +1-800-555-0100",
  "links": [
    { "label": "Call Security",  "type": "phone", "value": "+18005550100" },
    { "label": "Report Online", "type": "url",   "value": "https://security.citibank.example" },
    { "label": "Email Security","type": "email", "value": "[email protected]" }
  ]
}

Branding pack rules

  • Logo only is valid. If the pack contains only branding/logo.png, ZelSafe displays just the logo.
  • ZelSafe also accepts logo.jpg, logo.jpeg, or logo.webp when branding.json does not name a logo.
  • top_text can also be supplied as branding/top.txt.
  • bottom_text can also be supplied as branding/bottom.txt or branding/text.txt.
  • Logo files should be compressed for fast download. ZelSafe scales the logo to a safe display size.
  • Link type must be exactly phone, url, or email.
  • For phone links, ZelSafe keeps only digits and + before opening the phone URL.
  • For url links, include https:// or provide a host; ZelSafe adds https:// if no scheme is present.
  • For email links, provide a normal email address. ZelSafe opens a mail URL.
/ 07

Text & markdown-like formatting

MDM values are plain strings, arrays, or comma-separated strings. Do not put Markdown in MDM keys. The formatting below applies to ZelSafe content files such as sample-scam/scenario text inside language packs.

FormatSupportedExample
Bold inline textYesNever share **verification codes** with anyone.
Underlined/link-style inline textYesVisit <u>https://example.test</u> only in training examples.
Recognized headingsYesWHAT IT IS, SAMPLE SCAM, SAMPLE SCENARIO, SAMPLE (...), EXAMPLE
Blank linesYesUse blank lines to separate readable blocks of scenario text.
General MarkdownNoLists, tables, images, headings with #, and Markdown links are not parsed by the app renderer.
Sample scam text example
SAMPLE SCAM TEXT

Bank Verification Alert
"Your account is locked. Confirm your identity at <u>secure-bank-login.example</u>."

WHAT IT IS

This is a credential phishing attempt. The attacker uses urgency
and a fake website to steal **login details**.
/ 08

Completion, mastery & certificates

🎧Audio walkthrough completedRecorded as audio-completion evidence
+AND
Card quiz passedRecorded as quiz evidence
ONLY THEN
🏅Card masteredCards without a quiz complete via their audio/study flow

The rules

  • A card with an associated quiz is mastered only after the learner completes the audio walkthrough and passes the card quiz.
  • Passing the quiz alone records the quiz result, but does not fully master the card until audio is completed.
  • Finishing the audio alone records audio completion, but does not fully master a card that still has a quiz requirement.
  • Cards without a quiz can be treated as completed by their audio/study flow.
  • Local audit logs include study time, audio seconds, audio-completed timestamp, quiz-passed timestamp, and completion status when available.
  • RCCS and completion certificates are generated locally from the device's current progress and profile details.
  • ZelSafe does not upload completion data to Rocheston or to an employer server.
/ 09

ZelSafe Private Dashboard upload

If the MDM profile includes zelsafe_private_dashboard with a valid HTTPS URL and zelsafe_private_dashboard_pin with a 4-digit PIN, ZelSafe shows Upload Results to ZelSafe Private Dashboard on the RCCS certificate sharing screen. The learner must press the button and confirm the upload. ZelSafe does not upload automatically.

🎓Certificate Sharing ScreenLearner taps "Upload Results" and confirms — never automatic
POST · MULTIPART
🖥️ZPD HTTPS Endpointzpd_pin field + file = audit JSON only
2XX + JSON
Accepted{"accepted": true} — reference id & message shown to the learner
ItemBehavior
EndpointThe value of zelsafe_private_dashboard. It must be a valid https:// URL with a host.
HTTP methodPOST
Body formatmultipart/form-data
PIN fieldzpd_pin, copied from the MDM value zelsafe_private_dashboard_pin. The dashboard should reject incorrect PINs with HTTP 403.
File fieldfile
File content typeapplication/json
Uploaded dataOnly the locally generated audit JSON file from the employer/RCCS certificate package. The PDF certificate, screenshots, app database, and media files are not uploaded.
Timeout30 seconds.
SuccessA 2xx HTTP response with JSON containing "accepted": true. Optional submitted_at, reference_id, and message values are displayed or stored by ZelSafe.
Example server request
POST /zpd HTTP/1.1
Host: rocheston.com
Content-Type: multipart/form-data; boundary=ZelSafeBoundary...
Accept: application/json

--ZelSafeBoundary...
Content-Disposition: form-data; name="zpd_pin"

1234
--ZelSafeBoundary...
Content-Disposition: form-data; name="file";
  filename="ZelSafe-Audit-Log.json"
Content-Type: application/json

{ "certificate": { ... }, "auditLog": [ ... ] }
--ZelSafeBoundary...--
Required JSON response
{
  "accepted": true,
  "submitted_at": "2026-07-28T10:45:00Z",
  "reference_id": "ZPD-20260728-001",
  "message": "Audit JSON accepted."
}
🔁

No automatic retries: ZelSafe does not retry in the background. The learner can press upload again after fixing the connection or after the dashboard service is restored.

Error handling

  • If the URL is missing, malformed, non-HTTPS, or has no host, or if the PIN is missing or not 4 digits, the upload button is disabled or the learner sees a configuration error.
  • If ZelSafe cannot generate the audit JSON file, the learner sees a preparation error and no network request is sent.
  • If the network is unavailable, DNS fails, TLS fails, or the request times out, ZelSafe shows the system network error.
  • If the server returns a non-2xx response, ZelSafe shows the HTTP status and any readable server message.
  • If the server returns 2xx but does not return JSON with "accepted": true, ZelSafe treats the upload as rejected.
/ 10

MDM provider steps

1 · Catalog
Add ZelSafe from Apple Business Manager or Apple School Manager to the MDM app catalog.
2 · Assign
Assign ZelSafe to the employee device or employee group.
3 · Configure
Open the app's managed app configuration section.
4 · Add keys
Add the keys from this guide as JSON, plist, or key/value entries, depending on the MDM tool.
5 · Style
Set default_visual_style to the tenant style, for example vs-citibank.
6 · Restrict styles
Set allowed_visual_styles to only the approved tenant styles.
7 · Restrict languages
Set allowed_languages to only languages approved for that rollout.
8 · ZPD (optional)
Set zelsafe_private_dashboard to the employer's HTTPS upload endpoint and zelsafe_private_dashboard_pin to the 4-digit PIN expected by that endpoint.
9 · Deploy
Save the profile, deploy it, then launch ZelSafe on a managed iPhone or iPad.

Expected result: the employee sees only the allowed languages and visual styles. The default language and tenant style are selected automatically when the profile is present.

/ 11

Validation checklist

  • Language screen: only approved languages are visible.
  • Visual Style screen: only approved visual styles are visible.
  • Branding: tenant logo and text appear in card detail view if the visual style pack includes branding.
  • Profile: employee name, email, and organization are pre-filled.
  • Certificate: employee and organization details appear correctly after the learner exports or generates the certificate locally.
  • Mastery: cards with quizzes require both completed audio and a passed quiz before they count as mastered.
  • Private dashboard: if zelsafe_private_dashboard and zelsafe_private_dashboard_pin are configured, the RCCS certificate sharing screen shows the upload button and asks before uploading the audit JSON file.
  • If a style is allowed but not installed: publish the style pack to the ZelSafe CDN so the app can download it.
/ 12

Privacy notes

  • ZelSafe reads managed configuration locally from iOS.
  • ZelSafe does not require a learner tracking server for card, quiz, audio, or score progress.
  • Reports and certificates are generated locally on the device.
  • Private dashboard upload is learner-initiated and sends only the generated audit JSON file to the HTTPS endpoint supplied by the employer's MDM profile.
  • The learner controls sharing unless the employer separately manages device sharing policies through MDM.

One profile. Branded, restricted, private.

Push the managed configuration, publish your style pack, and every managed device opens ZelSafe in your company's context.