> ## Documentation Index
> Fetch the complete documentation index at: https://docs.contactship.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Custom reports

> Choose measures, call filters, and grouping for a custom report.

export const Availability = ({lang = 'es', plan, addon, permission, route, status}) => {
  const L = lang === 'en' ? {
    plan: 'Plan',
    addon: 'Add-on',
    permission: 'Permission',
    route: 'Where',
    status: 'Status',
    addonNote: 'enabled on request',
    allPlans: 'All plans',
    beta: 'Beta',
    nuevo: 'New',
    soon: 'Coming soon'
  } : {
    plan: 'Plan',
    addon: 'Add-on',
    permission: 'Permiso',
    route: 'Dónde',
    status: 'Estado',
    addonNote: 'se activa a pedido',
    allPlans: 'Todos los planes',
    beta: 'Beta',
    nuevo: 'Nuevo',
    soon: 'Próximamente'
  };
  const items = [];
  if (plan) items.push([L.plan, plan]);
  if (addon) items.push([L.addon, `${addon} · ${L.addonNote}`]);
  if (permission) items.push([L.permission, permission]);
  if (route) items.push([L.route, route]);
  if (status) items.push([L.status, L[status] || status]);
  return <div style={{
    display: 'flex',
    flexWrap: 'wrap',
    gap: '6px 22px',
    padding: '12px 16px',
    margin: '4px 0 24px',
    border: '1px solid rgba(2, 82, 255, 0.28)',
    borderLeft: '3px solid #0252ff',
    borderRadius: '8px',
    background: 'rgba(2, 82, 255, 0.05)',
    fontSize: '13.5px',
    lineHeight: '1.5'
  }}>
      {items.map(([k, v]) => <div key={k} style={{
    display: 'flex',
    gap: '6px',
    alignItems: 'baseline'
  }}>
          <span style={{
    fontSize: '10.5px',
    fontWeight: 600,
    letterSpacing: '0.07em',
    textTransform: 'uppercase',
    opacity: 0.65
  }}>{k}</span>
          <span style={{
    fontWeight: 500
  }}>{v}</span>
        </div>)}
    </div>;
};

<Availability lang="en" route="Reports → Customize → Add widget → Custom report" permission="reports.read" />

The builder answers questions about **calls** and saves the result as a personal widget. It follows the dashboard date range.

## Build a question

1. Open **Customize → Add widget → Custom report** and enter a descriptive name.
2. Under **Show**, choose a count, conditional percentage, distinct contacts, duration, cost, or numeric analysis field. You can add multiple measures.
3. Under **Only calls that**, define the dataset using agent, campaign, outcome, direction, analysis fields, and other filters. Operators depend on field type.
4. Under **Split by**, select up to two groups, such as agent and period. Without grouping, you get a total.
5. Enable comparison to use the preceding period of equal length. Choose a compatible visualization or keep **Auto**.
6. Review the preview and **How it is calculated**, then add the widget to your dashboard.

## Example: percentage of transferred calls

Choose **Percentage of calls that…** and add the transfer condition you want to assess inside that measure. Split by agent. If you also filter the entire report to one campaign, the denominator consists of that campaign’s calls, not all organization calls.

Mean, median, and p90 answer different questions. Median splits durations into two halves; p90 is the value below which 90% of calls fall.

## Inspect and export

Use **View calls** or a cell’s action to inspect the records behind a result. You can export calls from that list. Comparison uses an equally long period immediately before the selected range; it differs from the dashboard KPI comparison between range halves.

If a field is no longer available, open **Configure** and replace it. Empty results may reflect the date range or overly restrictive filters.

## Frequently asked questions

<AccordionGroup>
  <Accordion title="Can I query contacts without calls?">
    The builder’s source is calls. Distinct contacts counts contacts associated with those calls.
  </Accordion>

  <Accordion title="Which time zone does it use?">
    The report time zone; inspect the range shown in the preview.
  </Accordion>

  <Accordion title="Will changes affect coworkers?">
    It belongs to your personal dashboard for that organization.
  </Accordion>
</AccordionGroup>

## See also

* [Dashboard](/en/reports/dashboard)
* [Call log](/en/calls/call-log)
