In-app chat

Support in je app, zonder SDK

Eén URL in een WebView. Geen pakket om te installeren, geen build die kan breken, en elk gesprek komt in dezelfde inbox terecht als de rest van je support.

01 · Wat het is
Het korte antwoord

In-app chat in inrelay is een gehoste chatpagina op het adres van je eigen helpcentrum. Richt een WebView op /chat en je iOS-, Android- of React Native-app bevat livechat, AI-antwoorden en je kennisbankartikelen — zonder SDK, zonder afhankelijkheden en zonder dat er een app-store-release nodig is om iets te wijzigen.

De pagina is dezelfde chat die je websitebezoekers gebruiken, maar dan schermvullend getoond in plaats van in een bubbel. Dat betekent dat het alles overneemt wat je al hebt ingesteld: je merkstijl en accentkleur, je openingstijden, de AI-chatbot en de kennis daarvan, het leadformulier en de inbox waarin je team al werkt. Het inschakelen is geen project — het adres bestaat zodra livechat aan staat.

Het is inbegrepen in elk pakket. Er is geen mobiele add-on, geen kosten per gesprek en niets wat je moet kopen voordat je het kunt proberen.

Looping animation: one hosted address, help.acme.com/chat, fans out into a chat bubble on a website and a full-screen chat inside an app, and ends marked already live.
02 · Je adres

Eén URL, drie optionele details

Je chatpagina staat op /chat op het adres van je helpcentrum — het aangepaste domein als je er een hebt gekoppeld, anders het .inrelay.support-adres dat je hebt geclaimd. Je vindt de exacte URL, klaar om te kopiëren, in Instellingen → Helpwidget → In je mobiele app.

https://support.yourbrand.com/chat

Die URL op zich is een volledige integratie: een bezoeker kan anoniem chatten, en het gesprek volgt hen wanneer de app opnieuw wordt geopend op dat apparaat. Als je app weet wie de gebruiker is, kun je dat doorgeven met drie queryparameters — allemaal optioneel, allemaal veilig om weg te laten:

  • token_id — je eigen ondoorzichtige, willekeurige id voor deze gebruiker. Dit is wat hun gesprek herstelt op een nieuw apparaat of na opnieuw installeren.
  • email — zodat een antwoord hen kan bereiken wanneer de app gesloten is.
  • name — zodat je team weet wie ze helpen.
https://support.yourbrand.com/chat?token_id=8f2c…&email=ada%40example.com&name=Ada%20Lovelace

Codeer de waarden voor de URL. Tenzij je geverifieerde identiteit inschakelt (hieronder), moet je token_id als een geheim behandelen: wie er een heeft, kan dat gesprek hervatten. Genereer dus lange willekeurige waarden — nooit een e-mailadres, gebruikersnaam of opeenvolgend ID.

03 · De recepten

Drie manieren om het te openen

Elk hiervan is de volledige integratie. De twee instellingen die op elk platform van belang zijn, zijn JavaScript en DOM-opslag — DOM-opslag zorgt ervoor dat het gesprek van een bezoeker bewaard blijft wanneer de app opnieuw wordt geopend.

iOS — WKWebView

import UIKit
import WebKit

final class SupportViewController: UIViewController {
  private let webView = WKWebView(frame: .zero, configuration: WKWebViewConfiguration())

  override func viewDidLoad() {
    super.viewDidLoad()
    webView.frame = view.bounds
    webView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    webView.scrollView.bounces = false
    view.addSubview(webView)

    var url = URLComponents(string: "https://support.yourbrand.com/chat")!
    url.queryItems = [
      URLQueryItem(name: "token_id", value: user.supportToken),
      URLQueryItem(name: "email", value: user.email),
      URLQueryItem(name: "name", value: user.fullName)
    ]
    webView.load(URLRequest(url: url.url!))
  }
}

Android — WebView

class SupportActivity : AppCompatActivity() {
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val webView = WebView(this)
    setContentView(webView)

    webView.settings.javaScriptEnabled = true
    webView.settings.domStorageEnabled = true   // keeps the conversation across launches
    webView.webViewClient = WebViewClient()     // keep navigation inside the WebView

    val url = Uri.parse("https://support.yourbrand.com/chat")
      .buildUpon()
      .appendQueryParameter("token_id", user.supportToken)
      .appendQueryParameter("email", user.email)
      .appendQueryParameter("name", user.fullName)
      .build()
    webView.loadUrl(url.toString())
  }
}

React Native — react-native-webview

import { SafeAreaView } from 'react-native'
import { WebView } from 'react-native-webview'

const params = new URLSearchParams({
  token_id: user.supportToken,
  email: user.email,
  name: user.fullName
})

export function SupportScreen() {
  return (
    <SafeAreaView style={{ flex: 1 }}>
      <WebView
        source={{ uri: `https://support.yourbrand.com/chat?${params}` }}
        javaScriptEnabled
        domStorageEnabled
        originWhitelist={['https://support.yourbrand.com/*']}
      />
    </SafeAreaView>
  )
}

Geef de WebView het volledige scherm en laat deze het scrollen zelf afhandelen — de pagina is al op formaat gemaakt voor een telefoon, inclusief de safe area aan de onderkant.

Koppel de allowlist aan je eigen adres, met de schuine streep aan het einde. Een patroon zoals https://* zorgt ervoor dat elke site in je supportscherm kan worden weergegeven, en een patroon zonder schuine streep — https://support.yourbrand.com* — komt ook overeen met support.yourbrand.com.example.net. Als je de URL zelf ook controleert, vergelijk dan de geparste herkomst in plaats van een voorvoegsel te testen.

04 · Geverifieerde identiteit

Bewijs dat ze het echt zelf zijn

