<?xml version="1.0" encoding="utf-8"?>
<!-- name="GENERATOR" content="github.com/mmarkdown/mmark Mmark Markdown Processor - mmark.miek.nl" -->
<rfc version="3" ipr="trust200902" docName="draft-brotman-aggregate-performance-reporting-00" submissionType="IETF" category="std" xml:lang="en" xmlns:xi="http://www.w3.org/2001/XInclude" indexInclude="true" consensus="true">

<front>
<title abbrev="APR">Aggregate Performance Reporting</title><seriesInfo value="draft-brotman-aggregate-performance-reporting-00" stream="IETF" status="standard" name="Internet-Draft"></seriesInfo>
<author initials="A." surname="Brotman" fullname="Alex Brotman"><organization>Comcast, Inc</organization><address><postal><street></street>
</postal><email>alex_brotman@comcast.com</email>
</address></author><author initials="T." surname="Corbett" fullname="Tom Corbett"><organization>Iterable</organization><address><postal><street></street>
</postal><email>tom.corbett@iterable.com</email>
</address></author><author initials="E." surname="Gustafsson" fullname="Emil Gustafsson"><organization>Google</organization><address><postal><street></street>
</postal><email>emgu@google.com</email>
</address></author><date year="2026" month="March" day="17"></date>
<area>Applications</area>
<workgroup></workgroup>

<abstract>
<t>Definition of an aggregate performance report format for email messaging, the
means to discover target destinations, and a specified delivery method.</t>
</abstract>

</front>

<middle>

<section anchor="introduction"><name>Introduction</name>
<t>In the Email industry, there is a great amount of emphasis put upon various
types of reputation.  Mailbox Providers (MBP) typically use these reputation
systems to govern placement, permitted volume, or other characteristics
related to delivery.  In many cases, the entities sending the messages have
little insight into these reputation systems that are directly impacted by
their actions. That lack of usable information directly impacts their
ability to take future corrective actions.</t>
<t>A report which contains some metrics impacting reputation could allow these
sending entities to have more insight into how their actions impact
relevant metrics.</t>
<t>Proposed below will be a document format, as well as methods for report
destination discovery and delivery methods.  The reporting data contained
within will focus on domain-based, specifically DKIM, metrics.</t>
</section>

<section anchor="terminology"><name>Terminology</name>
<t>The key words &quot;MUST&quot;, &quot;MUST NOT&quot;, &quot;REQUIRED&quot;, &quot;SHALL&quot;, &quot;SHALL NOT&quot;,
&quot;SHOULD&quot;, &quot;SHOULD NOT&quot;, &quot;RECOMMENDED&quot;, &quot;NOT RECOMMENDED&quot;, &quot;MAY&quot;, and
&quot;OPTIONAL&quot; in this document are to be interpreted as described in
<xref target="RFC2119"></xref>.</t>
</section>

<section anchor="glossary"><name>Glossary</name>
<t>DKIM - DomainKeys Identified Mail
MBP - Mailbox Provider
RUA - The destination for reports, a list of email addresses
SDI - Signer-Defined Identifier</t>
</section>

<section anchor="destination-discovery-via-dns-record"><name>Destination Discovery via DNS Record</name>
<t>In order to discover where the reports will be delivered, the report generator
will perform a DNS lookup against the domain used with the valid DKIM <xref target="RFC6376"></xref>
signatures.  The lookup will also leverage the selector attached to the signature.
An example signature might be:</t>
<t>DKIM-Signature: v=1;a=rsa-sha256;c=relaxed/relaxed;s=sel1;d=foo.example.org;...</t>
<t>And the resulting TXT record lookup would be:</t>
<t>sel1._aprf._domainkey.foo.example.org</t>
<t>Effectively: &lt;s value&gt;._aprf._domainkey.&lt;d value&gt;</t>
<t>There is the option to use a wildcard <xref target="RFC1034"></xref> to the left of the '_aprf'
label.  This would use the same record for all selectors, unless specifically
stated in the DNS system.</t>
<t>A signing entity can opt to mix wildcard and explicit selector defintions. As
defined with DNS, the explicit definition gets precedence over the wildcard
result.  In the absence of an explicit selector-based record, the wildcard
record would then be used.</t>

