Version: 1.0
Last Updated: October 27, 2025
Support: support@flare99.com
This guide enables external companies to integrate their websites with our centralized ticket system (tickets.flare99.com). Users from your platform can seamlessly submit support tickets without re-authenticating.
✅ Single Sign-On (SSO) - Users authenticate once on your platform
✅ Automatic User Sync - User data automatically syncs to ticket system
✅ Cross-Domain Authentication - Secure authentication across different domains
✅ No Password Required - Users don't need separate credentials
✅ Session Persistence - Maintains user session across platforms
We offer three integration approaches based on your needs:
Contact us to register your company and receive:
yourcompany)https://ticket.yourcompany.com (optional custom domain)For each authenticated user, you need:
Add this code to your main layout file (footer, header, or before </body>):
<script>
// Expose authenticated user data to JavaScript
window.authUser = {
email: '{{ $authUser?->email }}',
name: '{{ $authUser?->name }}',
// Add any additional fields you want to pass
};
// Store in localStorage for persistence (optional)
if (window.authUser && window.authUser.email) {
localStorage.setItem('yourcompany_user_email', window.authUser.email);
localStorage.setItem('yourcompany_user_name', window.authUser.name || '');
}
</script>
For Different Frameworks:
<script>
window.authUser = @json([
'email' => Auth::user()?->email,
'name' => Auth::user()?->name,
]);
</script>
<script>
window.authUser = <?php echo json_encode([
'email' => wp_get_current_user()->user_email,
'name' => wp_get_current_user()->display_name,
]); ?>;
</script>
// Set in context or state
const [authUser, setAuthUser] = useState({
email: session?.user?.email,
name: session?.user?.name,
});
// Make available globally
useEffect(() => {
window.authUser = authUser;
}, [authUser]);
Add this JavaScript function to handle ticket creation:
/**
* Redirects user to ticket system with authentication
* @param {Event} e - Click event (optional)
* @param {boolean} openInNewTab - Whether to open in new tab (default: true)
*/
function contactSupport(e, openInNewTab = true) {
if (e) e.preventDefault();
const user = window.authUser;
// Check if user is logged in
if (!user || !user.email) {
// Redirect to login page
alert('Please sign in to submit a support ticket.');
window.location = '/login'; // Adjust to your login URL
return;
}
// Create form for POST request
const form = document.createElement('form');
form.method = 'POST';
form.action = 'https://tickets.flare99.com/api/auth/redirect/yourcompany'; // Replace 'yourcompany'
form.acceptCharset = 'UTF-8';
// Open in new tab (preserves current page)
if (openInNewTab) {
form.target = '_blank';
}
// Add user data as hidden fields
const fields = {
email: user.email,
name: user.name || '',
redirect_url: 'https://ticket.yourcompany.com/dashboard' // Optional
};
for (const [name, value] of Object.entries(fields)) {
const input = document.createElement('input');
input.type = 'hidden';
input.name = name;
input.value = value;
form.appendChild(input);
}
// Submit form
document.body.appendChild(form);
form.submit();
form.remove();
}
Add a clickable element that triggers the function:
<!-- Simple Link -->
<a href="#" onclick="contactSupport(event)">
Submit Support Ticket
</a>
<!-- Button with Icon -->
<button onclick="contactSupport(event)" class="btn btn-primary">
<i class="icon-ticket"></i> Submit Ticket
</button>
<!-- Navigation Menu Item -->
<li class="nav-item">
<a href="#" onclick="contactSupport(event)" class="nav-link">
Support
</a>
</li>
If using AJAX/Fetch instead of form POST, request CORS configuration from us. We'll add your domain to our allowlist:
// This is configured on our end - no action needed from you
'allowed_origins' => [
'https://yourcompany.com',
'https://ticket.yourcompany.com',
],
File: resources/views/partials/footer.blade.php
<footer>
<!-- Your footer content -->
<script>
// Expose user data
window.authUser = @json([
'email' => Auth::user()?->email,
'name' => Auth::user()?->name,
]);
// Store in localStorage
if (window.authUser && window.authUser.email) {
localStorage.setItem('yourcompany_user_email', window.authUser.email);
localStorage.setItem('yourcompany_user_name', window.authUser.name || '');
}
// Contact support function
function contactSupport(e, openInNewTab = true) {
if (e) e.preventDefault();
const user = window.authUser;
if (!user || !user.email) {
@if (Route::has('login'))
window.location = "{{ route('login') }}";
@else
alert('You need to be signed in to contact support.');
@endif
return;
}
const form = document.createElement('form');
form.method = 'POST';
form.action = 'https://tickets.flare99.com/api/auth/redirect/yourcompany';
form.acceptCharset = 'UTF-8';
if (openInNewTab) form.target = '_blank';
const fields = {
email: user.email,
name: user.name ?? ''
};
for (const [name, value] of Object.entries(fields)) {
const input = document.createElement('input');
input.type = 'hidden';
input.name = name;
input.value = value;
form.appendChild(input);
}
document.body.appendChild(form);
form.submit();
form.remove();
}
</script>
</footer>
async function contactSupportAjax() {
const user = window.authUser;
if (!user || !user.email) {
alert('Please sign in to submit a support ticket.');
window.location = '/login';
return;
}
try {
const response = await fetch('https://tickets.flare99.com/api/auth/redirect/yourcompany', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
},
credentials: 'include', // Important for cookies
body: JSON.stringify({
email: user.email,
name: user.name || '',
redirect_url: 'https://ticket.yourcompany.com/dashboard'
})
});
if (response.redirected) {
// Open redirect URL in new tab
window.open(response.url, '_blank');
} else {
const data = await response.json();
console.log('Response:', data);
}
} catch (error) {
console.error('Error:', error);
alert('Failed to connect to support system. Please try again.');
}
}
File: footer.php
<footer>
<!-- Footer content -->
<script>
<?php if (is_user_logged_in()): ?>
window.authUser = {
email: '<?php echo esc_js(wp_get_current_user()->user_email); ?>',
name: '<?php echo esc_js(wp_get_current_user()->display_name); ?>'
};
if (window.authUser && window.authUser.email) {
localStorage.setItem('yourcompany_user_email', window.authUser.email);
localStorage.setItem('yourcompany_user_name', window.authUser.name || '');
}
<?php else: ?>
window.authUser = null;
<?php endif; ?>
function contactSupport(e, openInNewTab = true) {
if (e) e.preventDefault();
const user = window.authUser;
if (!user || !user.email) {
alert('Please sign in to submit a support ticket.');
window.location = '<?php echo wp_login_url(); ?>';
return;
}
const form = document.createElement('form');
form.method = 'POST';
form.action = 'https://tickets.flare99.com/api/auth/redirect/yourcompany';
form.acceptCharset = 'UTF-8';
if (openInNewTab) form.target = '_blank';
const fields = {
email: user.email,
name: user.name || ''
};
for (const [name, value] of Object.entries(fields)) {
const input = document.createElement('input');
input.type = 'hidden';
input.name = name;
input.value = value;
form.appendChild(input);
}
document.body.appendChild(form);
form.submit();
form.remove();
}
</script>
</footer>
import React, { useEffect, useState } from 'react';
const SupportButton = ({ user }) => {
useEffect(() => {
// Expose user to global scope
window.authUser = user;
if (user?.email) {
localStorage.setItem('yourcompany_user_email', user.email);
localStorage.setItem('yourcompany_user_name', user.name || '');
}
}, [user]);
const contactSupport = (e) => {
e.preventDefault();
if (!user || !user.email) {
alert('Please sign in to submit a support ticket.');
window.location = '/login';
return;
}
const form = document.createElement('form');
form.method = 'POST';
form.action = 'https://tickets.flare99.com/api/auth/redirect/yourcompany';
form.acceptCharset = 'UTF-8';
form.target = '_blank';
const fields = {
email: user.email,
name: user.name || ''
};
Object.entries(fields).forEach(([name, value]) => {
const input = document.createElement('input');
input.type = 'hidden';
input.name = name;
input.value = value;
form.appendChild(input);
});
document.body.appendChild(form);
form.submit();
form.remove();
};
return (
<button
onClick={contactSupport}
className="btn btn-primary"
>
Submit Support Ticket
</button>
);
};
export default SupportButton;
Secure and HttpOnlySameSite=None; SecurecontactSupport() function defined// Test 1: Check user data
console.log('User Data:', window.authUser);
// Test 2: Check localStorage
console.log('Stored Email:', localStorage.getItem('yourcompany_user_email'));
console.log('Stored Name:', localStorage.getItem('yourcompany_user_name'));
// Test 3: Manually trigger function
contactSupport(null, false); // Opens in same tab for testing
tickets.flare99.comSymptoms: Console shows window.authUser is null or undefined
Solution:
// Check if user authentication is working
console.log('Auth User:', window.authUser);
// Verify session/authentication
// Laravel: Auth::check()
// WordPress: is_user_logged_in()
Symptoms: Access-Control-Allow-Origin error in console
Solutions:
Symptoms: Redirect fails with "Token expired" message
Solution:
Symptoms: User redirected but must login again
Solutions:
SameSite cookie settingsSymptoms: Clicking button has no effect
Solutions:
// Check function is defined
console.log(typeof contactSupport); // Should output "function"
// Check for JavaScript errors
// Open DevTools Console tab
// Look for red error messages
// Verify event handler
document.querySelector('your-button-selector').onclick = contactSupport;
Authenticates user and redirects to tenant-specific ticket system.
URL: /api/auth/redirect/{tenant}
Method: POST
Headers:
Content-Type: application/json
Accept: application/json
Body Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
email |
string | Yes | User's email address |
name |
string | Yes | User's full name |
redirect_url |
string | No | URL to redirect after auth (default: dashboard) |
Example Request:
{
"email": "user@example.com",
"name": "John Doe",
"redirect_url": "https://ticket.yourcompany.com/tickets/create"
}
Success (302 Redirect):
HTTP/1.1 302 Found
Location: https://ticket.yourcompany.com/auth/callback?token=encrypted_token
Error (422 Validation Error):
{
"message": "The given data was invalid.",
"errors": {
"email": ["The email field is required."],
"name": ["The name field is required."]
}
}
Error (404 Not Found):
{
"message": "Tenant not found.",
"error": "The specified tenant does not exist."
}
Error (429 Too Many Requests):
{
"message": "Too many requests.",
"retry_after": 60
}
X-RateLimit-Limit: 60X-RateLimit-Remaining: 59By integrating with our ticket system, you agree to:
For full terms of service, visit: https://tickets.flare99.com/terms
Thank you for choosing our ticket system! We're here to help. 🎫