Meridian handbook
Destination platform (engine-dmo)

Member reports

What the member report tells a business about its listings, where members read it (portal, member API, PDF, monthly digest), how to configure the digest, the peer comparison and the improvement prompts, scheduled organisation reports for a board, and the report commands.

engine-dmo

This feature is part of the DMO bundle (engine-dmo).

The member report shows one organisation its own numbers for a period: how often its listings were seen, what visitors did next, the enquiries it received, where its visitors came from, how it compares with similar businesses, what people searched for, and what it could do to its listing to do better. It is computed once and served in four places, so they never disagree:

WhereHow
The portalThe report screen, /organisations/{org}/report, for people whose role grants report.view
The member APIGET /api/member/v1/organisations/{id}/report
A PDFengine-dmo analytics report --format pdf
The monthly digestAn email to the organisation’s contacts, scheduled from config/analytics/reports.yaml

The report needs analytics to be on (analytics.enabled: true in engine.yaml, see Analytics) and listings linked to their organisations.

What is in it

SectionContents
Seenlisting_impression (appeared in lists), widget_impression (seen on a partner’s page through a widget), listing_view (the listing’s own page)
Referralswebsite_click, phone_reveal, directions_click, booking_click, email_click, social_click, each with its total
Enquiriesenquiry_submitted: enquiry forms that reached the business. Shown on its own, never added to referrals.
Paid placementsoffer_impression and promotion_impression, counted separately so they never inflate the listing’s figures
ConversionHow many of the people who saw the listing went on to act, in percentage points, and referrals per day
SourcesWhere visitors came from: search engines, direct, other websites, social media, within the site, campaigns, partner pages
Twelve monthsA month by month series for the chart
Peer comparisonThe organisation against the median of similar businesses on the site; see below
Search termsTerms that brought people to the listing, and searches near it that found nothing
Improvement prompts“Make your listing work harder”: what to change, and the evidence for it
SitesFor an organisation listed on several sites, its figures on each and their total
Owner activityWhat the organisation’s own people did on its own listings while signed in, excluded from every figure above and shown so the exclusion is visible
MethodologyWhat is counted, what is excluded and why, how the comparison is protected, and the rule set the figures were rolled up under

Each figure carries its change on the same period a year earlier and a direction (up, down or level). The events are recorded by the public pages; see Counting what visitors do.

The monthly digest

The digest is one email per organisation per site, sent to every current contact who may edit the listing and has not opted out (a link in the email stops it). It is declared as a member report:

config/analytics/reports.yaml
reports:
  - key: member-monthly
    name: { en-GB: Your monthly performance }
    audience: member
    schedule: "0 8 2 * *"
    format: [email]
    range: previous_month
    compare: previous_year
    tiers: { min: bronze }

and switched on in the portal’s file:

config/portal/portal.yaml
portal:
  report:
    email_digest:
      enabled: true
      report: member-monthly
      skip_when_no_data: true

The digest uses the report’s schedule, range and tiers, and needs email among its formats. It sends to each organisation with an active membership in the report’s tiers. A period with no impressions and no interactions is skipped when skip_when_no_data is on. A run is recorded per site and per report, so a restart or a second scheduler tick never sends twice, and a contact whose address is suppressed leaves an entry on the organisation’s timeline instead.

engine-dmo analytics digest queues the digest for the current period now, whatever the schedule says; --run also works through the mail queue in the command rather than leaving it to the server.

Report definitions

config/analytics/reports.yaml holds every scheduled report. engine-dmo config schema --file reports prints its schema.

KeyRequiredDefaultMeaning
keyyesUnique handle
idwritten by check --fixThe stable id (rep_)
namenoThe report’s name per locale
audienceyesmember (the digest) or organisation (a report for a board or funder)
scheduleyesA five-field cron expression, evaluated in UTC. The period it reports on is cut in the site’s reporting timezone, but the send time is not: 0 8 2 * * sends at 08:00 UTC, which is 09:00 in London during British Summer Time. Write the hour in UTC for the season that matters most.
formatorganisation reportsOne or a list of email, pdf, csv, json
rangenoprevious_month; this_financial_year for an organisation report with metricsprevious_month, previous_quarter, previous_year, previous_financial_year, this_month, this_quarter, this_financial_year
comparenoprevious_yearprevious_year, previous_period or none
tiersnoevery tierMember reports: the tiers whose organisations receive it. none is not allowed.
toorganisation reportsThe recipients, always a ${VAR} interpolation of a comma separated list, never addresses written in the file
dashboardorganisation reports, or metricsA dashboard declared in config/analytics/dashboards.yaml
metricsorganisation reports, or dashboardKPI rows: key (a metric), optional kind (measured or entered), label per locale, target for the range (a percentage for a rate)
sitesnoevery siteOrganisation reports: the sites it runs for, one run each