<section anchor="record-attributes"><name>Record Attributes</name>
<t>v:   This MUST always exist, and the value must always be &quot;APRFv1&quot;.  Failure
     to do so should be treated as an invalid record, and the record MUST
     be ignored.</t>
<t>rua: This is the destination address for the report data.  The value must
     be prefaced with a &quot;mailto:&quot;, and then include a valid 5321 address
     as the destination.  If there is more than one destination, they
     should be separated with a comma, and each should have its own
     &quot;mailto:&quot;.  Absence of this attribute suggests the signing entity has
     no interest in receiving reports, and the record MUST be ignored.</t>
<t>sdi: An optional attribute which helps segment the data. The contents are
     a header and separator character, separated by a comma.  Defined in
     the section below. The separator character MUST NOT be any of ';=,'.
     If both the header name and the separator are not defined, the
     'sdi' declaration MUST be ignored.</t>

<section anchor="dns-record-abnf"><name>DNS Record ABNF</name>
<t>TODO</t>
</section>
</section>

<section anchor="signer-defined-identifiers-sdi"><name>Signer-Defined Identifiers (SDI)</name>
<t>There is an attribute ('sdi') by which the DKIM domain holder can share a
header name which can help segment the data contained within the report.<br />
The attribute is defined in two parts, separated by a comma (',').  The
parts MUST be the <xref target="RFC5322"></xref> Header Name, and then a single character
separator.  The separator MUST be a printable ASCII <xref target="RFC20"></xref> character,
and MUST NOT be ';', '=', or ','.</t>
<t>The header field MUST be DKIM signed by the related signature.</t>
<t>The information contained within is expected to be increasing in granularity
as it moves to the right, with a maximum of four fields.  There MUST be a
limit of four parts within the header.</t>
<t>Example:</t>
<t>sel1._aprf._domainkey.example.org TXT &quot;v=ARPFv1;...;sdi=Signer-Info,<sup>"</sup></t>
<t>Where the header name is &quot;Signer-Info&quot;, and the separator is '<sup>'.</sup></t>
<t>An example header:</t>
<t>Signer-Info:SenderCommonName<sup>BrandName</sup>RegionalDistinction<sup>CampaignName</sup></t>
<t>Use of this by the report generator is optional.  The report generator MAY
ignore this attribute.</t>

<section anchor="note-about-usage-of-sdi"><name>Note about Usage of SDI</name>
<t>It's quite possible that two signing entities could attempt to use the same
header field.  This is not explicitly forbidden, however, if each entity
uses a different separator string, the results will likely be undesirable.<br />
It is very much suggested that signers choose a header name that is likely
unique to their entity.</t>
<t>Additionally, a signer should take caution when creating segment names.  These
segment names may create a data leakage.  Those names could appear in reports.</t>
</section>
</section>

<section anchor="dns-record-samples"><name>DNS Record Samples</name>
<t>v=APRFv1;rua=<eref target="mailto:reports@example.org">mailto:reports@example.org</eref>;</t>
<t>v=APRFv1;rua=<eref target="mailto:reports@example.org,mailto:reports2@example2.net">mailto:reports@example.org,mailto:reports2@example2.net</eref>;</t>
<t>v=APRFv1;rua=<eref target="mailto:reports@example.org;sdi=MsgInfo,^">mailto:reports@example.org;sdi=MsgInfo,^</eref>;</t>
<t>If one of the destinations does not align with the sending RFC5322.From domain,
there should be destination validation, discussed below.</t>
</section>
</section>

<section anchor="report-format-contents"><name>Report Format &amp; Contents</name>
<t>The report format MUST be valid JSON <xref target="RFC8259"></xref>.</t>

<section anchor="report-time-period"><name>Report Time Period</name>
<t>The report MUST contain data for one UTC day.  It MUST begin at 0000UTC, and
MUST end at 2359.59UTC on that day.</t>
</section>

<section anchor="document-contents"><name>Document Contents</name>

<section anchor="header"><name>Header</name>
<t>The &quot;header&quot; portion of the report will include data about the entity creating
the report.  The fields will be:</t>
<t>version:       This is a string provided by the report generator. This allows
               the MBP to notate when there is a deviation from previous
               versions as it relates to the data contained within.  An
               example might be that the MBP adds or removes some action
               from the &quot;positive&quot; feedback field, and therefore alters
               the version string to illustrate the demarcation.</t>