Optioneel, standaard uitgeschakeld, en een schakelaar in plaats van een migratie: elke werkruimte heeft al een ondertekeningsgeheim klaarstaan in Instellingen → Helpwidget.

The In your mobile app settings block with the verification toggle

Met verificatie ingeschakeld moeten de gegevens die je app doorgeeft aankomen met een handtekening die door jouw server is gegenereerd. Alles wat niet ondertekend is — of ondertekend voor een andere gebruiker — wordt genegeerd: de chat opent nog steeds, maar is simpelweg anoniem. Het crasht nooit hard, want een supportscherm dat niet laadt, is erger dan een scherm dat je naam niet kent.

Onderteken exact deze tekenreeks, waarbij je de drie waarden samenvoegt met regeleinden en een lege tekenreeks gebruikt voor alles wat je weglaat:

token_id + "\n" + email + "\n" + name
// on your server, never in the app binary
import { createHmac } from 'node:crypto'

const payload = [tokenId, email ?? '', name ?? ''].join('\n')
const signature = createHmac('sha256', INRELAY_EMBED_SECRET)
  .update(payload)
  .digest('hex')

Voeg het toe als &signature=…. Onderteken de waarden precies zoals je ze in de URL zet — geen spaties verwijderen, geen kleine letters van maken — en onderteken alle drie: een handtekening die alleen het token dekt, valideert geen verzoek waarvan het e-mailadres verschilt. Waarden met regeleinden worden geweigerd.

  • Het geheim staat op jouw server en wordt door de onze gelezen. Het hoort nooit thuis in de binary van je app, waar iedereen het kan achterhalen.
  • Haal de handtekening op van je eigen geauthenticeerde eindpunt wanneer de gebruiker support opent, en bouw daarna de URL op.
  • Schakel verificatie in voordat je lanceert, als je dat van plan bent. Het achteraf toevoegen als je gebruikers al chatten betekent dat elk token opnieuw moet worden uitgegeven.
05 · Wanneer de app gesloten is

Antwoorden bereiken hen via e-mail

Iemand stelt een vraag, sluit je app, en je team antwoordt tien minuten later. Het antwoord wordt gemaild naar het adres van het gesprek — vanuit de identiteitsparameters van de app, of vanuit het e-mailadres dat in de chat is gevraagd — en wanneer ze support opnieuw openen, staat het hele gesprek er nog.

Laten we eerlijk zijn over de vorm: er zijn geen in-app pushmeldingen in deze versie. Er is geen SDK om een apparaattoken bij te registreren, dus een antwoord kan de badge van je app niet laten oplichten. E-mail is de bezorgroute, en een klant die een adres heeft achtergelaten hoort altijd iets terug.

  • Het gesprek blijft bewaard op het apparaat en volgt een token_id naar een nieuw apparaat.
  • Alles wat de bezoeker ziet, is de geleverde chat: AI-antwoorden, je kennisbankartikelen, je openingstijden.
  • In-app pushmeldingen maken geen deel uit van deze versie — antwoorden komen binnen via e-mail wanneer de app gesloten is.
  • Er worden geen native chat-UI en platform-SDK's meegeleverd. Dit is bewust een gehoste pagina in een WebView.
06 · Instellen

Live in vier stappen

Schakel livechat in

Instellingen → Helpwidget. Als je websitewidget al chat, ben je klaar met deze stap.

Kopieer je chat-URL

Het blok “In je mobiele app” bevat het, met een kopieerknop. Claim eerst een helpcenter-adres als je een eigen domein wilt.

Open het in een WebView

Plak een van de bovenstaande recepten in je supportscherm. Schakel JavaScript en DOM-storage in.

Identiteit toevoegen, als je dat wilt

Geef een token, e-mailadres en naam mee — en schakel verificatie met de handtekening in wanneer je er klaar voor bent.

07 · Nauw verwant

De rest van de inbox.

In-app chat is één toegangspoort tot de functionaliteiten van inrelay — dit zijn de functies waar het op leunt.

Start vandaag

Jouw app, met support erin.

Gratis te starten met je eigen inbox — alle functies, geen creditcard nodig, nooit per gebruiker.

Vragen, beantwoord.

Moet ik een dependency toevoegen aan mijn app?
Nee. Er is geen inrelay-pakket voor iOS, Android, React Native of Flutter — je opent een URL in de WebView die je platform al meelevert. Niets om bij te werken en geen versie van ons die gelijke tred moet houden met de jouwe.
Wat gebeurt er als ik helemaal geen parameters meegeef?
Chat werkt. De bezoeker is anoniem, het gesprek blijft behouden op dat apparaat en de chat vraagt zelf om een e-mailadres als je leadformulier aan staat — zo kan een antwoord hen alsnog bereiken.
Kan iemand anders een gesprek lezen als diegene een token raadt?
Als verificatie uit staat, kan iedereen met een geldige token_id dat gesprek hervatten — daarom moeten tokens lang en willekeurig zijn, en daarom bestaat de verificatieschakelaar. Als deze aan staat, wordt een niet-ondertekend token volledig genegeerd.
Krijgt de klant een pushmelding wanneer we antwoorden?
Niet in deze versie. Antwoorden bereiken hen per e-mail terwijl de app gesloten is, en het gesprek staat klaar wanneer ze support opnieuw openen. In-app pushberichten zouden een SDK vereisen, en dat is juist wat deze aanpak bewust vermijdt.
Zit in-app chat in elk pakket?
Ja. Het is dezelfde live chat die je al hebt, geserveerd als pagina — er is geen mobiele add-on en geen tarief per gesprek.

Krijg grip op je DM's.

Geef je klanten sneller antwoord en je team hun avonden terug.

Desktop en mobiel. Gratis voor solo.