Organisation reports

An organisation report sends the destination’s own figures against targets to the recipients the environment names, for a board or a funder:

config/analytics/reports.yaml
  - key: board-quarterly
    name: { en-GB: Quarterly board report }
    audience: organisation
    schedule: "0 9 5 1,4,7,10 *"
    format: [email, pdf]
    range: previous_quarter
    compare: previous_year
    to: ${BOARD_REPORT_RECIPIENTS}
    metrics:
      - { key: visits, target: 120000 }
      - { key: member_referrals_total, target: 9000 }
BOARD_REPORT_RECIPIENTS="board@example.org,chair@example.org"

A metric is one of the engine’s measured metrics (such as visits, page_views, listing_views, enquiries, member_referrals_total, searches, members_active) or a figure staff enter, declared in config/analytics/dashboards.yaml. The full list of metric keys is in Analytics; no command prints it. Staff see each run under the admin’s Reports screen in Insight, and engine-dmo analytics report-run --report board-quarterly [--site <site>] [--run] queues one for its current period now.

Report settings

config/portal/portal.yaml holds the comparison and prompt rules, install-wide.

KeyDefaultMeaning
portal.report.peer_comparisontrueCompare the organisation with similar businesses
portal.report.peer_min_cohort5The smallest cohort compared. Below the banding threshold the comparison is shown as a band rather than a median, so no single business’s figures can be recovered.
portal.report.improvement_prompts.enabledtrueShow prompts
portal.report.improvement_prompts.max_shown4The most prompts shown
portal.report.improvement_prompts.min_impressions100Impressions below which a prompt carries no claim
portal.report.improvement_prompts.uplift_min_cohort20The smallest group of listings an uplift is measured over
portal.report.improvement_prompts.uplift_min_percent10The smallest uplift worth claiming
portal.report.improvement_prompts.filter_min_searches50Searches needed before a filter’s share is quoted
portal.report.improvement_prompts.rulessee belowThe rules, merged over the defaults
portal.report.email_digest.enabledtrueThe monthly digest
portal.report.email_digest.reportmember-monthlyThe member report in reports.yaml the digest sends
portal.report.email_digest.skip_when_no_datatrueSkip an organisation with nothing to report

Improvement prompts

Each rule looks at the organisation’s listing and, where the site’s own data supports it, says how much a change is worth. A prompt for a field the member’s tier may not edit is not shown, and a rule with no field on the listing type is not shown.

RuleDefaultLooks at
photos{ min: 4, target: 8 }Every image field of the listing, unless field/fields name them
summary_words{ min: 40 }The summary’s length
description_words{ min: 150 }The first rich text field, unless named
opening_hours{ required: true, filter: open_now }The first opening hours field, unless named; evidence from how often searches filter by open_now
accessibility{ required: true }Only the fields you name (fields: [accessibility, accessibilityNotes]); filter: names a search filter for evidence
website{ required: true }Only the field you name (field: website)
booking_link{}Only the field you name; tiers: limits it to the tiers that may set a booking link (every tier but none when absent)
stale_after180dHow long since the listing was last updated
zero_result_terms{ min_searches: 10, radius_km: 10 }Searches near the listing that found nothing
config/portal/portal.yaml
portal:
  report:
    improvement_prompts:
      enabled: true
      max_shown: 4
      rules:
        accessibility: { fields: [accessibility, accessibilityNotes] }
        website: { field: website }
        booking_link: { field: bookingUrl, tiers: { min: silver } }

The fields named here (accessibility, accessibilityNotes, bookingUrl) must be fields of your listing type: check reports a named field the type does not have, and a tier the tier list does not declare. A rule you leave out of rules: keeps its default.

Commands

CommandWhat it does
engine-dmo analytics report --organisation <id> [--site] [--from] [--to] [--format text|html|pdf] [--out <file>]One organisation’s report. Dates default to the last year. Text and HTML print to the terminal; a PDF goes to report.pdf unless --out names a file (- is standard output).
engine-dmo analytics digest [--run]Queue the member digest for the current period
engine-dmo analytics report-run --report <key> [--site] [--run]Queue an organisation report for its current period

All three need the database. The PDF is printed by a browser the engine drives (analytics.pdf.renderer in engine.yaml); engine-dmo version --require pdf exits 1 when this build cannot produce one.

In the portal’s templates

The report screen renders report.html in the portal’s template directory, and a custom screen can read the report with a report data source (figures: { report: { range: last_month } }, see Portal screens and actions). Copy report.html with engine-dmo portal scaffold --site <site> to restyle it.