O Registro de Eventos de Assinatura fornece dados de assinatura em nível de evento para o seu canal Prime Video. Acesse eventos brutos de assinatura, incluindo Start, Renewal, Cancel e alterações no status de renovação automática com identificadores de clientes anônimos para criar análises personalizadas sob medida para as necessidades do seu negócio. Este guia aborda o modelo de dados, dimensões, métricas e práticas recomendadas para a criação de análises de assinaturas.
Por que usar o Registro de Eventos de Assinatura?
O Registro de Eventos de Assinatura fornece um histórico de alterações nas análise de assinatura além do que está disponível em painéis predefinidos:
- Análises personalizadas: crie métricas adaptadas às suas definições de negócios específicas e necessidades de relatórios, usando dados brutos em nível do evento
- Integração com Data Warehouse: integre os dados de assinatura do Prime Video com seus sistemas internos e outras fontes de dados para uma análise abrangente
- Lógica comercial flexível: aplique suas próprias regras de liquidação, lógica de desduplicação e cálculos de métricas para atender às suas necessidades de negócios
- Monitoramento do ciclo de vida do cliente: acompanhe as trajetórias individuais dos clientes em eventos de assinatura com identificadores anônimos estáveis
Como funciona
O Registro de Eventos de Assinatura fornece dados de assinatura como um fluxo de eventos somente para acréscimos por meio da API. Cada registro representa um evento distinto no ciclo de vida da assinatura de um cliente. Os dados contêm eventos brutos, sem lógica de negócios pré-aplicada, oferecendo total flexibilidade para calcular métricas de acordo com suas necessidades.
Como escolher o método de acesso a dados correto
O Slate Insights fornece duas maneiras de acessar os dados da assinatura:
Recurso |
Painel Analytics Slate |
Registro de Eventos de Assinatura (API) |
Ideal para |
Informações rápidas, relatórios executivos |
Análise personalizada, engenharia de dados |
Formato de dados |
Métricas pré-agregadas |
Dados brutos em nível de evento |
Lógica de liquidação |
Aplicada automaticamente |
Você aplica sua própria lógica |
Deduplicação |
Tratado para você |
Você deduplica usando last_update_time_utc |
Flexibilidade |
Definições de métricas fixas |
Personalização completa |
Frequência de atualização |
Aproximadamente a cada 8 horas |
Aproximadamente a cada 4 horas |
Dados históricos |
Até 2 anos |
Até 2 anos |
Método de acesso |
Interface do usuário da Web |
API REST |
Use o Painel de controle quando precisar de respostas rápidas ou visualizações predefinidas. Use a API de Registro de Eventos quando precisar criar métricas personalizadas, integrar-se ao seu armazém de dados ou aplicar lógica específica para o seu negócio.
Conceitos-chave
Compreender esses conceitos fundamentais irá ajudar você a trabalhar de forma eficaz com o Registro de Eventos de Assinatura.
Conceito |
Descrição |
Evento |
Uma ação de assinatura específica (iniciar, renovar, cancelar, ativar/desativar renovação automática). Cada evento é identificado por um subscription_event_id exclusivo. |
Dimensão |
Um atributo que descreve o contexto de um evento, como a data em que ocorreu, o cliente envolvido ou o tipo de oferta. As dimensões são usadas para filtrar e agrupar dados. |
Métrica |
Uma medida calculada derivada de eventos, como número de assinantes ativos, taxa de rotatividade ou taxa de conversão. As métricas não são armazenadas diretamente, é preciso calculá-las a partir dos dados do evento. |
Modelo de registro de alterações |
Os dados são somente para acréscimo. Se os atributos de um evento forem alterados, um novo registro será publicado com o mesmo subscription_event_id, mas com um last_update_time_utc atualizado. |
Liquidação |
Lógica de negócios que filtra interferências de eventos brutos. Por exemplo, ao excluir pares de início/cancelamento na mesma data que não representam assinaturas significativas. |
Ciclo de vida |
Um “ciclo” de assinatura que representa um período contínuo de assinatura. Um novo ciclo de vida começa após cada evento de cancelamento liquidado. |
Observação: Comece com Eventos e Dimensões para consultar os dados, aplique a lógica de Liquidação e Ciclo de Vida para limpá-los e, em seguida, calcule as Métricas correspondentes às suas definições de negócios.
Dimensões
As dimensões são atributos que descrevem o contexto de cada evento de assinatura. São usadas para filtrar dados, agrupar resultados e criar relatórios.
Dimensão do evento
Subscription_event_type é o tipo de evento de assinatura que ocorreu. Essa é a dimensão principal para compreender as ações do ciclo de vida do cliente.
Valor |
Descrição |
Caso de uso |
Start |
O cliente se inscreveu no seu canal pela primeira vez. No momento da venda, não existe nenhum registro inicial anterior para esse cliente. |
Contagem de novas aquisições de assinantes |
Renewal |
A assinatura do cliente foi renovada a partir de um período anterior. Os eventos de renovação ocorrem mesmo quando há intervalos entre os períodos de assinatura, desde que o cliente possua um histórico de assinaturas. |
Contagem de assinantes retidos |
Cancel |
A assinatura do cliente foi encerrada. Pode ter sido iniciada pelo cliente ou devido a falha no pagamento. |
Calcular a taxa de rotatividade |
Active - AR ON |
O cliente ativou a renovação automática. A assinatura será renovada no final do período. |
Monitorar a taxa de renovação automática |
Active - AR OFF |
O cliente desativou a renovação automática. A assinatura expirará no final do período, a menos que seja reativada. |
Identificar assinantes em risco |
Suspended |
A assinatura do cliente foi temporariamente suspensa devido a problemas de pagamento (fundos insuficientes ou informações de cobrança inválidas). A assinatura será retomada automaticamente e gerará um evento de renovação quando o cliente atualizar suas informações de cobrança e o pagamento for processado com sucesso. |
Ajuda a monitorar assinaturas em um estado de falha temporária que podem ser recuperadas (tornando-se renovações) ou convertidas em cancelamentos |
Observação: Um evento Start ocorre somente quando, no momento da venda, não temos nenhum registro inicial anterior para esse cliente em seu canal. Para uma contagem confiável de assinantes ativos, trate os eventos de Start e Renewal como indicadores de uma assinatura ativa. Essa abordagem lida com todos os casos extremos de forma consistente.
Dimensões da oferta
Essas dimensões descrevem a oferta de assinatura associada a cada evento.
Dimensão |
Tipo |
Formato |
Descrição |
is_promo |
número inteiro |
0 ou 1 |
Indica se o evento de assinatura ocorreu durante um período de oferta promocional. 0 = oferta padrão (sem promoção ativa), 1 = oferta promocional (desconto ou preço especial ativo). |
offer_type |
string |
Texto |
Representa a classificação da oferta para a Amazon. Para os canais, será sempre “3P_SUBS”. |
offer_marketplace |
string |
Código da loja |
A loja da Amazon onde a oferta de assinatura está disponível. Valores: US (Estados Unidos), UK (Reino Unido), DE (Alemanha), JP (Japão), ROE (Restante da Europa), ROW_NA (Restante do mundo – América do Norte), ROW_EU (Restante do mundo – Europa), ROW_FE (Restante do mundo – Extremo Oriente). O offer_marketplace reflete onde a oferta foi comprada, o que pode ser diferente da localização atual do cliente. |
offer_name |
string |
Texto |
O nome legível da oferta de assinatura, conforme configurado na configuração do seu canal. |
offer_payment_amount |
numérico |
Valor numérico (por exemplo, “4,99”, “9,99”) |
O preço sugerido da oferta de assinatura na moeda local. Esse campo é somente metadados da oferta e não representa receita transacional. Esse campo mostra o preço da oferta associada ao evento e não representa a receita real obtida ou o dinheiro arrecadado. O mesmo valor aparece em todos os tipos de evento (Start, Renewal, Cancel, alterações de AR), independentemente de o pagamento ter ocorrido. Não é possível somar esse campo para calcular a receita. Para dados reais de receita, consulte seus sistemas de relatórios financeiros separados. |
offer_billing_type |
string |
FT ou HO |
O modelo de pagamento da oferta de assinatura. FT = Teste grátis (período introdutório sem custo), HO = Oferta definitiva (assinatura paga). |
offer_id |
string |
Identificador |
O identificador exclusivo da oferta de assinatura. Use-o para associar metadados da oferta ou acompanhar o desempenho por oferta. |
Observação: O offer_marketplace indica onde a assinatura foi comprada e determina preços, moeda e disponibilidade de conteúdo. Um único cliente pode ter assinaturas em várias lojas. Use offer_billing_type para distinguir entre eventos de período de teste grátis e de assinatura paga ao calcular métricas de conversão.
Dimensões do cliente
Essas dimensões identificam e descrevem o assinante.
Dimensão |
Tipo |
Formato |
Descrição |
cid |
string |
Identificador anônimo |
Um identificador de cliente anônimo e estável. Essa ID é consistente em todos os eventos para um determinado cliente dentro do seu canal, permitindo que você monitore o ciclo de vida completo do cliente. O cid é consistente dentro do seu canal principal. O mesmo cliente terá o mesmo cid em todas as ofertas e combos lançados no mesmo canal principal dentro de uma loja (por exemplo, um cliente que assina o “Prime com anúncios (EUA)” e depois muda para o “Prime sem anúncios (EUA)” manterá o mesmo cid, pois ambas as ofertas compartilham o canal principal “Prime (EUA)”). Os clientes terão valores de cid diferentes em diferentes canais parceiros, garantindo a privacidade e permitindo análises por canal. |
benefit_id |
string |
Identificador |
A ID de benefício do Prime Video associado à assinatura. Isso vincula a assinatura a direitos de acesso a conteúdos específicos. |
channel_label |
string |
Texto |
O nome do canal ao qual a assinatura pertence. |
channel_tier_label |
string |
Texto |
O nome do nível específico dentro do canal, se aplicável. Se o seu canal não usar níveis, esse valor pode ser nulo ou corresponder ao channel_label. |
Observação: O cid permite monitorar o ciclo de vida do cliente, ao mesmo tempo em que mantém a privacidade. Use o cid para analisar padrões de comportamento individuais dos clientes, calcular métricas de retenção e identificar eventos de renovação de assinatura.
Dimensões de tempo
Essas dimensões fornecem contexto temporal para eventos de assinatura.
Dimensão |
Tipo |
Formato |
Descrição |
subscription_event_time_utc |
timestamp |
ISO 8601: AAAA-MM-DDTHH:MM:SS.sssZ |
O registro de data e hora em que ocorreu o evento de assinatura, armazenado em horário UTC. Todos os registros de data e hora dos eventos são armazenados em formato de horário UTC para manter a consistência. Use subscription_event_time_zone para converter para o horário local para geração de relatórios. |
subscription_event_time_zone |
string |
Identificador do fuso horário (por exemplo, América/Nova York, Europa/Londres) |
O fuso horário da loja onde ocorreu o evento de assinatura. O painel de controle do Slate Analytics apresenta os dados no fuso horário local. |
create_time_utc |
timestamp |
Formato ISO 8601 |
O registro de data e hora em que o evento de assinatura foi criado pela primeira vez no registro de alterações, armazenado em horário UTC. Isso representa quando o registro foi adicionado ao registro de alterações, não quando o evento ocorreu. Use subscription_event_time_utc para a hora real do evento. |
last_update_time_utc |
timestamp |
Formato ISO 8601 |
O registro de data/hora em que o registro do evento de assinatura foi atualizado pela última vez no registro de alterações, armazenado em horário UTC. Use sempre esse campo para deduplicar registros. Quando existirem vários registros para o mesmo subscription_event_id, mantenha somente o registro com last_update_time_utc mais recente. |
Exemplo de conversão (Athena SQL):
-- Parse ISO 8601 string and convert to local timezone
CAST(DATE_FORMAT(
AT_TIMEZONE(
parse_datetime(subscription_event_time_utc, 'yyyy-MM-dd''T''HH:mm:ss.SSS''Z'''),
subscription_event_time_zone
),
'%Y-%m-%d %H:%i:%s.%f'
) AS TIMESTAMP) AS event_time_local
Observação: Use subscription_event_time_utc para todos os cálculos e filtros. Converta para o fuso horário local usando subscription_event_time_zone somente para fins de geração de relatórios e exibição.
Dimensões do gerenciamento de registros
Essas dimensões ajudam você a gerenciar os dados do registro de alterações corretamente.
Dimensão |
Tipo |
Formato |
Descrição |
subscription_event_id |
string |
Formato UUID |
O identificador exclusivo de cada evento de assinatura. Essa é a chave primária para deduplicação. Podem existir vários registros para o mesmo subscription_event_id se os atributos do evento forem atualizados. Sempre deduplique mantendo o registro com o último last_update_time_utc. |
is_deleted |
número inteiro |
0 ou 1 |
Indica se um registro publicado anteriormente deve ser removido do seu conjunto de dados. 0 = registro ativo (incluir na análise), 1 = registro excluído (excluir da análise - remover das suas tabelas se tiver sido inserido anteriormente). Registros excluídos são raros, mas podem ocorrer quando são necessárias correções de dados. Sempre use o filtro is_deleted = 0 em suas consultas. |
Observação: Sempre deduplique usando last_update_time_utc antes de realizar qualquer análise. Filtre os registros excluídos (is_deleted = 1) no início do seu pipeline de ETL para garantir a precisão dos dados.
Limpeza de Dados e Lógica de Liquidação
Esta seção explica o processo de deduplicação em duas etapas usado para transformar dados brutos de eventos em métricas claras e significativas para os negócios. Alguns parceiros usam lógicas de liquidação diferentes, por isso fornecemos dados brutos de eventos para permitir flexibilidade. Esta seção fornece a lógica que usamos no Prime Video para que os parceiros possam reconciliar métricas com o painel de Analytics Slate e ver como modelamos os dados.
Por que a liquidação é importante?
Os dados brutos de eventos de assinatura contêm interferências que podem inflar ou distorcer suas métricas:
Problema |
Exemplo |
Impacto sem liquidação |
Rotatividade no mesmo dia |
O cliente inicia e cancela em poucas horas |
Contabilizado duas vezes como início e cancelamento |
Tentativas de pagamento |
Vários eventos de cancelamento devido a falhas na cobrança |
Números de rotatividade inflados |
Cancelamentos sem início |
Eventos Cancel sem um Start correspondente no ciclo de vida |
Rotatividade inflacionada sem aquisição correspondente |
A lógica de liquidação garante que suas métricas reflitam atividades de assinatura significativas, e não interferências geradas pelo sistema.
Etapa 1: Liquidação no final do dia
Gerencie pares de Start e Cancel no mesmo dia, mantendo somente o estado de Fim de Dia (EOD). Se um cliente tiver um evento de Start/Renewal e um de Cancel no mesmo dia do calendário, mantenha somente o último evento cronológico desse dia. Os cancelamentos no mesmo dia geralmente indicam falhas na autorização de pagamento ou problemas no fluxo de inscrição. Esses eventos não representam um engajamento significativo do assinante e a contagem infla os números de inícios e cancelamentos
Implementação
-- Step 1: Identify same-day start + cancel pairs
same_day_start_and_cancel AS (
SELECT cid, offer_marketplace, event_date_local
FROM deduped_events
GROUP BY cid, offer_marketplace, event_date_local
HAVING SUM(CASE WHEN subscription_event_type IN ('Start', 'Renewal') THEN 1 ELSE 0 END) > 0
AND SUM(CASE WHEN subscription_event_type = 'Cancel' THEN 1 ELSE 0 END) > 0
),
-- Step 2: Rank events by time within each day
events_with_eod_rank AS (
SELECT e.*,
ROW_NUMBER() OVER (
PARTITION BY e.cid, e.offer_marketplace, e.event_date_local
ORDER BY e.event_time_local DESC
) AS eod_rank
FROM deduped_events e
),
-- Step 3: For same-day pairs, keep only EOD event (rank = 1)
settled_events AS (
SELECT e.*
FROM events_with_eod_rank e
LEFT JOIN same_day_start_and_cancel s
ON e.cid = s.cid
AND e.offer_marketplace = s.offer_marketplace
AND e.event_date_local = s.event_date_local
WHERE s.cid IS NULL -- Not a same-day pair, keep all events
OR e.eod_rank = 1 -- Same-day pair, keep only last event
)
Exemplo
Esta tabela demonstra como a lógica de liquidação de EOD lida com pares de eventos Start e Cancel no mesmo dia em 15/10/2025, mantendo somente o estado final no final do dia.
Hora |
Evento |
Sem liquidação de EOD |
Com liquidação de EOD |
01/08/2025 00:00 |
Start |
Contabilizado como Start |
Contabilizado como Start |
01/09/2025 00:00 |
Renewal |
– |
– |
01/10/2025 00:00 |
Renewal |
– |
– |
15/10/2025 07:00 |
Cancel |
Contabilizado como Cancel |
Excluído |
15/10/2025 09:00 |
Start |
Contabilizado como Start |
Excluído |
15/10/2025 09:15 |
Cancel |
Contabilizado como Cancel |
Contabilizado como Cancel |
Observação: O cliente é contabilizado apenas como Cancel (ou não é contabilizado, dependendo do contexto do ciclo de vida), e não como Start e Cancel simultaneamente. A liquidação no final do dia aplica-se somente a métricas liquidadas (inícios, cancelamentos). As métricas instantâneas usam intervalos de assinatura criados a partir de eventos deduplicados do registro de alterações sem liquidação de EOD para preservar a linha do tempo completa do evento necessária para cálculos e conversões pontuais.
Etapa 2: Deduplicação do ciclo de vida
Agrupe eventos em “ciclos” de assinatura e mantenha apenas o primeiro Start e o primeiro Cancel por ciclo de vida. Um Cancel válido requer um Start correspondente no mesmo ciclo de vida.
Implementação-- Step 1: Identify lifecycle boundaries
-- A new lifecycle starts when there's no previous event OR previous event was Cancel
events_with_lifecycle_boundaries AS (
SELECT e.*,
LAG(subscription_event_type) OVER (
PARTITION BY cid, offer_marketplace
ORDER BY event_time_local
) AS prev_event_type
FROM settled_events e
),
-- Step 2: Flag lifecycle starts
events_with_lifecycle_start_flag AS (
SELECT e.*,
CASE
WHEN prev_event_type IS NULL THEN 1 -- First event ever
WHEN prev_event_type = 'Cancel' THEN 1 -- After a cancel
ELSE 0
END AS is_lifecycle_start
FROM events_with_lifecycle_boundaries e
),
-- Step 3: Assign lifecycle numbers using cumulative sum
events_with_lifecycle_id AS (
SELECT e.*,
SUM(is_lifecycle_start) OVER (
PARTITION BY cid, offer_marketplace
ORDER BY event_time_local
ROWS UNBOUNDED PRECEDING
) AS lifecycle_num
FROM events_with_lifecycle_start_flag e
),
-- Step 4: Keep only first Start and first Cancel per lifecycle
events_with_dedup_rank AS (
SELECT e.*,
ROW_NUMBER() OVER (
PARTITION BY cid, offer_marketplace, lifecycle_num,
CASE WHEN subscription_event_type IN ('Start', 'Renewal') THEN 'Start' END
ORDER BY event_time_local
) AS start_rank,
ROW_NUMBER() OVER (
PARTITION BY cid, offer_marketplace, lifecycle_num,
CASE WHEN subscription_event_type = 'Cancel' THEN 'Cancel' END
ORDER BY event_time_local
) AS cancel_rank
FROM events_with_lifecycle_id e
),
deduped_lifecycle_events AS (
SELECT *
FROM events_with_dedup_rank
WHERE (subscription_event_type IN ('Start', 'Renewal') AND start_rank = 1)
OR (subscription_event_type = 'Cancel' AND cancel_rank = 1 AND lifecycle_has_start = 1)
)
A condição lifecycle_has_start = 1 garante que os cancelamentos só sejam contabilizados quando o ciclo de vida tiver um evento inicial correspondente.
Exemplo
Cliente |
Evento |
Hora |
Ciclo de vida |
Manter? |
ABC |
Start |
1/1/2025 |
1 |
✓ Primeiro Start no ciclo de vida 1 |
ABC |
Renewal |
01/02/2025 |
1 |
✗ Não é o primeiro Start no ciclo de vida 1 |
ABC |
Cancel |
01/03/2025 |
1 |
✓ Primeiro Cancel no ciclo de vida 1 |
ABC |
Start |
15/04/2025 |
2 |
✓ Primeiro Start no ciclo de vida 2 |
ABC |
Cancel |
15/05/2025 |
2 |
✓ Primeiro Cancel no ciclo de vida 2 |
Importante: Assim como a liquidação de EOD, a deduplicação do ciclo de vida é aplicada somente às métricas liquidadas. As métricas instantâneas usam os intervalos de assinatura brutos, nos quais cada Start/Renewal cria um intervalo que termina no próximo evento, preservando a linha do tempo completa necessária para cálculos pontuais.
Métricas
As métricas são medidas calculadas derivadas de eventos de assinatura. Ao contrário das dimensões, as métricas não são armazenadas diretamente no Registro de Eventos, mas você pode calculá-las agregando e transformando os dados do evento. Observe que as fórmulas de cálculo fornecidas são recomendações; você pode ajustá-las para corresponder às suas definições de negócios.
Métricas principais
As métricas a seguir são fundamentais para a análise de assinaturas:
Métrica |
Descrição |
End of Period Subscribers |
Clientes com uma assinatura ativa no final do período |
Active Subscribers |
Clientes que possuem uma assinatura ativa a qualquer momento durante o período |
Subscriber Acquisition (Starts) |
Novos assinantes conquistados |
Cancellations |
Assinantes que cancelaram |
Free Trial Conversion Rate |
Conversão de teste grátis pra assinatura paga |
Net Paid Starts |
Novos assinantes pagantes contabilizados para conversões |
Métricas de assinante
Essas métricas monitoram novas aquisições e cancelamentos de assinantes após a aplicação da deduplicação de liquidação e ciclo de vida.
Métrica |
Definição |
Cálculo |
num_starts |
Contagem de eventos de Start e Renewal que marcam o início de um novo ciclo de vida da assinatura dentro do período do relatório. |
Após aplicar a deduplicação de liquidação e ciclo de vida, contabilize os eventos em que subscription_event_type IN (‘Start’, ‘Renewal’) e o evento se enquadra no período. SUM(CASE WHEN subscription_event_type IN (‘Start', ‘Renewal') AND event_time_local >= period_start AND event_time_local < period_end THEN 1 ELSE 0 END) AS num_starts |
num_starts_ft |
Contagem de inícios em que o tipo de cobrança da oferta é Teste grátis (FT). |
SUM(CASE WHEN subscription_event_type IN (‘Start', ‘Renewal') AND offer_billing_type = ‘FT’ AND event_time_local >= period_start AND event_time_local < period_end THEN 1 ELSE 0 END) AS num_starts_ft |
num_starts_ho |
Contagem de inícios em que o tipo de cobrança da oferta é Oferta definitiva (HO): assinaturas pagas. |
SUM(CASE WHEN subscription_event_type IN (‘Start', ‘Renewal') AND offer_billing_type = ‘HO’ AND event_time_local >= period_start AND event_time_local < period_end THEN 1 ELSE 0 END) AS num_starts_ho |
num_net_starts_ho |
Novos assinantes pagantes líquidos, calculados como inscrições diretas na HO mais conversões de teste grátis. Fornece uma visão completa dos novos assinantes pagantes, independentemente de eles terem se inscrito diretamente em um plano pago ou terem sido convertidos a partir de um teste grátis. |
num_net_starts_ho = num_starts_ho + num_ft_conversions |
num_cancels |
Contagem de eventos Cancel dentro do período do relatório após a aplicação da deduplicação de liquidação e ciclo de vida. |
SUM(CASE WHEN subscription_event_type = ‘Cancel’ AND event_time_local >= period_start AND event_time_local < period_end THEN 1 ELSE 0 END) AS num_cancels |
num_cancels_ho |
Cancelamentos em que o assinante estava em um plano de oferta definitiva (pago). |
– |
num_cancels_ft |
Cancelamentos em que o assinante estava em um plano de teste grátis (o teste terminou sem conversão). |
– |
Métricas do período
Essas métricas fornecem capturas pontuais e atividades do período usando intervalos de assinatura criados sem liquidação no final do dia.
Métrica |
Definição |
Cálculo |
Variantes |
num_end_period_subs |
Contagem de assinantes únicos que estavam ativos no final do período do relatório. Essa é uma captura instantânea em um determinado momento. |
De subscription_spans (criado sem liquidação de EOD) COUNT(DISTINCT CASE WHEN span_start_date < period_end AND (span_end_date É NULO OU span_end_date >= period_end) THEN cid END) AS num_end_period_subs |
num_end_period_subs_ho: assinantes no final do período em planos de Oferta definitiva; num_end_period_subs_ft: assinantes no final do período em planos de Teste grátis |
num_active_period_subs |
Contagem de assinantes únicos que estiveram ativos em algum momento durante o período do relatório. Captura todos os clientes que tiveram uma assinatura ativa coincidindo com o período, independentemente de quando eles começaram ou cancelaram. |
De subscription_spans (criado sem liquidação de EOD) COUNT(DISTINCT CASE WHEN span_start_date < period_end AND (span_end_date É NULO OU span_end_date >= period_start) THEN cid END) AS num_active_period_subs |
num_active_period_subs_ho: assinantes ativos em qualquer momento durante o período em planos de oferta definitiva (pagos); num_active_period_subs_ft: assinantes ativos em qualquer momento durante o período em planos de teste grátis |
Observação: As métricas de período usam subscription_spans criadas sem liquidação de EOD para preservar a linha do tempo completa do evento.
Métricas de teste grátis
Essas métricas monitoram as conversões e liquidações de testes grátis usando intervalos de assinatura criados sem liquidação de EOD.
Métrica |
Definição |
Cálculo |
conversões num_ft_ft |
Contagem de assinantes da versão de teste grátis que converteram para um plano pago (Oferta definitiva) dentro do período do relatório. Uma conversão ocorre quando um assinante da versão de teste grátis (offer_billing_type = ‘FT’) tem seu próximo evento como Start/Renewal com offer_billing_type = ‘HO’. |
De subscription_spans (criado sem liquidação de EOD) COUNT(CASE WHEN offer_billing_type = ‘FT’ AND span_end_billing_type = ‘HO’ AND span_end_event_type IN (‘Start', ‘Renewal') AND span_end_date >= period_start AND span_end_date < period_end THEN 1 END) AS num_ft_conversions |
num_ft_settled |
Contagem de assinaturas de teste grátis que foram liquidadas (chegaram a uma finalização) dentro do período do relatório. Um período de teste grátis é concluído quando o assinante converte para assinatura paga ou cancela (o próximo tipo de cobrança não é FT). |
COUNT(CASE WHEN offer_billing_type = ‘FT’ AND span_end_date NÃO É NULO AND span_end_date >= period_start AND span_end_date < period_end THEN 1 FIM) AS num_pt_settled |
ft_conversion_rate_pct |
Porcentagem de testes grátis liquidados que se converteram em assinaturas pagas. |
CASE WHEN num_ft_settled > 0 THEN ROUND(100.0 * num_ft_conversions / num_ft_settled, 2) ELSE 0 END AS ft_conversion_rate_pct |
Observação: As métricas de teste grátis usam subscription_spans criadas sem liquidação de EOD para monitorar com precisão as conversões em que os clientes mudam de um offer_id para outro.
Noções básicas sobre padrões de eventos
Esta seção explica os padrões de eventos comuns que você encontrará no Registro de Eventos de Assinatura e como interpretá-los corretamente.
Ciclo de vida da assinatura
Uma assinatura típica segue esse ciclo de vida, passando por quatro etapas principais, desde a inscrição inicial até os ciclos de renovação e possível cancelamento. Cada etapa gera tipos de eventos específicos que permitem acompanhar o comportamento do cliente e calcular métricas de assinatura.
Principais pontos do ciclo de vida
Esses principais pontos do ciclo de vida representam as quatro etapas críticas na jornada de assinatura de um cliente, cada uma gerando tipos de eventos distintos que permitem o monitoramento dos padrões de aquisição, retenção, engajamento e rotatividade.
Estágio |
Tipo de evento |
Descrição |
Aquisição |
Start |
Novo cliente se junta ao seu canal |
Retenção |
Renewal |
O cliente existente continua com a assinatura |
Engajamento |
Active - AR ON/OFF |
O cliente ajusta a preferência de renovação automática |
Rotatividade |
Cancel |
A assinatura do cliente é encerrada |
Padrões de eventos comuns
Padrão 1: Renovação sem Start
O histórico de eventos de um cliente mostra eventos de Renewal, mas nenhum Start. O evento Start original do cliente ocorreu há mais de dois anos. Devido à política de retenção de dados, eventos com mais de dois anos não estão disponíveis. Os eventos de Renewal dentro do período ainda estão acessíveis.
Padrão 2: Vários eventos Cancel
Um cliente tem vários eventos Cancel em poucos minutos ou horas. Esse padrão geralmente indica falhas na repetição da tentativa de pagamento: O sistema de cobrança tenta cobrar a forma de pagamento do cliente. Cada tentativa malsucedida pode gerar um evento Cancel. O cliente pode estar tentando se inscrever novamente com um cartão recusado. A deduplicação do ciclo de vida manterá apenas o primeiro Cancel por ciclo de vida.
Padrão 3: Start e Cancel no mesmo dia
Um cliente tem um Start e Cancel no mesmo dia do calendário. As causas comuns incluem:
- O cliente se inscreveu e cancelou imediatamente
- A autorização de pagamento falhou após a inscrição inicial
- Tentativa de inscrição fraudulenta bloqueada
A liquidação de EOD trata disso automaticamente, apenas o estado final é mantido.
Padrão 4: Conversão de teste grátis para assinatura paga
Um cliente tem um Start com offer_billing_type = ‘FT’, seguido por outro Start ou Renewal com offer_billing_type = ‘HO’. O cliente concluiu o período de teste grátis e converteu para uma assinatura paga. Use as funções de janela LEAD() para detectar quando offer_billing_type muda de FT para HO. Contabilize como uma conversão quando o evento de transição ocorrer dentro do seu período de relatório.
Eventos de renovação automática
Os eventos de renovação automática (AR) monitoram quando os clientes ativam ou desativam a renovação automática da assinatura. Esses eventos fornecem sinais antecipados para prever a rotatividade futura e identificar assinantes em risco.
Tipo de evento |
Descrição |
Caso de uso |
AR_ON |
O cliente ativou a renovação automática. A assinatura será renovada automaticamente no final do período atual. |
Acompanhe os clientes que se comprometeram a continuar sua assinatura. |
AR_OFF |
O cliente desativou a renovação automática. A assinatura expirará no final do período atual, a menos que a renovação automática seja reativada. |
Sinal de alerta precoce: Os clientes que desativam a renovação automática estão sinalizando a intenção de cancelar antes que sua assinatura realmente termine. Previsão de rotatividade: Os assinantes AR OFF certamente cancelarão o serviço ao final do período, a menos que reativem a renovação automática. Isso faz com que os eventos AR OFF sejam um dos indicadores mais confiáveis de rotatividade futura. |
Observação: Os eventos de renovação automática são registrados sempre que um cliente altera ativamente sua preferência de renovação automática por meio da interface de gerenciamento de assinaturas.
Como analisar de eventos de AR
Para analisar o comportamento de renovação automática, consulte os eventos AR ON/OFF separadamente do pipeline principal de métricas do ciclo de vida. Os eventos AR seguem as mesmas regras de deduplicação do registro de alterações, mas não são incluídos nos cálculos do ciclo de vida Start/Renewal/Cancel.
-- Example:Filter to AR Off Events
SELECT *
FROM deduped_events
WHERE subscription_event_type = 'AR_OFF'
GROUP BY 1, 2
ORDER BY 1, 2
Pipeline de ETL
Com base nas definições de métricas e nas transformações de dados acima, use esse pipeline de ETL (Extrair, Transformar, Carregar) para transformar dados brutos do Registro de Eventos de Assinatura em métricas claras e significativas para os negócios. Essa consulta pode ser realizada diretamente no Amazon Athena.
O pipeline implementa uma arquitetura de dois caminhos para calcular corretamente os diferentes tipos de métricas:
- Caminho A: Eventos liquidados: aplica a liquidação de EOD E a deduplicação do ciclo de vida. Usado para métricas liquidadas (inícios, cancelamentos). Isso filtra interferências, como pares de Start mais Cancel no mesmo dia, que não representam aquisições reais.
- Caminho B: Períodos de assinatura: aplica SOMENTE a deduplicação do registro de alterações. Usado para métricas instantâneas (contagens de fim de período, conversões FT).
-- ============================================================================
-- SUBSCRIPTION METRICS ETL PIPELINE
-- ============================================================================
-- Transforms raw subscription events into clean metrics using TWO PATHS:
-- PATH A: Settled Events - for settled metrics (starts, cancels)
-- Applies: Changelog dedup → EOD settlement → Lifecycle dedup
-- Filters out noise like same-day start+cancel pairs
-- PATH B: Subscription Spans - for snapshot metrics (end-of-period, conversions)
-- Applies: Changelog dedup ONLY (preserves full timeline)
-- Required for conversions because customer switches offer_id (A → B)
-- ============================================================================
WITH
-- =============================================================================
-- STEP 1: Parse timestamps and convert to local timezone
-- =============================================================================
parsed_events AS (
SELECT
subscription_event_id,
subscription_event_type,
subscription_event_time_utc,
subscription_event_time_zone,
cid,
offer_id,
offer_name,
offer_marketplace,
offer_billing_type,
offer_payment_amount,
is_promo,
channel_label,
channel_tier_label,
benefit_id,
is_deleted,
last_update_time_utc,
-- Parse and convert timestamps
parse_datetime(subscription_event_time_utc, 'yyyy-MM-dd''T''HH:mm:ss.SSS''Z''') AS event_time_utc,
CAST(DATE_FORMAT(
AT_TIMEZONE(
parse_datetime(subscription_event_time_utc, 'yyyy-MM-dd''T''HH:mm:ss.SSS''Z'''),
subscription_event_time_zone
),
'%Y-%m-%d %H:%i:%s.%f'
) AS TIMESTAMP) AS event_time_local,
CAST(DATE_FORMAT(
AT_TIMEZONE(
parse_datetime(subscription_event_time_utc, 'yyyy-MM-dd''T''HH:mm:ss.SSS''Z'''),
subscription_event_time_zone
),
'%Y-%m-%d'
) AS DATE) AS event_date_local
FROM your_subscription_events_table
WHERE is_deleted = 0
AND subscription_event_type IN ('Start', 'Renewal', 'Cancel')
),
-- =============================================================================
-- STEP 2: Deduplicate changelog records (used by BOTH paths)
-- =============================================================================
deduped_events AS (
SELECT * FROM (
SELECT
*,
ROW_NUMBER() OVER (
PARTITION BY subscription_event_id
ORDER BY last_update_time_utc DESC
) AS dedup_rank
FROM parsed_events
)
WHERE dedup_rank = 1
),
-- =============================================================================
-- PATH A: SETTLED EVENTS (for starts, cancels)
-- Applies: Changelog dedup → EOD settlement → Lifecycle dedup
-- =============================================================================
-- STEP A1: EOD Settlement - Identify same-day Start+Cancel pairs
same_day_start_and_cancel AS (
SELECT cid, offer_marketplace, event_date_local
FROM deduped_events
GROUP BY cid, offer_marketplace, event_date_local
HAVING
SUM(CASE WHEN subscription_event_type IN ('Start', 'Renewal') THEN 1 ELSE 0 END) > 0
AND SUM(CASE WHEN subscription_event_type = 'Cancel' THEN 1 ELSE 0 END) > 0
),
-- Rank events by time within each day
events_with_eod_rank AS (
SELECT
e.*,
ROW_NUMBER() OVER (
PARTITION BY e.cid, e.offer_marketplace, e.event_date_local
ORDER BY e.event_time_local DESC
) AS eod_rank
FROM deduped_events e
),
-- Apply EOD settlement: for same-day pairs, keep only the last event
eod_settled_events AS (
SELECT e.*
FROM events_with_eod_rank e
LEFT JOIN same_day_start_and_cancel sd
ON e.cid = sd.cid
AND e.offer_marketplace = sd.offer_marketplace
AND e.event_date_local = sd.event_date_local
WHERE sd.cid IS NULL OR e.eod_rank = 1
),
-- STEP A2: Build customer lifecycles (on EOD settled data)
settled_events_with_prev AS (
SELECT
*,
LAG(subscription_event_type) OVER (
PARTITION BY cid, offer_marketplace
ORDER BY event_time_local
) AS prev_event_type
FROM eod_settled_events
),
settled_events_with_lifecycle_flag AS (
SELECT
*,
CASE
WHEN prev_event_type IS NULL THEN 1
WHEN prev_event_type = 'Cancel' THEN 1
ELSE 0
END AS is_lifecycle_start
FROM settled_events_with_prev
),
settled_events_with_lifecycle AS (
SELECT
*,
SUM(is_lifecycle_start) OVER (
PARTITION BY cid, offer_marketplace
ORDER BY event_time_local
ROWS UNBOUNDED PRECEDING
) AS lifecycle_num,
cid || '|' || offer_marketplace || '|' || CAST(
SUM(is_lifecycle_start) OVER (
PARTITION BY cid, offer_marketplace
ORDER BY event_time_local
ROWS UNBOUNDED PRECEDING
) AS VARCHAR
) AS lifecycle_id
FROM settled_events_with_lifecycle_flag
),
-- STEP A3: Lifecycle deduplication
events_with_type_rank AS (
SELECT
*,
CASE WHEN subscription_event_type IN ('Start', 'Renewal') THEN
ROW_NUMBER() OVER (
PARTITION BY lifecycle_id,
CASE WHEN subscription_event_type IN ('Start', 'Renewal') THEN 'START' END
ORDER BY event_time_local
)
END AS start_rank,
CASE WHEN subscription_event_type = 'Cancel' THEN
ROW_NUMBER() OVER (
PARTITION BY lifecycle_id,
CASE WHEN subscription_event_type = 'Cancel' THEN 'CANCEL' END
ORDER BY event_time_local
)
END AS cancel_rank,
MAX(CASE WHEN subscription_event_type IN ('Start', 'Renewal') THEN 1 ELSE 0 END) OVER (
PARTITION BY lifecycle_id
) AS lifecycle_has_start
FROM settled_events_with_lifecycle
),
settled_events AS (
SELECT *
FROM events_with_type_rank
WHERE
(subscription_event_type IN ('Start', 'Renewal') AND start_rank = 1)
OR (subscription_event_type = 'Cancel' AND cancel_rank = 1 AND lifecycle_has_start = 1)
),
-- =============================================================================
-- PATH B: SUBSCRIPTION SPANS (for conversions, end-of-period)
-- Applies: Changelog dedup ONLY (NO EOD settlement, NO lifecycle dedup)
-- This preserves the full timeline needed for accurate span calculations
-- =============================================================================
-- STEP B1: Calculate LEAD() on ALL deduped events (before any filtering)
events_with_span_boundaries AS (
SELECT
cid,
offer_marketplace,
offer_id,
offer_billing_type,
subscription_event_type,
event_time_local,
event_date_local,
LEAD(event_time_local) OVER (
PARTITION BY cid, offer_marketplace
ORDER BY event_time_local
) AS next_event_time,
LEAD(subscription_event_type) OVER (
PARTITION BY cid, offer_marketplace
ORDER BY event_time_local
) AS next_event_type,
LEAD(offer_billing_type) OVER (
PARTITION BY cid, offer_marketplace
ORDER BY event_time_local
) AS next_billing_type
FROM deduped_events -- Uses deduped_events directly, NOT eod_settled_events
),
-- STEP B2: Create spans from Start/Renewal events
subscription_spans AS (
SELECT
cid,
offer_marketplace,
offer_id,
offer_billing_type,
subscription_event_type,
event_time_local AS span_start,
event_date_local AS span_start_date,
next_event_time AS span_end,
CAST(next_event_time AS DATE) AS span_end_date,
next_event_type AS span_end_event_type,
next_billing_type AS span_end_billing_type
FROM events_with_span_boundaries
WHERE subscription_event_type IN ('Start', 'Renewal')
),
-- =============================================================================
-- STEP 3: Generate reporting periods
-- =============================================================================
reporting_periods AS (
SELECT
period_month,
CAST(period_month AS DATE) AS period_start,
CAST(DATE_ADD('month', 1, period_month) AS DATE) AS period_end
FROM UNNEST(SEQUENCE(DATE '2025-01-01', DATE '2025-12-01', INTERVAL '1' MONTH)) AS t(period_month)
),
-- =============================================================================
-- STEP 4A: SETTLED METRICS (from settled events - with EOD + lifecycle dedup)
-- Use for: starts, cancels
-- =============================================================================
settled_metrics AS (
SELECT
DATE_FORMAT(p.period_start, '%Y-%m') AS report_month,
e.offer_marketplace,
-- Starts (all)
SUM(CASE WHEN e.subscription_event_type IN ('Start', 'Renewal')
AND e.event_date_local >= p.period_start
AND e.event_date_local < p.period_end
THEN 1 ELSE 0 END) AS num_starts,
-- Starts (Free Trial)
SUM(CASE WHEN e.subscription_event_type IN ('Start', 'Renewal')
AND e.offer_billing_type = 'FT'
AND e.event_date_local >= p.period_start
AND e.event_date_local < p.period_end
THEN 1 ELSE 0 END) AS num_starts_ft,
-- Starts (Hard Offer / Paid)
SUM(CASE WHEN e.subscription_event_type IN ('Start', 'Renewal')
AND e.offer_billing_type = 'HO'
AND e.event_date_local >= p.period_start
AND e.event_date_local < p.period_end
THEN 1 ELSE 0 END) AS num_starts_ho,
-- Cancels (all)
SUM(CASE WHEN e.subscription_event_type = 'Cancel'
AND e.event_date_local >= p.period_start
AND e.event_date_local < p.period_end
THEN 1 ELSE 0 END) AS num_cancels,
-- Cancels (Hard Offer)
SUM(CASE WHEN e.subscription_event_type = 'Cancel'
AND e.offer_billing_type = 'HO'
AND e.event_date_local >= p.period_start
AND e.event_date_local < p.period_end
THEN 1 ELSE 0 END) AS num_cancels_ho,
-- Cancels (Free Trial)
SUM(CASE WHEN e.subscription_event_type = 'Cancel'
AND e.offer_billing_type = 'FT'
AND e.event_date_local >= p.period_start
AND e.event_date_local < p.period_end
THEN 1 ELSE 0 END) AS num_cancels_ft
FROM settled_events e
CROSS JOIN reporting_periods p
GROUP BY DATE_FORMAT(p.period_start, '%Y-%m'), e.offer_marketplace
),
-- =============================================================================
-- STEP 4B: SNAPSHOT METRICS (from subscription spans - NO EOD settlement)
-- Use for: end-of-period counts, conversions, settled trials
-- =============================================================================
snapshot_metrics AS (
SELECT
DATE_FORMAT(p.period_start, '%Y-%m') AS report_month,
s.offer_marketplace,
-- End of period counts (who was active at period end?)
COUNT(DISTINCT CASE
WHEN s.span_start_date < p.period_end
AND (s.span_end_date IS NULL OR s.span_end_date >= p.period_end)
THEN s.cid
END) AS num_end_period_subs,
COUNT(DISTINCT CASE
WHEN s.offer_billing_type = 'HO'
AND s.span_start_date < p.period_end
AND (s.span_end_date IS NULL OR s.span_end_date >= p.period_end)
THEN s.cid
END) AS num_end_period_subs_ho,
COUNT(DISTINCT CASE
WHEN s.offer_billing_type = 'FT'
AND s.span_start_date < p.period_end
AND (s.span_end_date IS NULL OR s.span_end_date >= p.period_end)
THEN s.cid
END) AS num_end_period_subs_ft,
-- Active at any point during the period
COUNT(DISTINCT CASE
WHEN s.span_start_date < p.period_end
AND (s.span_end_date IS NULL OR s.span_end_date >= p.period_start)
THEN s.cid
END) AS num_active_period_subs,
COUNT(DISTINCT CASE
WHEN s.offer_billing_type = 'HO'
AND s.span_start_date < p.period_end
AND (s.span_end_date IS NULL OR s.span_end_date >= p.period_start)
THEN s.cid
END) AS num_active_period_subs_ho,
COUNT(DISTINCT CASE
WHEN s.offer_billing_type = 'FT'
AND s.span_start_date < p.period_end
AND (s.span_end_date IS NULL OR s.span_end_date >= p.period_start)
THEN s.cid
END) AS num_active_period_subs_ft,
-- Conversions (FT span ending with HO start in this period)
COUNT(CASE
WHEN s.offer_billing_type = 'FT'
AND s.span_end_billing_type = 'HO'
AND s.span_end_event_type IN ('Start', 'Renewal')
AND s.span_end_date >= p.period_start
AND s.span_end_date < p.period_end
THEN 1
END) AS num_ft_conversions,
-- FT Settled (FT span that ended in this period)
COUNT(CASE
WHEN s.offer_billing_type = 'FT'
AND s.span_end_date IS NOT NULL
AND s.span_end_date >= p.period_start
AND s.span_end_date < p.period_end
THEN 1
END) AS num_ft_settled
FROM subscription_spans s
CROSS JOIN reporting_periods p
GROUP BY DATE_FORMAT(p.period_start, '%Y-%m'), s.offer_marketplace
)
-- =============================================================================
-- FINAL OUTPUT: Combine flow and snapshot metrics
-- =============================================================================
SELECT
sm.report_month,
sm.offer_marketplace,
-- Starts (from settled events)
sm.num_starts,
sm.num_starts_ft,
sm.num_starts_ho,
-- Net Starts (paid starts + conversions)
sm.num_starts_ho + sn.num_ft_conversions AS num_net_starts_ho,
-- Cancels (from settled events)
sm.num_cancels,
sm.num_cancels_ho,
sm.num_cancels_ft,
-- Free Trial Metrics (from spans)
sn.num_ft_conversions,
sn.num_ft_settled,
CASE WHEN sn.num_ft_settled > 0
THEN ROUND(100.0 * sn.num_ft_conversions / sn.num_ft_settled, 2)
ELSE 0
END AS ft_conversion_rate_pct,
-- Active Subscribers (from spans)
sn.num_active_period_subs,
sn.num_active_period_subs_ho,
sn.num_active_period_subs_ft,
-- End of Period Subscribers (from spans)
sn.num_end_period_subs,
sn.num_end_period_subs_ho,
sn.num_end_period_subs_ft
FROM settled_metrics sm
JOIN snapshot_metrics sn
ON sm.report_month = sn.report_month
AND sm.offer_marketplace = sn.offer_marketplace
ORDER BY sm.report_month, sm.offer_marketplace
Observação: Substitua your_subscription_events_table pelo nome real da tabela. Ajuste o intervalo de datas reporting_periods para atender às suas necessidades de análise.