<t>source:        The common name of the reporting entity.  If a company is
               reporting on behalf of a MBP, that MBP name should be in
               this field.</t>
<t>dkim_domain:   The domain which is being reported on.  This should be from
               the d= field of the signature.  If the report is going to roll
               up data to the higher level domain, the field should show
               this as an asterisk (e.g., &quot;*.example.org&quot;).  The domain
               may not be aligned with the 5322.From domain as the report is
               based on the signing domain.</t>
<t>dkim_selector: The selector which is being reported on.  If this is an
               aggregate report that is rolling up data, the reporting
               entity should make this value an asterisk (&quot;*&quot;).</t>
<t>report_start:  The time where the data within the report begins, noted
               in the epoch format.</t>
<t>report_end:    The time where the data within the report ends, noted in the
               epoch format.</t>
<t>contact_info:  An email address that may be used to contact the report
               generator with questions.  This field is optional.</t>
<t>sdi_used:      Demonstrate which SDI was used to create the report
               data.  The string MUST be in the same format retrieved from
               DNS. If the report generator is not using the declared 'sdi',
               this value MUST be &quot;N/A&quot;.  If the value is not in the record,
               or is not valid, the value here MUST be &quot;N/F&quot;.</t>
<t>extra_info:    Optional field.  This could be used by the report generator
               to provide additional information for the report recipient.<br />
               This could include information such as how to better interpret
               the reports, contact information, information about data
               points that may influence reputation.</t>
</section>

<section anchor="body"><name>Body</name>
<t>The second portion is called the &quot;Body&quot;, and will include the data.  Within
the body, there are a list of segments. Each segment contains a
&quot;classification&quot;, and &quot;engagement&quot; part in addition to a sender defined
identifier, if applicable.  The &quot;classification&quot; section is meant to disclose
placement information, while &quot;engagement&quot; is meant to disclose what
happens after the message is classified, and include &quot;positive&quot;, &quot;negative&quot;,
and &quot;neutral&quot; data points.</t>
<t>Each of the &quot;classification&quot; and &quot;engagement&quot; portions of the report are
optional, and the decision to include that data will be made by the report
generator.  It may be that the report generator only wishes to share some
portion of the data, or the data is simply not available.</t>
<t>Sample default segment (no signer defined identifier):</t>
<t>...
{
&quot;classification&quot;: { ... },
&quot;engagement&quot;: { ... }
},
...</t>
<t>Sample segment with signer defined identifier:</t>
<t>...
{
&quot;segment&quot;: &quot;ExampleCustomerID&quot;,
&quot;classification&quot;: { ... },
&quot;engagement&quot;: { ... }
},
...</t>
</section>
</section>

<section anchor="empty-sdi"><name>Empty SDI</name>
<t>In the event of an absent SDI, either by the Report Generator or the Signer,
then the report will essentially be &quot;flat&quot;.  There will be just one stanza,
without a reference a segment.  A sample is provided below.</t>
<t>NOTE:specify which sample below, currently sample #2</t>
</section>
</section>

<section anchor="classification"><name>Classification</name>
<t>Each segment disclosed in the report should share information about placement
of the message.  This could include values such as: inbox, unwanted, forwarded,
promotional, or some other placement information. These are scalar values,
and recommended to be created as &quot;buckets&quot;.  While the recommendation is to
use buckets, the decision to do so is left to the report generator.
Additionally, when buckets are used during reporting, it's suggested that
the report generator will use the upper bound of the bucket for values.<br />
The size (10, 10k, etc) of the buckets will be a decision made by the
report generator.</t>
<t>These metrics should pertain to the reporting period, and measure the number
of messages in each category that were received during that time.</t>
<t>Sample segment:</t>
<t>...
&quot;classification&quot;:  {
&quot;inbox&quot;: 10000,
&quot;unwanted&quot;: 500
},
...</t>
<t>The report generator MAY provide information about these categories in the
&quot;extra_info&quot; header.</t>
</section>

