liquid_amplitude 0.2.0
liquid_amplitude: ^0.2.0 copied to clipboard
Amplitude destination for liquid_analytics — product analytics with user and group properties, EU residency, and opt-out.
// Amplitude as a liquid destination — user and group properties, US/EU
// residency and client-side opt-out.
import 'package:liquid_amplitude/liquid_amplitude.dart';
import 'package:liquid_analytics/liquid_analytics.dart';
class CheckoutStarted extends LiquidEvent {
const CheckoutStarted({required this.cartValue, required this.items});
final double cartValue;
final List<String> items;
@override
String get name => 'checkout_started';
@override
Map<String, Object?> get properties => {
'cart_value': cartValue,
'items': items, // nested lists/maps arrive intact
};
}
Future<void> main() async {
final amplitude = AmplitudeSink(
apiKey: 'YOUR_API_KEY',
serverZone: ServerZone.eu, // data residency
optOut: true, // start opted out until consent arrives
groupType: 'company',
);
final liquid = Liquid(
sinks: [amplitude],
consent: const ConsentPolicy(
requireOptIn: true,
map: {
ConsentCategory.analytics: ['amplitude'],
},
),
);
await liquid.init();
// Mirror the decision into Amplitude's own opt-out.
liquid.consent.addListener(() async {
await amplitude.applyConsent(
granted: liquid.consent.statusOf(ConsentCategory.analytics) ==
ConsentStatus.granted,
);
});
liquid.log(const CheckoutStarted(cartValue: 42, items: ['sku_1', 'sku_2']));
liquid.consent.grant(ConsentCategory.analytics); // buffered events replay
liquid.screen('Cart'); // -> track('Screen Viewed') + screen_name
liquid.identify('user_123', {'plan': 'pro'}); // setUserId + Identify traits
liquid.group('acme_inc', {'seats': 40}); // setGroup + groupIdentify
await liquid.flush();
await liquid.reset();
await liquid.dispose();
}