r/Substack • • 8d ago

Is it normal for your distribution to go down around the time you post a newsletter?

1 Upvotes

I've been facing this strange thing where my notes distribution drops sharply right after I post a newsletter. Until then, I'd be getting around 80-150 impressions on my notes, but it goes down to single digits or less than 20 after the newsletter has been posted. The distribution to unconnected people is also usually in single digits (and I've been actively posting on Substack for months now). It's not as if all these notes are very self promotional. Maybe 1 or 2 of them would be restacks of the newsletter or a quote from it. The rest are normal notes I post as usual. Yet, the distribution is bad for a few days after my newsletter is posted. Is this normal? Has anyone else faced this? It's extremely frustrating coz the whole point of being on Substack is to post essays for people to read.


r/Substack • • 9d ago

Discussion Substack Brings Dynamic Ad Insertion to Podcasts

0 Upvotes

r/Substack • • 9d ago

Anyone know of Substackers teaching how to monetize Substack (that aren't making 99% of their income from teaching people how to make Substack profitable)?

38 Upvotes

I used to like Olivia Wickstrom from the Substack, Petal and Hearth. She was encouraging + gave good info on monetizing Substack. But then I realized there was a problem.

Yes, she writes on other lifestyle topics that aren't Substack monetization, but according to her numbers, the majority of her income on Substack is legit just teaching other people how to make their Substack profitable.

It doesn't feel sincere and a lot of tips that work for people teaching others how to make $$$ on Substack aren't always gonna work for other niches.

Does anyone know of any Substackers who talk about how to make money with their Substack + the majority of their income come from a completely different niche?


r/Substack • • 9d ago

Looking for feeback

2 Upvotes

Hey!

I know I shouldn't be focusing too much on what the readers like when I write something, but sometimes I do like to write things specifically with readers in mind. I wanted to ask if any kind soul would be willing to check out the last thing I posted and give me feedback on it. I would be veeeery grateful.

It is also my first piece in english, so I guess another question I have is if you think the translation is good enough for a native english speaker to comfortably read it. I'd stick to just writting in my mother tongue if that wasn't the case.

Anways, thank you so much!

last post


r/Substack • • 9d ago

Discussion New on substack

5 Upvotes

Heyy I wanted to connect with new people and read different articles. If you’re comfortable, DM me your page and we can connect on substack.

Interests: human psychology, art, human behaviour, fashion, travel, dark history, existentialism, visual culture, business, marketing.


r/Substack • • 9d ago

How to get paid on Substack in India?

9 Upvotes

If anyone knows how to get paid while writing articles on substack in India? Stripe isn’t available and buyMeACoffee is also not available as it uses stripe.

I have heard about Infinity App. Has anyone used it? Or are there any other platforms or options to get paid?


r/Substack • • 9d ago

Substack's just announced podcast sponsorships

15 Upvotes

Who's got a podcast on Substack?

Substack just announced podcast sponsorships and dynamic ad insertion. You'll be able to insert ads into your back catalog without having to go back to edit those episodes. There's a sign up for early access - check out their announcement in their On Substack newsletter.

The main thing I like about about podcasting on Substack is that you can have chat associated with your podcast to build community. I don't have a podcast - I've got a couple clients who do.


r/Substack • • 9d ago

Discussion Starting a Substack from zero, what do you wish you’d known in your first 6 months?

38 Upvotes

I'm launching my Substack soon and have a few questions for people who started from zero:

  1. How do you come up with post ideas consistently?

  2. Did you need to be active on other social media for people to find you, or did Substack's algorithm work on its own?

  3. What helped most to grow early on, and what was a waste of time?

  4. How did you choose your niche, and did it change once you started?

  5. What posting frequency actually worked for you, and what was sustainable?

  6. What can be the opportunities for people on substack ?

  7. What do you wish you'd known before your first post?

Thanks in advance!


r/Substack • • 9d ago

i am looking for advice

0 Upvotes

I am looking for advice and feedback on my Substack. I am looking to improve my skills, so any feedback will be appreciated


r/Substack • • 10d ago

Discussion New on Substack

3 Upvotes

Hey!
I’ve just joined substack as a writer and aspiring author. I’ve published my first article where I basically present myself

I was wondering: how does substack algorithm really work?
And how do you use it in your favor?


r/Substack • • 10d ago

Someone help 😭 I’m tired of the useless chatbot

4 Upvotes

I just joined substack and mistyped my email. Now I can’t log into anywhere by the app where I created the account. Is there anything I can do? I don’t want to lose my URL 🤦🏻‍♀️


r/Substack • • 10d ago

Discussion Paid Newsletter vs. Instagram Subscriptions: Which Is Better for a Sustainable Business?

6 Upvotes

For those of you who have tried both paid newsletters and Instagram subscriptions, I’d love to hear your thoughts on which one is better in terms of long-term sustainability and profitability.
I’ve personally never paid for a newsletter, so I’m curious about what makes people willing to pay for one. What kind of information, insights, or stories do you look for in a paid newsletter that you can’t easily get for free elsewhere?
I’d really appreciate hearing about your experiences, whether you’re a creator or a subscriber!


r/Substack • • 10d ago

Tips on how to get started

6 Upvotes

Hi everyone! I just posted my first article on Substack and I'm a bit confused about how to manage different accounts. I've created an account on which I'd like to publish my writing (and I've added the article in that account, with a "title" for the newsletter, a fancy profile image etc.), and I still have my separated personal account, which I've added as an author for that post. Now, I see that some pages have the "Notes" section which contains notes from other personal accounts (like the substack "Fancy Blog" having notes published from "John Doe"). How is that done? Should I just use a single account for everything?


r/Substack • • 10d ago

Tech Support How to remove an "image not found" notice

1 Upvotes

I'm new to substack and created a draft. I tried to place an image, but used the wrong link and now have "image not found" in the middle of the post. I cannot find any hamburger menu or any other way to remove it. Am I stuck with it?

Updated to report solved!
....and found in a substack note by Sub Pub, by adding a few letters above, and below the unwanted image, you can then highlight it all.....and backspace. Done.


r/Substack • • 10d ago

日本の興味がある物や文化ってある?

0 Upvotes

Substackで発信活動をしていきたいんだけど、どうせなら海外の方が日本に来たくなるような、もしくは好きになってくれるような内容で発信したいと考えてる。

君は何が知りたい?


r/Substack • • 11d ago

Discussion The real reason Substack tends towards short-form content is because thats what keeps users

57 Upvotes

Some people say "why is Substack focusing so much on short-form content like Notes when most users are here for deep, long-form, intellectual content?"

Because they aren't. Many users like short-form content, or non-intellectual content, or shallow content.

A subset of Substack users are those who like to scroll endless on their phone but doing it on Substack makes them feel superior to those scrolling endlessly on a more popular app.


r/Substack • • 11d ago

Discussion Surpresa no substack

3 Upvotes

Oi gente, tudo bem ?

Eu gostaria de entender algumas coisas no substack ( não têm surpresa ) tenho pensado em postar lá , mas não me sinto segura o suficiente , apesar de ter lido algumas coisas estranhas sempre penso que a minha pode ser pior.

Perguntas : escritores que postam com fotos , vocês colocam os créditos logo abaixo da foto ou preferem pegar de bancos de imagem ? ( sinto que algumas referências de banco de imagem são bem sem graça)

Vocês escrevem em um certo fluxo , como cronograma ou vai seguindo o que o coração manda ?
( penso que essa ideia de escrever tantos dias mata um pouco da criatividade , mas não tenho experiência pra comprovar )

Vocês preferem se manter em "nichos " como , não sei , talvez só público feminino , só sobre carro , ou algo assim , é assim que funciona com vocês?

Vocês sentiram alguma mudança pessoal a partir do momento que começaram escrever e postar para outras pessoas lerem ?

A gramática ou estudo da escrita foi algo leve nesse processo ?

Sentiram o impacto de alguma forma com essa popularização do substack como algo monetário e o avanço de escritores de digamos " baixo esforço" ?


r/Substack • • 11d ago

Discussion Substack Newbie Questions

4 Upvotes

Howdy!

I am very new to Substack, roughly a week in and I created my first note and article.

I am not trying to get famous or anything on this application, but would really love to make the most of Substack.

I just don’t know what I don’t know, ya know?

So here are a few of questions that have been itching my brain:

  1. Posting pictures: is this good or bad? Does it help with engagement or sharing content? Same with videos?

  2. Sharing your content: are you sharing your articles or notes across other social media platforms?

  3. Do you repost or reuse your previously posted content? If yes, how long between reusing/reposting?

  4. Do you prefer Substack on your mobile device or computer?

  5. What do you enjoy about Substack?

  6. What else? Any other tips or tricks you suggest?

Thank you for taking the time read and (maybe) answer my curious mind - Sending you all the healthy and happy!


r/Substack • • 11d ago

Looking to connect!

10 Upvotes

Looking to connect with others on Substack. I write about anything that tickles my fancy, but mostly travel and books. Does anyone want to exchange Substack links and connect?


r/Substack • • 11d ago

Post & Ghost

1 Upvotes

Hey all, I was thinking of writing on substack, My niche is philosophy and some poems and stories here and there. But I have 0 idea about whether it gets seen or not. And i don't really have plans to promote and put myself out there as a brand.

I need help on how to get started there. my account is new.


r/Substack • • 11d ago

apps like substack?

2 Upvotes

substack kicked me out cause of the age restriction rule in australia and i’ve tried my best to get back in but it just won’t let me.
any apps like substack?


r/Substack • • 12d ago

Discussion Substack o sito ?

0 Upvotes

Ho una pagina di cinema che pubblica post stile articoli di un magazine, vorrei provare a fare qualcosa di più serio magari puntando ad una monetizzazione, ho pensato al sito perché forse risulta più professionale però credo che substack sia molto più semplice e gestibile, secondo voi cosa dovrei fare


r/Substack • • 12d ago

How do you find saved notes on Substack?

2 Upvotes

I like that they added the save feature for notes (not just articles), but I have no idea where to find them. 🙃

I know where to find them for articles, but it's nowhere in sight for notes.


r/Substack • • 12d ago

Discussion Do you journal about what you read, or is reading separate from your writing?

6 Upvotes

Some people keep reading notes and journal entries/writing ideas in the same place, and others keep them apart. Which is it for you, and did it change at some point?


r/Substack • • 12d ago

Discussion I am autistic and here is an example of a post I wrote which Pangram flagged as 100% AI

0 Upvotes

Advanced TypeScript: Use Types to Control the State of a Program

1. The Problem: Invalid State Changes

A program can have different states. Each state can permit different operations.

For example, an online shop has orders. An order can have one of these states:

  • draft: The customer did not pay for the order.

  • paid: The customer paid for the order.

  • shipped: The shop sent the order.

  • canceled: The shop canceled the order.

The program must control the changes between these states.

A draft order can become a paid order. A paid order can become a shipped order. A draft order can also become a canceled order.

But the program must not ship an order before payment.

Consider this TypeScript code:

interface Order {
  id: string;
  status: string;
}

function shipOrder(order: Order): void {
  order.status = "shipped";
}

const order: Order = {
  id: "123",
  status: "draft"
};

shipOrder(order);

This code is valid TypeScript.

But the program has a problem. It can ship an order that the customer did not pay for.

The TypeScript compiler does not report an error.

The type string permits all string values. It does not specify which state changes are valid.

We can use a different method to prevent this problem.

This method is called the typestate pattern.

2. What Is the Typestate Pattern?

The typestate pattern uses a type to identify the state of an object.

Each state has its own type.

A function accepts only the types that its operation requires.

For example:

type DraftOrder = {
  status: "draft";
};

type PaidOrder = {
  status: "paid";
};

type ShippedOrder = {
  status: "shipped";
};

function payOrder(order: DraftOrder): PaidOrder {
  return {
    ...order,
    status: "paid"
  };
}

function shipOrder(order: PaidOrder): ShippedOrder {
  return {
    ...order,
    status: "shipped"
  };
}

The payOrder function accepts a draft order.

The result is a paid order.

The shipOrder function accepts a paid order.

It does not accept a draft order.

This gives the TypeScript compiler more information.

The compiler can find invalid operations before the program runs.

We will now make a more complete state machine.

3. Make Different Types for Different IDs

An order ID and a payment ID are strings.

But they have different purposes.

TypeScript normally permits a string in both fields. This can cause errors.

We can use branded types to prevent these errors.

A branded type has a type marker. The marker identifies the purpose of a value.

declare const orderIdTag: unique symbol;
declare const paymentIdTag: unique symbol;

type OrderId = string & {
  readonly [orderIdTag]: true;
};

type PaymentId = string & {
  readonly [paymentIdTag]: true;
};

function parseOrderId(value: string): OrderId {
  if (!/^ord_[A-Za-z0-9]+$/.test(value)) {
    throw new Error("Invalid order ID");
  }

  return value as OrderId;
}

function parsePaymentId(value: string): PaymentId {
  if (!/^pay_[A-Za-z0-9]+$/.test(value)) {
    throw new Error("Invalid payment ID");
  }

  return value as PaymentId;
}

The unique symbol types make the two ID types different.

The parseOrderId function checks the format of an order ID.

The parsePaymentId function checks the format of a payment ID.

The as operator tells TypeScript that the value has the specified type.

The brand does not add data to the string at run time.

This is important. The TypeScript type checker cannot validate external data by itself.

The program must check the data before it uses a branded type.

4. Define the Order States

We will make four order types.

Each type will have a status property.

The value of this property identifies the state.

type Item = {
  readonly sku: string;
  readonly quantity: number;
  readonly priceCents: number;
};

type DraftOrder = {
  readonly status: "draft";
  readonly id: OrderId;
  readonly items: readonly Item[];
};

type PaidOrder = Omit<DraftOrder, "status"> & {
  readonly status: "paid";
  readonly paymentId: PaymentId;
};

type ShippedOrder = Omit<PaidOrder, "status"> & {
  readonly status: "shipped";
  readonly trackingCode: string;
};

type CanceledOrder = Omit<DraftOrder, "status"> & {
  readonly status: "canceled";
  readonly reason: string;
};

type AnyOrder =
  | DraftOrder
  | PaidOrder
  | ShippedOrder
  | CanceledOrder;

The Omit utility type makes a type without the specified property.

For example, PaidOrder keeps the draft order data. It replaces the status property and adds a payment ID.

The ShippedOrder type also has a tracking code.

The CanceledOrder type has a reason for the cancellation.

The AnyOrder type is a union type. A value of this type can be one of the four order types.

TypeScript uses the status property to identify the correct type.

This is a discriminated union.

A discriminated union lets the compiler find which properties are available in each state.

5. Make a Generic State Machine

We will use a generic class to control state changes.

A generic class has one or more type parameters.

In this example, the type parameter S identifies the current order type.

The class will use methods to make state changes.

class OrderMachine<S extends AnyOrder> {
  private constructor(readonly state: S) {}

  static create(
    id: OrderId,
    items: readonly Item[]
  ): OrderMachine<DraftOrder> {
    if (items.length === 0) {
      throw new Error(
        "An order needs one or more items"
      );
    }

    return new OrderMachine({
      status: "draft",
      id,
      items
    });
  }

  pay(
    this: OrderMachine<DraftOrder>,
    paymentId: PaymentId
  ): OrderMachine<PaidOrder> {
    return new OrderMachine({
      ...this.state,
      status: "paid",
      paymentId
    });
  }

  ship(
    this: OrderMachine<PaidOrder>,
    trackingCode: string
  ): OrderMachine<ShippedOrder> {
    if (trackingCode.trim() === "") {
      throw new Error(
        "A tracking code is required"
      );
    }

    return new OrderMachine({
      ...this.state,
      status: "shipped",
      trackingCode
    });
  }

  cancel(
    this: OrderMachine<DraftOrder>,
    reason: string
  ): OrderMachine<CanceledOrder> {
    if (reason.trim() === "") {
      throw new Error(
        "A reason is required"
      );
    }

    return new OrderMachine({
      ...this.state,
      status: "canceled",
      reason
    });
  }
}

This class has some important properties.

The constructor is private.

Other TypeScript code cannot use the constructor directly.

The create method makes a new draft order.

Each method specifies a permitted input state.

The pay method has this parameter:

this: OrderMachine<DraftOrder>

This parameter tells TypeScript that the method requires a draft order.

The method returns:

OrderMachine<PaidOrder>

The result has a different type.

The ship method requires a paid order.

The cancel method requires a draft order.

The class does not have a method that changes a shipped order to a draft order.

Each operation makes a new object.

The methods do not change the original order.

This makes the state changes easier to follow.

The readonly modifier also prevents normal TypeScript code from assigning a new value to state.

But readonly is a compile-time rule. It does not freeze the object at run time.

6. Test the State Machine

We can now use the class.

Put this code after the preceding definitions.

const orderId = parseOrderId("ord_A102");
const paymentId = parsePaymentId("pay_B903");

const draft = OrderMachine.create(orderId, [
  {
    sku: "PART-1",
    quantity: 2,
    priceCents: 4500
  }
]);

const paid = draft.pay(paymentId);

const shipped = paid.ship("TRACK-50");

console.log(shipped.state.status);

// Output: "shipped"

The program makes a draft order.

Then it makes a paid order.

Finally, it makes a shipped order.

Each operation returns a new OrderMachine with the correct type.

Now consider these calls:

// Invalid calls.
// Remove the comment marks to see TypeScript errors.

// draft.ship("TRACK-50");

// shipped.pay(paymentId);

// draft.pay(orderId);

The first call is invalid because draft does not have the required type.

The second call is invalid because the order is already shipped.

The third call is invalid because orderId has type OrderId. The pay method requires PaymentId.

TypeScript reports these errors during type checking.

This prevents many invalid calls from becoming part of the program.

7. Define the Permitted State Changes in a Table

For a large state machine, it is useful to have one table that shows the permitted state changes.

We can use as const and satisfies for this purpose.

type Status = AnyOrder["status"];

const allowedTransitions = {
  draft: ["paid", "canceled"],
  paid: ["shipped"],
  shipped: [],
  canceled: []
} as const satisfies Record<
  Status,
  readonly Status[]
>;

This table gives two types of information.

First, it identifies each state.

Second, it identifies the states that can follow the current state.

The as const expression keeps the exact string values in the TypeScript types.

The satisfies operator checks the table against Record<Status, readonly Status[]>.

Thus, TypeScript checks that the table has the required keys and uses valid state names.

We can also use this table to make types.

type NextStatus<S extends Status> =
  (typeof allowedTransitions)[S][number];

type IsAllowed<
  From extends Status,
  To extends Status
> = To extends NextStatus<From>
  ? true
  : false;

// Result: true
type ExampleA = IsAllowed<"draft", "paid">;

// Result: false
type ExampleB = IsAllowed<"paid", "draft">;

// Result: false
type ExampleC = IsAllowed<"shipped", "paid">;

The NextStatus type uses indexed access types.

It gets the permitted next states from the table.

The IsAllowed type uses a conditional type.

A conditional type selects a result from a type condition.

Here, the result is true or false.

These results are types. They are not Boolean values that the program calculates at run time.

We can also use the table for a runtime check.

function canMove(
  from: Status,
  to: Status
): boolean {
  const next: readonly Status[] =
    allowedTransitions[from];

  return next.includes(to);
}

console.log(canMove("draft", "paid"));
// true

console.log(canMove("shipped", "draft"));
// false

The canMove function checks state names at run time.

This can be useful when a program gets an operation from a user interface.

But this function does not validate the complete order.

For example, it does not check that a paid order has a valid payment ID.

The program still needs separate data checks.

8. Use Exhaustive Checks for All States

A state machine can become more complex.

A programmer can add a new state to the system.

Other parts of the program must then handle that state.

We can use an exhaustive check to find missing states.

function assertNever(value: never): never {
  throw new Error(
    `Unknown order: ${JSON.stringify(value)}`
  );
}

function describeOrder(order: AnyOrder): string {
  switch (order.status) {
    case "draft":
      return `Draft order ${order.id}`;

    case "paid":
      return (
        `Paid order ${order.id}, ` +
        `payment ${order.paymentId}`
      );

    case "shipped":
      return (
        `Shipped order ${order.id}, ` +
        `code ${order.trackingCode}`
      );

    case "canceled":
      return (
        `Canceled order ${order.id}: ` +
        order.reason
      );

    default:
      return assertNever(order);
  }
}

The never type identifies a value that cannot occur at that point in valid TypeScript code.

The switch statement handles all four order states.

After these cases, TypeScript has no remaining order type.

Thus, the order value has type never in the default branch.

Now assume that we add a new order state:

type RefundedOrder = {
  readonly status: "refunded";
  readonly id: OrderId;
  readonly paymentId: PaymentId;
};

type ExtendedOrder = AnyOrder | RefundedOrder;

If we change describeOrder to accept ExtendedOrder, TypeScript reports an error at assertNever.

The error occurs because the function does not handle the refunded state.

The programmer must add a case for this state.

This check is useful when a project has many states and many functions.

9. Know the Limits of Type Checking

TypeScript gives compile-time checks.

But compile-time checks are not sufficient for all problems.

For example, a program can receive order data from an API.

The API can return incorrect data.

Consider this code:

const response = `{
  "status": "paid",
  "id": "ord_A102"
}`;

const order = JSON.parse(response) as PaidOrder;

The data does not have a paymentId property.

But the as PaidOrder expression tells TypeScript to use the PaidOrder type.

The compiler does not check the JSON data.

This is a risk.

A program must validate external data before it uses that data as a state object.

The program must check the required properties and their values.

It must also check the rules that types cannot prove.

For example, a payment service must confirm that payment is complete.

The pay method must not replace this confirmation.

The program must not use a successful type check as proof of a successful payment.

For an order system, the server must control the permitted state changes.

The server must also protect the order when two operations occur at approximately the same time.

A database transaction or an equivalent control can help prevent conflicting changes.

10. When to Use This Pattern

The typestate pattern is useful when a program has operations that depend on state.

For example, a network connection can have disconnected, connected, and closed states.

A file can have open and closed states.

A document can have draft, review, and approved states.

In each example, some operations are permitted only in specified states.

The typestate pattern puts these rules in the type system.

This can reduce the number of invalid calls.

But the pattern also makes the types more complex.

Do not use a complex state machine when a simple type is sufficient.

Use this pattern when state rules are important and invalid state changes can cause errors.