<section anchor="engagement"><name>Engagement</name>
<t>This segment is to disclose data around user engagement, and how that may
impact the reputation.</t>
<t>These metrics should pertain to the reporting period, and measure the number
of engagement actions in each category, regardless of when the messages were
received. The values are meant to be bucketed scalar values, similar to
the metrics in the prior section.</t>
<t>Sample segment:</t>
<t>...
&quot;engagement&quot;: {
&quot;positive&quot;: 100,
&quot;neutral&quot;: 500,
&quot;negative&quot;: 50
},
...</t>
<t>The report generator MAY provide information about these categories in the
&quot;extra_info&quot; header.</t>
</section>

<section anchor="report-delivery"><name>Report Delivery</name>
<t>The reports must be attached to the messages as a standard attachment.</t>
<t>When using the date below, the date used should be the ending date of the
report.  For a single UTC day report, the ending date should be that date.</t>
<t>The attachment name MUST be in the form:</t>
<t>&lt;yyyymmdd&gt;<em>&lt;DKIM domain&gt;</em>&lt;DKIM selector&gt;_&lt;source&gt;</t>
<t>If the &quot;source&quot; has any spaces, those should be removed.</t>
<t>The suffix for the file MUST be &quot;.json&quot;.</t>
<t>The subject MUST be in the form:</t>
<t>ARPF: &lt;yyyymmdd&gt;<em>&lt;DKIM domain&gt;</em>&lt;DKIM selector&gt;_&lt;source&gt;</t>
<t>If the &quot;source&quot; has any spaces, those should be removed.</t>
<t>The Content-Type for the message MUST be &quot;multipart/report&quot;.  The
Content-Type for the report attachment MUST be &quot;application/json&quot;.  If
there is a plain-text portion of the report, the Content-Type MUST
be &quot;text/plain&quot;.</t>
<t>Reports will be delivered via SMTP to the destination address.</t>

<section anchor="compression"><name>Compression</name>
<t>A report receiver SHOULD be able to receive messages that are compressed
using gzip [?@RFC1952], as a report generator MAY opt to compress the
attachment for the report.  If the attachment is to be compressed, it
MUST have the Content-Type of &quot;application/gzip&quot;, and a file extension
of &quot;.json.gz&quot;.</t>
<t>NOTE: If a later version shows up with the same date period, does it
overwrite, discard?  Should there be a flag showing it to be an update?</t>
</section>
</section>

<section anchor="destination-validation"><name>Destination Validation</name>
<t>When the report destination and DKIM domain are not aligned, there is a
method by which the report generator SHOULD validate the report destination
before attempting delivery.</t>
<t>&lt;selector&gt;.&lt;DKIM domain&gt;._aprf.&lt;report destination domain&gt;</t>
<t>And the value MUST be &quot;v=APRFv1;&quot; or &quot;v=APRFv1&quot;</t>
<t>The &lt;selector&gt; or &lt;DKIM domain&gt; may be a wildcard entry.  This would allow
all portions to the left to go to that destination.</t>
<t>This is similar to the validation performed for DMARC <xref target="RFC7489"></xref>.</t>
<t>TODO: proper ABNF</t>
</section>

<section anchor="security-considerations"><name>Security Considerations</name>

<section anchor="data-leakage"><name>Data Leakage</name>

<section anchor="personal-data"><name>Personal Data</name>
<t>At a sufficient low volume, it may be possible to expose some information
that would otherwise be &quot;lost in the noise&quot; about individuals.  One
suggestion may be that the MBP that is supplying the reports set a threshold
for a number of messages or distinct recipients in order to better obfuscate
that information.</t>
</section>

<section anchor="report-data"><name>Report Data</name>
<t>Report generators may not wish to send reports to all of the destinations
requested.  The decision on destinations could be related to 5322.From
alignment, domain reputation, or other considerations.  A report generator
is not required to send reports to every entity requesting these reports.</t>
</section>
</section>
</section>

<section anchor="iana-considerations"><name>IANA Considerations</name>
</section>

<section anchor="appendix"><name>Appendix</name>

