Integration status page: show sync health and next steps
Learn how to build an integration status page that shows sync health, last run time, error details, and clear next steps when third-party APIs fail.

Why customers need to see sync status
When a customer opens your app and the numbers look wrong, they rarely think “sync job is delayed.” They think the product is broken, their teammate changed something, or they made a mistake. That confusion is what turns a small integration hiccup into a support ticket, a churn risk, or a long email thread.
A customer-visible status page removes guesswork. It answers the one question people really have: “Is my data up to date, and if not, what should I do?” Without that clarity, customers will retry actions, re-connect accounts, or change settings that were never the problem.
It also helps customers tell the difference between two very different situations:
- An outage: the third-party service is down or rejecting requests, so syncing cannot succeed right now.
- A delayed sync: syncing works, but the next run is queued, rate-limited, or taking longer than usual.
Those two cases need different expectations. During an outage, the best next step may be “wait, we will retry automatically.” During a delay, the best next step may be “your next sync is scheduled” or “you can run it now.”
“Good” for an integration status page means a customer can understand the situation in under 10 seconds and take a safe action without contacting support. It should:
- Build trust with a clear health signal and a recent timestamp
- Reduce repeat questions like “Did it sync?” and “Is it stuck?”
- Offer a specific next step that will not make things worse
- Keep blame out of the UI while still being honest
Example: A sales manager expects new leads from a CRM to appear before a meeting. If the page shows “Last successful sync: 12 minutes ago” and “Next run: in 3 minutes,” they can stop refreshing and move on. If it shows “Needs attention: reconnect required,” they know exactly what to fix.
What a customer-visible status page should answer
A customer-visible integration status page exists to stop guesswork. When a sync looks “stuck,” people want clear answers without needing to open a support ticket.
The page should answer a small set of questions, in plain words:
- Is the integration working right now?
- When was the last successful sync?
- What failed, and how big is the impact (all data or just part of it)?
- What can I do next to fix it or reduce the damage?
It also helps to be clear about who you’re speaking to. An admin needs enough detail to take action (reconnect, retry, change permissions). An end user usually just needs reassurance and a timeline. Support teams need a quick summary they can screenshot and send back.
Where should it live? Ideally, it’s easy to find from the place the problem shows up. Many products put it in both locations:
- Inside the feature that depends on the integration (a small “Sync status” panel)
- In Settings or Integrations (a full status view with history)
Set expectations about what you will and will not show. Customers should see the health, timing, and a human-readable reason, but not raw stack traces, internal service names, or private payload data. If you need deeper diagnostics, keep those for internal logs and attach a short reference ID on the customer page.
If you’re building this in AppMaster, aim for a simple first version: a status record (health, last run, last success, message, next action) and a page that reads it. You can expand later, but the answers above are the minimum that make the page useful.
Key fields to show at a glance
A good integration status page is readable in five seconds. The goal is not to explain every technical detail. It is to help a customer answer: “Is it working right now, and what changed?”
Start with a single status summary that uses plain labels: Healthy, Degraded, Down, or Paused. Keep the rules consistent. For example, “Degraded” might mean some records fail but most still sync, while “Paused” means syncing is intentionally stopped (by the customer or by your system).
Right under the summary, show the three times people care about most. Use both a readable timestamp and a relative time (“12 minutes ago”), and always show the timezone.
Here are the fields that usually earn a permanent spot at the top of an integration status page:
- Status summary (Healthy, Degraded, Down, Paused) with a one-line reason
- Last successful sync (time and relative)
- Last attempted run (even if it failed)
- Next scheduled run (or “manual” if there is no schedule)
- Simple counts for the last run: processed, failed, skipped
Counts should be helpful, not noisy. Prefer small, stable numbers over deep breakdowns. “Processed 1,240, Failed 18, Skipped 6” is enough for most customers.
A concrete example: if a customer sees “Degraded” plus “Last successful sync: 2 hours ago” and “Last attempted run: 3 minutes ago (failed)”, they immediately know the system is trying, but not succeeding. Add “Next scheduled run: in 15 minutes” and they know whether to wait or act.
Error details that help without oversharing
When something breaks, customers want a clear answer, not a mystery code. On an integration status page, start with a plain-language error title that matches what they can do next. “Auth expired” or “Permission removed” beats “401” because it points to a fix.
Follow the title with one short reason and the scope of impact. Scope can be as simple as: which integration (for example, “Salesforce”), what part is affected (“Contacts sync only”), and whether data is delayed or missing. This keeps the message useful without turning the page into a troubleshooting console.
A good pattern is a small “Details” view that’s safe to share with support. It should include only what helps identify the incident, not recreate the request.
What to include in the safe Details view
Keep it tight and consistent across integrations:
- Error code (for example, 401, 403, 429)
- Timestamp (with timezone)
- Request ID or correlation ID
- Last successful sync time (if relevant)
- A short, non-sensitive message (one sentence)
Avoid anything that could leak secrets or customer data. Do not show access tokens, API keys, full headers, or full request and response payloads. Even “harmless” snippets can include emails, record IDs, or hidden fields.
Small example
If a customer disconnects and reconnects a tool, the next run might fail with an expired token. Instead of “401 Unauthorized,” show:
“Auth expired. We can’t refresh your connection to HubSpot, so new leads are not syncing. Details: code 401, 2026-01-25 10:42 UTC, request ID 8f2c..., last success 2026-01-25 08:10 UTC.”
That gives customers confidence, and gives your team enough to trace the issue fast, without oversharing.
Next steps customers can actually take
When something breaks, the best integration status page does not just say “failed”. It tells the customer what they can do right now, and what will happen next.
Start with actions that solve the most common causes of third-party API failures. Make each button or instruction specific, not generic, and show the expected timing.
- Reconnect account: send them through a re-auth flow, then confirm “Connected” and queue a new sync (usually 1-5 minutes).
- Update permissions: explain which permission is missing, then recheck access and retry the last failed job automatically.
- Retry sync: rerun only the failed step first, then continue the full sync if it succeeds (show an estimated time window).
- Change sync settings: let them reduce scope (for example, fewer records) to get unblocked, then expand later.
- Export error report: download a short, customer-safe summary they can share internally.
After each action, show a clear outcome: “We will retry automatically”, “Next run scheduled at 14:00”, or “Waiting for provider to respond”. If you do backoff retries, say so in plain words: “We’ll try again up to 3 times over the next 30 minutes.”
For non-actionable issues, be honest and calm. For example: “The provider is having an outage. There’s nothing you need to change. We’ll resume syncing when they recover, and we’ll post an update here within 60 minutes.”
When support is needed, tell customers exactly what to send so you can fix it fast:
- The integration name and connected account email (or ID)
- The last successful sync time and the last error time
- The error code shown on the page (not raw logs)
- What they clicked and what happened
If you build this in AppMaster, you can wire these actions to simple backend endpoints and a customer UI without exposing sensitive provider data.
How to build the status page step by step
Start by treating your integration status page as a small product feature, not a debug screen. If a customer can answer “Is it working, and what should I do next?” you are most of the way there.
Step 1: Define states and the rules behind them
Pick a short set of states and make them consistent across all integrations. Common choices are Healthy, Delayed, Failing, and Paused. Write the exact rules that trigger each state (for example, “Failing if the last 3 runs ended in error” or “Delayed if no successful run in 6 hours”).
Step 2: Track the right events
Your page can only be as clear as your data. Log each run, each retry, and each error in a structured way. Make “last successful sync time” a first-class field, not something you calculate from raw logs.
Step 3: Design a simple layout
A good integration status page usually has three parts: a top summary (state + last success), a short history (recent runs), and a clear action area (what the customer can do now). Keep details one click away so the main view stays calm.
A simple build order:
- Create the state model and rules.
- Store run history, errors, and retries.
- Build the summary, history, and actions UI.
- Add role-based visibility (admins vs viewers).
- Validate the page using real failures.
Step 4: Add role-based visibility
Show different detail levels. Viewers can see status, timing, and safe guidance. Admins can see error codes, failing endpoints, and configuration hints (like “token expired”).
Step 5: Test with real failure cases
Don’t stop at happy-path testing. Reproduce common failures:
- Expired token
- Rate limit hit
- Network timeout
- Invalid permissions
- Bad data mapping
If you build in AppMaster, you can model the tables in the Data Designer, capture events with Business Processes, and assemble the UI with web or mobile builders without hand-coding the page.
Data you need behind the page
A customer-facing integration status page is only as good as the data behind it. If you want the page to load fast and stay consistent, separate “quick health” data from deeper history and raw logs.
Start with a run history table. This is the backbone for “last run”, “last success”, and trend views. Each row should represent one sync attempt, even if it fails early.
Keep the run record small and consistent:
- Start time and end time (or duration)
- Result (success, partial, failed)
- Items processed (and optionally items failed)
- Integration/provider identifier (for multi-provider products)
- Correlation ID (to connect runs to errors and internal logs)
Next, store a normalized error record. Avoid dumping full stack traces into customer-visible data. Instead, save a structured error type (auth, rate limit, validation, timeout), a short message, the provider name, when it first happened, and when it last happened. This lets you group repeated failures and show “still failing since Tuesday” without noise.
Add a small “integration health” model for quick reads. Think of it as a cached summary per customer and integration: current state, last successful sync time, last run time, and a short reason code. Your UI can read this first, then fetch run history only when the user opens details.
Finally, decide retention. Customers usually need days or weeks of run history to understand what changed, while your internal logs might need longer for audits and debugging. Set clear cutoffs (for example, keep 30-90 days of customer-visible history) and keep raw payloads in internal storage only.
If you’re building on AppMaster, these models map cleanly to Data Designer tables, and your sync flow can write run and error records from a Business Process in the same place every time.
Common mistakes and traps
An integration status page is only useful if it matches reality. The fastest way to lose trust is to show a green “All good” badge when the last successful sync was three days ago. If your data is stale, say so, and make “Last successful sync” as visible as the current state.
Another common failure is dumping raw error codes and calling it a day. “401” or “E1029” might be accurate, but it is not helpful. Customers need a plain-language summary of what broke and what it affects (for example, “New orders will not import, but existing orders are unchanged”).
People also get stuck when retry behavior is hidden. If your system retries every 15 minutes, but the page shows nothing, customers will keep refreshing and re-clicking “Sync now,” then open tickets when it does not “work.” Make retries visible, including the next scheduled attempt and whether manual retry is allowed.
Watch out for these traps:
- Green status based on “no recent errors” instead of “recent successful sync.”
- Only technical error codes, with no human explanation or impact.
- No visibility into automatic retries, backoff, or queued runs.
- Error details that expose secrets (tokens, full headers, customer data, webhook payloads).
- Too many status labels (10+), so nobody can tell “blocked” from “delayed.”
Keep status labels small and clear, like Healthy, Delayed, Action needed, Outage. Then define them once and stick to them.
A practical example: if a Shopify token expires, don’t show a stack trace or the token itself. Show “Connection expired,” the time it started failing, what will not sync, and a safe next step like “Reconnect account.” If you build this in AppMaster, treat error text as user-facing content, not a raw log dump, and redact sensitive fields by default.
Quick checklist before you ship
Before you ship an integration status page, do a quick pass as if you were a customer who just noticed data is missing. The goal is simple: confirm what’s broken, how bad it is, and what to do next without panic or guesswork.
Start with the top line. The status label should be unambiguous (Healthy, Delayed, Action required), and it should always include the last successful sync time. If you can’t confidently show “last success,” customers will assume nothing is working.
Then check the actions. If reconnecting or retrying is possible, make it obvious and safe. A customer admin should not have to open a ticket to do a basic fix like re-authorizing an account.
Use this pre-ship checklist:
- Clear status label plus last successful sync time (and current run state if applicable)
- One-click path for an admin to reconnect or retry, with a short confirmation of what will happen next
- Error text that avoids blame, explains impact, and sets expectations (for example, “We’ll retry automatically in 15 minutes”)
- No secrets or personal data shown (no tokens, no full request payloads, no raw IDs that expose customers)
- Support can match the customer view to internal logs via a correlation ID or short reference code
Do a quick wording test with a real scenario: a third-party API rate limit hits during peak hours. The page should say what data is delayed, whether older data is still visible, and when the next retry is scheduled. “Their API failed” is less helpful than “Sync paused due to rate limits. We’ll retry at 14:30 UTC. No action needed.”
If you’re building this in AppMaster, treat the status text and actions as part of the product flow: the customer-facing page, the retry button, and the internal log reference should all be driven by the same backend status record so they never drift apart.
Example: when a third-party API token expires
A common real-world case: your CRM sync stops after someone changes permissions in the CRM admin settings. The token your app uses still “exists”, but it no longer has access to key objects (or it has fully expired). From your side, jobs start failing. From the customer’s side, data quietly stops updating.
On your integration status page, the customer should see a clear, calm summary. For example: Status: Degraded (CRM sync paused), plus the last successful sync time (for example, “Last success: Jan 25, 10:42 AM”). Include a short line that explains impact: “New contacts and deals will not appear until the connection is fixed.”
It also helps to show what is affected without dumping logs. A simple “Affected data” area is enough: Contacts: not syncing, Deals: not syncing, Notes: ok. If your product has multiple workspaces or pipelines, show which ones are impacted.
Then give one recommended action that matches the likely fix:
- Reconnect CRM account (re-authorize access)
- Confirm the user has permission to read Contacts and Deals
- Run a retry after reconnect
After they reconnect, the page should change immediately, even before the next full run. Show: “Connection restored. Next sync starts in 5 minutes” (or “Retry running now”). When the retry finishes, replace the warning with confirmation: “Sync healthy. Data updated at 11:08 AM.”
If you’re building this in AppMaster, you can model “connection state”, “last success”, and “next run” in the Data Designer, then update them from the sync flow in the Business Process Editor so the integration status page stays accurate without manual support work.
Next steps to implement it in your product
Start small so you can ship quickly and learn from real usage. A simple integration status page that shows an at-a-glance state and the last successful sync time will answer most customer questions right away. Once that’s reliable, add deeper details like recent errors, what’s being retried, and what the customer can do next.
Accuracy matters more than design. If your status page is wrong even once, customers stop trusting it and go back to support. Instrument your sync jobs so every run writes a clear outcome (success, partial, failed), timestamps, and a stable error category. Track retries the same way, including when the next retry is scheduled.
Here’s a practical rollout plan:
- Ship v1: status badge + last successful sync time + “updated X minutes ago”
- Add logging: store last run, last success, failure count, and next retry time per integration
- Add guidance: map each error category to a customer-friendly message and a specific action
- Align support: use the same wording as your support playbook so customers don’t get mixed signals
- Expand: add a short “recent events” timeline once the basics are solid
Keep the wording consistent across product and support. If support says “Reconnect your account,” the UI should use the same phrase, not “Reauthorize OAuth,” even if that’s what engineers call it. It also helps to show what happens after the customer acts, like “We’ll retry automatically within 5 minutes.”
If you want to build this without heavy engineering, a no-code platform like AppMaster can keep the data, logic, and UI in one place. Model an Integration and SyncRun in the Data Designer (PostgreSQL), record outcomes from your sync flow in the Business Process Editor, and build a simple customer-facing page in the web UI builder. When your requirements change, AppMaster regenerates the application cleanly, so iterating on fields and messages stays safe. Try it in AppMaster and ship a v1 status page first, then grow it based on real support tickets.