<section anchor="definition-of-performance"><name>Definition of &quot;Performance&quot;</name>
<t>This report is meant to allow the MBP/report generator to share information
about metrics relating to performance and reputation.  The metrics that
are noted above are positive/neutral/negative.  As one may have noticed,
there is no formal definition of these metrics or what they may
mean.  Each MBP/report generator may have different actions that belong
in each of these categories.</t>
<t>Some examples could be:</t>
<t>positive: open or click engagement, False positive (&quot;not-spam&quot;) report
neutral: filing message into a folder, forwarding
negative: marking as spam, deletion without opening, unsubscribe</t>
<t>These could be considered &quot;secret sauce&quot;, so it is likely not advantageous
for the MBP to disclose precisely what each category consists of.</t>
<t>A report generator MAY choose to divulge some or all of this information
via the &quot;extra_info&quot; field in the report header.</t>
</section>

<section anchor="report-samples"><name>Report Samples</name>

<section anchor="report-sample-1"><name>Report Sample 1</name>

<sourcecode type="json">[
    {
        &quot;header&quot;: {
            &quot;version&quot;: 42,
            &quot;source&quot;: &quot;Receiver MBP, Inc.&quot;,
            &quot;dkim_domain&quot;: &quot;example.com&quot;,
            &quot;dkim_selector&quot;: &quot;selector1&quot;,
            &quot;report_start&quot;: 1709164800,
            &quot;report_end&quot;: 1709251199,
            &quot;contact_info&quot;: &quot;reports@mbp.net&quot;,
            &quot;extra_info&quot;: &quot;TBD&quot;,
            &quot;sdi_used&quot;: &quot;UniqueHeaderName,^&quot;
        },
        &quot;body&quot;: [
            {
                &quot;segment&quot;: [&quot;Seg1&quot;, &quot;Seg2&quot;, &quot;Seg3&quot;],
                &quot;classification&quot;: 
                    {
                        &quot;inbox&quot;: 10000,
                        &quot;unwanted&quot;: 500
                    },
                &quot;engagement&quot;: 
                    {
                        &quot;positive&quot;: 300,
                        &quot;negative&quot;: 200,
                        &quot;neutral&quot;: 50
                    }
            },
            { 
                &quot;segment&quot;: [&quot;Seg1&quot;, &quot;Seg2&quot;, &quot;Other&quot;],
                &quot;classification&quot;: 
                    {
                        &quot;inbox&quot;: 200,
                        &quot;unwanted&quot;: 50
                    },
                &quot;engagement&quot;: 
                    {
                        &quot;positive&quot;: 50,
                        &quot;negative&quot;: 20,
                        &quot;neutral&quot;: 0
                    }
            },
            { 
                &quot;segment&quot;: [&quot;Seg1&quot;, &quot;Other&quot;], 
                &quot;classification&quot;: 
                    {
                        &quot;inbox&quot;: 50,
                        &quot;unwanted&quot;: 50
                    },
                &quot;engagement&quot;: 
                    {
                        &quot;positive&quot;: 50,
                        &quot;negative&quot;: 50,
                        &quot;neutral&quot;: 50
                    }
            }
        ]
    }
]
</sourcecode>
</section>

<section anchor="report-sample-2"><name>Report Sample 2</name>

<sourcecode type="json">[
    {
        &quot;header&quot;: {
            &quot;version&quot;: 4,
            &quot;source&quot;: &quot;Receiver MBP, Inc.&quot;,
            &quot;dkim_domain&quot;: &quot;example.com&quot;,
            &quot;dkim_selector&quot;: &quot;sel1&quot;,
            &quot;report_start&quot;: 1709164800,
            &quot;report_end&quot;: 1709251199,
            &quot;contact_info&quot;: &quot;reports@mbp.net&quot;,
            &quot;extra_info&quot;: &quot;TBD&quot;,
            &quot;sdi_used&quot;: &quot;N/F&quot;
        },
        &quot;body&quot;: [
            {
                &quot;classification&quot;: 
                    {
                        &quot;inbox&quot;: 10000,
                        &quot;unwanted&quot;: 100
                    },
                &quot;engagement&quot;: 
                    {
                        &quot;positive&quot;: 200,
                        &quot;negative&quot;: 100,
                        &quot;neutral&quot;: 20
                    }
            }
        ]
    }
]
</sourcecode>
</section>
</section>
</section>

</middle>

<back>
<references><name>Normative References</name>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6376.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8259.xml"/>
</references>
<references><name>Informative References</name>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.1034.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.20.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5322.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7489.xml"/>
</references>

</back>

</rfc>
